Mam problem z klasyfikacją systemów uczących się z 80% zmiennych kategorialnych. Czy muszę używać jednego kodowania na gorąco, jeśli chcę użyć jakiegoś klasyfikatora do klasyfikacji? Czy mogę przekazać dane do klasyfikatora bez kodowania?
Próbuję wykonać następujące czynności w celu wyboru funkcji:
Przeczytałem plik pociągu:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
Zmieniam typ cech kategorialnych na „kategorię”:
non_categorial_features = ['orig_destination_distance', 'srch_adults_cnt', 'srch_children_cnt', 'srch_rm_cnt', 'cnt'] for categorical_feature in list(train_small.columns): if categorical_feature not in non_categorial_features: train_small[categorical_feature] = train_small[categorical_feature].astype('category')
Używam jednego kodowania na gorąco:
train_small_with_dummies = pd.get_dummies(train_small, sparse=True)
Problem w tym, że trzecia część często się zacina, chociaż używam mocnej maszyny.
Tak więc bez jednego kodowania na gorąco nie mogę dokonać żadnego wyboru funkcji, aby określić znaczenie funkcji.
Co polecasz?
drop_first=True
zget_dummies
eliminuje potrzebę oddzielnego upuszczania oryginalnej kolumnyZnacznie łatwiejsze w użyciu Pandy do podstawowego kodowania na gorąco. Jeśli szukasz więcej opcji, możesz użyć
scikit-learn
.Aby uzyskać podstawowe kodowanie na gorąco za pomocą Pandas , po prostu przekazujesz ramkę danych do funkcji get_dummies .
Na przykład, jeśli mam ramkę danych o nazwie imdb_movies :
... i chcę zakodować na gorąco kolumnę Rated, po prostu robię to:
Zwraca to nową
dataframe
z kolumną dla każdego istniejącego „ poziomu ” oceny, wraz z 1 lub 0 określającymi obecność tej oceny dla danej obserwacji.Zwykle chcemy, aby było to częścią oryginału
dataframe
. W tym przypadku, po prostu dołączamy naszą nową fałszywą zakodowaną ramkę do oryginalnej ramki za pomocą „ wiązania kolumn ” .Możemy wiązać kolumny za pomocą funkcji konkatacji Pandas :
Możemy teraz przeprowadzić analizę w pełni
dataframe
.PROSTA FUNKCJA NARZĘDZIA
Poleciłbym zrobić sobie funkcję narzędziową, aby zrobić to szybko:
Użycie :
Wynik :
Ponadto, zgodnie z komentarzem @pmalbu, jeśli chcesz, aby funkcja usuwała oryginalny kod feature_to_encode, użyj tej wersji:
Możesz kodować wiele funkcji jednocześnie w następujący sposób:
źródło
Możesz to zrobić za pomocą
numpy.eye
i używając mechanizmu wyboru elementów tablicy:Zwracana wartość
indices_to_one_hot(nb_classes, data)
to terazJest po
.reshape(-1)
to, aby upewnić się, że masz odpowiedni format etykiet (możesz również mieć[[2], [3], [4], [0]]
).źródło
Po pierwsze, najłatwiejszy sposób na jedno gorące kodowanie: użyj Sklearn.
http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
Po drugie, nie sądzę, aby używanie pand do jednego gorącego kodowania było takie proste (choć niepotwierdzone)
Tworzenie fikcyjnych zmiennych w pandach dla Pythona
Wreszcie, czy konieczne jest jedno gorące kodowanie? Jedno kodowanie na gorąco wykładniczo zwiększa liczbę funkcji, drastycznie zwiększając czas działania dowolnego klasyfikatora lub czegokolwiek innego, co zamierzasz uruchomić. Zwłaszcza, gdy każda cecha kategoryczna ma wiele poziomów. Zamiast tego możesz wykonać fałszywe kodowanie.
Używanie kodowania fikcyjnego zwykle działa dobrze, przy znacznie krótszym czasie wykonywania i złożoności. Mądry profesor powiedział mi kiedyś: „Mniej znaczy więcej”.
Oto kod mojej niestandardowej funkcji kodowania, jeśli chcesz.
EDYCJA: Porównanie, aby było jaśniejsze:
Kodowanie na gorąco: przekonwertuj n poziomów na n-1 kolumn.
Możesz zobaczyć, jak eksploduje to twoją pamięć, jeśli masz wiele różnych typów (lub poziomów) w swojej funkcji kategorialnej. Pamiętaj, że to tylko JEDNA kolumna.
Kodowanie manekina:
Zamiast tego przekonwertuj na reprezentacje liczbowe. Znacznie oszczędza miejsce na funkcje, kosztem odrobiny dokładności.
źródło
mouse > cat > dog
tak nie jest.get_dummies
jest najprostszym sposobem przeniesienia zmiennych kategorialnych do danych przyjaznych modelowi z mojego doświadczenia (aczkolwiek bardzo ograniczonego)Jedno gorące kodowanie z pandami jest bardzo łatwe:
EDYTOWAĆ:
Inny sposób na one_hot przy użyciu sklearn
LabelBinarizer
:źródło
Możesz użyć funkcji numpy.eye.
Wynik
źródło
pandas as ma wbudowaną funkcję „get_dummies”, aby uzyskać jedno gorące kodowanie tej konkretnej kolumny / kolumn.
jednowierszowy kod dla jednego gorącego kodowania:
źródło
Oto rozwiązanie wykorzystujące
DictVectorizer
iDataFrame.to_dict('records')
metodę Pandy .źródło
Kodowanie typu one-hot wymaga nieco więcej niż konwersja wartości na zmienne wskaźnikowe. Zazwyczaj proces ML wymaga kilkukrotnego zastosowania tego kodowania do walidacji lub testowania zestawów danych i zastosowania zbudowanego modelu do danych obserwowanych w czasie rzeczywistym. Należy zachować odwzorowanie (transformację), które zostało użyte do skonstruowania modelu. Dobrym rozwiązaniem byłoby użycie
DictVectorizer
lubLabelEncoder
(po którym następujeget_dummies
. Oto funkcja, której możesz użyć:Działa to na pandas dataframe i dla każdej kolumny tworzonej ramki danych i zwraca odwzorowanie. Więc nazwałbyś to tak:
Następnie na danych testowych wywołanie jest realizowane przez przekazanie słownika zwróconego z treningu:
Równoważną metodą jest użycie
DictVectorizer
. Powiązany post na ten sam temat znajduje się na moim blogu. Wspominam o tym tutaj, ponieważ zapewnia to pewne uzasadnienie tego podejścia w stosunku do zwykłego używania postu get_dummies (ujawnienie: to jest mój własny blog).źródło
Możesz przekazać dane do klasyfikatora catboost bez kodowania. Catboost sam obsługuje zmienne kategorialne, wykonując jedno-gorące i docelowe rozszerzające się kodowanie średniej.
źródło
Możesz również wykonać następujące czynności. Uwaga dla poniższych, których nie musisz używać
pd.concat
.Możesz również zmienić jawne kolumny na kategoryczne. Na przykład tutaj zmieniam
Color
iGroup
źródło
Wiem, że spóźniłem się na tę imprezę, ale najprostszym sposobem na zakodowanie na gorąco ramki danych w sposób zautomatyzowany jest użycie tej funkcji:
źródło
Użyłem tego w moim modelu akustycznym: prawdopodobnie to pomaga w twoim modelu.
źródło
Aby dodać do innych pytań, pozwól mi podać, jak to zrobiłem z funkcją Python 2.0 przy użyciu Numpy:
Linia
n_values = np.max(y_) + 1
może być zakodowana na stałe, abyś używał odpowiedniej liczby neuronów na przykład w przypadku użycia mini-partii.Projekt demonstracyjny / samouczek, w którym wykorzystano tę funkcję: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition
źródło
To działa dla mnie:
Wynik:
źródło
Może i powinno być takie proste, jak:
Stosowanie :
źródło
Rozszerzanie odpowiedzi @Martin Thoma
źródło
Krótka odpowiedź
Oto funkcja do kodowania na gorąco bez używania numpy, pandy lub innych pakietów. Pobiera listę liczb całkowitych, wartości logicznych lub łańcuchów (i być może także innych typów).
Przykład:
Długa (e) odpowiedź
Wiem, że jest już wiele odpowiedzi na to pytanie, ale zauważyłem dwie rzeczy. Po pierwsze, większość odpowiedzi używa pakietów takich jak numpy i / lub pandy. I to jest dobra rzecz. Jeśli piszesz kod produkcyjny, prawdopodobnie powinieneś używać solidnych, szybkich algorytmów, takich jak te zawarte w pakietach numpy / pandas. Ale ze względu na edukację myślę, że ktoś powinien udzielić odpowiedzi, która ma przejrzysty algorytm, a nie tylko implementację cudzego algorytmu. Po drugie, zauważyłem, że wiele odpowiedzi nie zapewnia solidnej implementacji kodowania typu one-hot, ponieważ nie spełniają one jednego z poniższych wymagań. Poniżej znajdują się niektóre wymagania (tak jak je widzę) dotyczące użytecznej, dokładnej i niezawodnej funkcji kodowania na gorąco:
Funkcja kodowania typu one-hot musi:
Przetestowałem wiele odpowiedzi na to pytanie i większość z nich nie spełnia jednego z powyższych wymagań.
źródło
Spróbuj tego:
df_encoded.head ()
Wynikowa ramka danych
df_train_encoded
jest taka sama jak oryginał, ale funkcje kategorialne są teraz zastępowane ich wersjami zakodowanymi na gorąco.Więcej informacji
category_encoders
tutaj .źródło
Tutaj próbowałem z tym podejściem:
źródło