Kiedy używać One Hot Encoding vs LabelEncoder vs DictVectorizor?

95

Od jakiegoś czasu buduję modele z danymi kategorialnymi, a kiedy w tej sytuacji zasadniczo używam funkcji LabelEncoder scikit-learn do transformacji tych danych przed zbudowaniem modelu.

Rozumiem różnicę między OHE, LabelEncodera DictVectorizorjeśli chodzi o to, co robią z danymi, ale to, co nie jest dla mnie jasne jest, kiedy można wybrać zatrudnić jedną technikę nad drugą.

Czy istnieją pewne algorytmy lub sytuacje, w których jeden ma zalety / wady w stosunku do innych?

anthr
źródło
2
W odniesieniu do odpowiedzi AN6U5 i tego stwierdzenia:> Nadal istnieją algorytmy, takie jak drzewa decyzyjne i losowe lasy, które mogą dobrze działać ze zmiennymi kategorialnymi, a LabelEncoder może być używany do przechowywania wartości przy użyciu mniejszej ilości miejsca na dysku. Czy użycie LabelEncoder nie przekształciłoby funkcji kategorialnej w funkcję numeryczną, powodując w ten sposób, że drzewo decyzyjne wykonuje podziały o pewnej wartości, co tak naprawdę nie ma sensu, ponieważ mapowanie jest arbitralne?
Nico
1
Nico, myślę, że to, co mówi AN6U5, dotyczy w szczególności drzew decyzyjnych, działa dobrze, ponieważ drzewo podzieliłoby się na psa, kota, mysz lub 1,2,3, a znaczenie „kot” kontra „2” nie jest ważne dla drzewo (pomyśl o tym, jak się dzieli). W przypadku czegoś takiego jak regresja logistyczna wartości są częścią równania, ponieważ pomnożono wartości wagi *, co może powodować problemy treningowe i problemy z wagą, biorąc pod uwagę, że pies: 1 i kot: 2 nie ma związku liczbowego 1 * 2 (chociaż nadal może działać z wystarczającą liczbą przykładów treningów i epok).
Doug F

Odpowiedzi:

124

W niektórych przypadkach użyteczne są LabelEncoder lub DictVectorizor, ale moim zdaniem są one dość ograniczone ze względu na porządek.

LabelEncoder może zamienić [pies, kot, pies, mysz, kot] w [1,2,1,3,2], ale wówczas narzucona porządek oznacza, że ​​średnia pies i mysz to kot. Nadal istnieją algorytmy, takie jak drzewa decyzyjne i losowe lasy, które mogą dobrze pracować ze zmiennymi kategorialnymi, a LabelEncoder może być używany do przechowywania wartości przy użyciu mniejszej ilości miejsca na dysku.

Zaletą kodowania na gorąco jest to, że wynik jest binarny, a nie porządkowy, a wszystko znajduje się w ortogonalnej przestrzeni wektorowej. Wadą jest to, że w przypadku dużej liczności przestrzeń funkcji może naprawdę szybko wybuchnąć i zaczynasz walczyć z przekleństwem wymiarowości. W takich przypadkach zwykle używam kodowania na gorąco, a następnie PCA w celu zmniejszenia wymiarów. Uważam, że rozsądną kombinację one-hot plus PCA rzadko można pokonać innymi schematami kodowania. PCA znajduje liniowe nakładanie się, więc naturalnie będzie dążyć do grupowania podobnych elementów w tę samą cechę.

AN6U5
źródło
1
Dziękuję bardzo - jest to bardzo pomocne i ma sens. Czy są jakieś inne schematy kodowania, których używasz dla konkretnych przypadków / krawędzi? Czy zdarzyło Ci się kiedykolwiek znaleźć sytuację, w której będziesz używać różnych schematów kodowania dla różnych funkcji?
anrr
20

Chociaż AN6U5 udzielił bardzo dobrej odpowiedzi, chciałem dodać kilka punktów na przyszłość. Rozważając kodowanie na gorąco (OHE) i kodowanie etykiet , musimy spróbować zrozumieć, jaki model próbujesz zbudować. Mianowicie dwie kategorie modeli, które rozważymy, to:

  1. Modele oparte na drzewach: Drzewa decyzyjne ze wzmocnieniem gradientowym i losowe lasy.
  2. Modele niepochodzące z drzewa : liniowe, kNN lub sieci neuronowe.

Zastanówmy się, kiedy zastosować OHE, a kiedy zastosować Kodowanie etykiet podczas budowania modeli opartych na drzewach.

Stosujemy BHP, gdy:

  1. Gdy wartości, które są blisko siebie w kodowaniu etykiety, odpowiadają wartościom docelowym, które nie są blisko (dane nieliniowe).
  2. Gdy funkcja jakościowa nie jest porządkowa (pies, kot, mysz).

Stosujemy kodowanie etykiet, gdy:

  1. Kategoryczny cechą jest porządkowa (Jr kg, Sr. kg, szkoła podstawowa, gimnazjum, itp).
  2. Kiedy możemy wymyślić koder etykiet, który przypisuje bliskie etykiety do podobnych kategorii : Prowadzi to do mniej rozlewów warkocza, a tym samym skraca czas wykonania.
  3. Gdy liczba cech jakościowych w zestawie danych jest ogromna: Jednorazowe kodowanie cechy jakościowej z ogromną liczbą wartości może prowadzić do (1) dużego zużycia pamięci i (2) w przypadku, gdy model nie używa cech niekategoryzowanych. Możesz zająć się pierwszym przypadkiem, jeśli zastosujesz rzadkie matryce. Drugi przypadek może wystąpić, jeśli zbudujesz drzewo przy użyciu tylko podzbioru funkcji. Na przykład, jeśli masz 9 funkcji liczbowych i 1 kategorialny ze 100 unikatowymi wartościami, a jedną kategorię zakodowałeś na gorąco, otrzymasz 109 cech. Jeśli drzewo jest zbudowane tylko z podzbioru cech, początkowo 9 cech numerycznych będzie rzadko używanych. W takim przypadku możesz zwiększyć parametr kontrolujący rozmiar tego podzbioru. W xgboost nazywa się to colsample_bytree, w Sklearn's Random Forest max_features.

Jeśli chcesz kontynuować BHP, jak sugerował @ AN6U5, możesz połączyć PCA z OHE.

Zastanówmy się, kiedy zastosować OHE i kodowanie etykiet podczas budowania modeli nieopartych na drzewach.

Aby zastosować kodowanie etykiet, zależność między cechą a celem musi być liniowa, aby można było efektywnie korzystać z kodowania etykiet.

Podobnie w przypadku, gdy zależność jest nieliniowa, możesz użyć OHE do tego samego.

Uwaga: Niektóre wyjaśnienia zostały przywołane w Jak wygrać konkurs Data Science z Coursera.

Pushkaraj Joshi
źródło
Bardzo intuicyjne wyjaśnienie. Czy nie powinny to być „rozszczepienia”, a nie „rozlewy”?
dzieciou
0

LabelEncoder jest dla danych porządkowych, a OHE dla danych nominalnych.

Vochicong
źródło