Najlepsze praktyki kodowania funkcji jakościowych dla drzew decyzyjnych?

13

Podczas kodowania cech kategorycznych dla regresji liniowej obowiązuje zasada: liczba manekinów powinna być o jeden mniejsza niż całkowita liczba poziomów (aby uniknąć kolinearności).

Czy istnieje podobna zasada dla drzew decyzyjnych (spakowane, wzmocnione)? Pytam o to, ponieważ standardową praktyką w Pythonie wydaje się być rozszerzanie npoziomów na nmanekiny (sklearny OneHotEncoderlub Pandy pd.get_dummies), co wydaje mi się nieoptymalne.

Co sugerujesz jako najlepsze praktyki kodowania funkcji jakościowych dla drzew decyzyjnych?

Siergiej Bushmanow
źródło

Odpowiedzi:

12

Wygląda na to, że rozumiesz, że możesz mieć npoziomy, w przeciwieństwie do n-1, ponieważ w przeciwieństwie do regresji liniowej nie musisz martwić się o idealną kolinearność.

(Podchodzę do tego z perspektywy R., ale zakładam, że tak samo jest w Pythonie.) To zależy od kilku rzeczy, takich jak 1) jakiego pakietu używasz i 2) ile poziomów czynników masz.

1) Jeśli używasz randomForestpakietu R , to jeśli masz <33 poziomy współczynników, możesz iść dalej i pozostawić je w jednej funkcji, jeśli chcesz. Jest tak, ponieważ w losowej implementacji lasu R sprawdzi, które poziomy czynników powinny znajdować się po jednej stronie podziału, a które po drugiej (np. 5 z twoich poziomów może być zgrupowanych po lewej stronie, a 7 może być zgrupowanych razem po prawej). Jeśli podzielisz funkcję kategorialną na nmanekiny, algorytm nie będzie miał do dyspozycji tej opcji.

Oczywiście, jeśli konkretny pakiet, którego używasz, nie obsługuje funkcji jakościowych, musisz po prostu utworzyć nzmienne zastępcze.

2) Jak wspomniałem powyżej, losowa implementacja lasu R może obsłużyć tylko 32 poziomy czynników - jeśli masz ich więcej, musisz podzielić swoje czynniki na mniejsze podzbiory lub utworzyć zmienną zastępczą dla każdego poziomu.

Tchotchke
źródło
1
Dzięki! Czy dostaję cię poprawnie: chyba że modeluję w R, gdzie cechy randomForestjakościowe są kodowane automatycznie, powinienem pójść z nmanekinami, ponieważ kolinearność nie jest problemem dla RF?
Sergey Bushmanov,
3
Posiadanie ponad 32-poziomowych kategorii kodowanych binarnie będzie miało nieco inne zachowanie w drzewie, ponieważ RF po prostu wybierze spośród tych kolumn binarnych, zamiast wybierać pojedynczą kolumnę współczynnika z wieloma poziomami. Ta subtelna różnica oznacza, że ​​podział na kolumny binarne będzie mniej pouczający w porównaniu do podziału na kolumnie czynnikowej, ponieważ istnieje tylko jeden wybór (0/1) w porównaniu z (1 / {2,3}, {2,1} / 3 ) itp.
Sycorax mówi Przywróć Monikę
@ user777 To nie jest problem z ponad 32 zmiennymi. Problem polega na tym, że nie ma „zgrupowanych” zmiennych kategorii w Pythonie sklearn... Praktycznie jest dowód (doświadczenie praktyczne, badania itp.), Że „zmumifikowane” zmienne będą działały gorzej niż „zgrupowane” zmienne kategoryczne [w R]
Sergey Bushmanov,
1
Teoretycznie możemy oczekiwać, że niezgrupowane będą działać nieco gorzej, ponieważ dajesz modelowi mniejszą elastyczność. W przypadku pogrupowanym, gdyby naprawdę lepiej traktować tę funkcję jako nie pogrupowaną, wówczas model byłby w stanie to zrobić (umieszczając jedną grupę po jednej stronie, a następnie całą resztę po drugiej). Jednak w praktyce byłbym zaskoczony, gdyby istniała duża różnica (szczególnie w przypadku RF, gdzie tworzysz tak wiele drzew)
Tchotchke
2
Uważam, że implementacja randomForest używa funkcji o wielu poziomach czynników (> 15) tak wolno, jak wspomniano, ale także w celu uzyskania miernej wydajności modelu. Myślę, że bardzo duża liczba możliwych podziałów zmniejszy zamierzoną dekorelację drzew w zespole. extraTrees i Rborist wypróbowują tylko podpróbkę katagorycznych podziałów w każdym węźle. To może pomóc w dekorelacji i na pewno przyspieszyć. W ten sposób możliwy jest szereg rozwiązań między „losową próbą wypróbowania dowolnego podziału” a „zmienną manekina sklern tylko wypróbowania podziału 1 na resztę”. Przydatne mogą być również różne skupienia wielu poziomów na mniejszych poziomach.
Soren Havelund Welling
4

Istnieje inne podejście do radzenia sobie ze zmiennymi kategorialnymi, które nazywa się kodowaniem docelowym / uderzeniowym.

W tym schemacie chodzi o zakodowanie obiektu za pomocą pojedynczej kolumny zmiennoprzecinkowej, w której wartość jest średnią zmiennej docelowej we wszystkich wierszach, które dzielą tę kategorię. Jest to szczególnie przydatne w przypadku modeli opartych na drzewach, ponieważ narzuca relację rzędu w obrębie cechy (tj. Wartości po prawej stronie kategorii mają wyższą średnią odpowiedź niż wartości po lewej) i ułatwia podział przestrzeni predyktorów.

Oto ładne wyjaśnienie tego tematu:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

A oto link do artykułu, w którym pierwotnie zaproponowano kodowanie: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Jest jeszcze kilka szczegółów, aby uniknąć oszacowania średniej w kategoriach o niskiej liczbie, a także istnieje inny model, CatBoost, proponujący rozwiązanie promowania wprowadzonego przez to kodowanie, ale z mojego doświadczenia jest to prosty i bardzo użyteczny sposób kodowania zmiennych kategorialnych o wysokiej liczności .

Ludecan
źródło