Kodowanie typu hot-man vs dummy w Scikit-learn

50

Istnieją dwa różne sposoby kodowania zmiennych jakościowych. Powiedzmy, że jedna zmienna kategorialna ma n wartości. Kodowanie na gorąco konwertuje go na n zmiennych, podczas gdy kodowanie zastępcze konwertuje go na zmienne n-1 . Jeśli mamy k zmiennych kategorialnych, z których każda ma n wartości. Jedno kodowanie na gorąco kończy się na zmiennych kn , podczas gdy kodowanie zastępcze kończy się na zmiennych kn-k .

Słyszę, że w przypadku kodowania „na gorąco” przechwytywanie może prowadzić do problemu kolinearności, który powoduje, że model nie brzmi. Ktoś nazywa to „ sztuczną zmienną pułapką ”.

Moje pytania:

  1. Model regresji liniowej Scikit-learn pozwala użytkownikom wyłączyć przechwytywanie. Czyli w przypadku kodowania „na gorąco” należy zawsze ustawiać fit_intercept = False? W przypadku fikcyjnego kodowania fit_intercept powinien zawsze mieć wartość True? Na stronie nie widzę żadnego „ostrzeżenia”.

  2. Skoro jedno-gorące kodowanie generuje więcej zmiennych, czy ma większy stopień swobody niż kodowanie pozorowane?

Munichong
źródło

Odpowiedzi:

35

Model regresji liniowej Scikit-learn pozwala użytkownikom wyłączyć przechwytywanie. Czyli w przypadku kodowania „na gorąco” należy zawsze ustawiać fit_intercept = False? W przypadku fikcyjnego kodowania fit_intercept powinien zawsze mieć wartość True? Na stronie nie widzę żadnego „ostrzeżenia”.

W przypadku nieregularnego modelu liniowego z kodowaniem „na gorąco”, tak, musisz ustawić intercept, aby był fałszywy, w przeciwnym razie poniesiesz idealną kolinearność. sklearnpozwala również na karę skurczu grzbietu, w takim przypadku nie jest to konieczne, a tak naprawdę należy uwzględnić zarówno przechwycenie, jak i wszystkie poziomy. W przypadku fikcyjnego kodowania należy dołączyć punkt przecięcia, chyba że ujednolicono wszystkie zmienne, w którym to przypadku punkt przecięcia wynosi zero.

Skoro jedno-gorące kodowanie generuje więcej zmiennych, czy ma większy stopień swobody niż kodowanie pozorowane?

Punkt przecięcia jest dodatkowym stopniem swobody, więc w dobrze określonym modelu wszystko się równa.

Po drugie, co, jeśli istnieją k zmiennych kategorialnych? k zmiennych jest usuwanych w kodowaniu fikcyjnym. Czy stopień swobody jest nadal taki sam?

Nie można dopasować modelu, w którym zastosowano wszystkie poziomy obu zmiennych jakościowych, przechwytując lub nie. Ponieważ, gdy tylko zakodujesz na gorąco wszystkie poziomy w jednej zmiennej w modelu, powiedzmy za pomocą zmiennych binarnych , wtedy masz liniową kombinację predyktorów równą wektorowi stałemux1,x2,,xn

x1+x2++xn=1

Jeśli następnie spróbujesz wprowadzić do modelu wszystkie poziomy innego kategorycznego , uzyskasz wyraźną kombinację liniową równą stałemu wektorowix

x1+x2++xk=1

i tak stworzyłeś zależność liniową

x1+x2+xnx1x2xk=0

Więc musi opuścić poziom w drugiej zmiennej i linie wszystko poprawnie.

Powiedzmy, że mam 3 zmienne kategoryczne, z których każda ma 4 poziomy. W fikcyjnym kodowaniu 3 * 4-3 = 9 zmiennych jest budowanych z jednym przechwytywaniem. W kodowaniu pojedynczym 3 * 4 = 12 zmiennych jest budowanych bez przechwytywania. Mam rację?

Druga rzecz tak naprawdę nie działa. Utworzona macierz projektu będzie pojedyncza. Musisz usunąć trzy kolumny, po jednej z każdego z trzech różnych kodowań kategorycznych, aby odzyskać nietypowość projektu.3×4=12

Matthew Drury
źródło
Dzięki. Po drugie, co, jeśli istnieją k zmiennych kategorialnych? k zmiennych jest usuwanych w kodowaniu fikcyjnym. Czy stopień swobody jest nadal taki sam?
Monachiumong
@ChongWang Zredagowałem odpowiedź na Twój komentarz do mojej odpowiedzi.
Matthew Drury,
Przepraszam, trochę się tu zagubiłem. Powiedzmy, że mam 3 zmienne kategoryczne, z których każda ma 4 poziomy. W fikcyjnym kodowaniu 3 * 4-3 = 9 zmiennych jest budowanych z jednym przechwytywaniem. W kodowaniu pojedynczym 3 * 4 = 12 zmiennych jest budowanych bez przechwytywania. Mam rację? Więc tutaj DF kodowania fikcyjnego wynosi 9-1, podczas gdy DF kodowania jednokierunkowego wynosi 12. Czy mam rację?
Monachiumong
@ChongWang Edytowane ponownie.
Matthew Drury
@MatthewDrury Mam ten sam problem z linear_model w sklearn. Po fikcyjnym kodowaniu Drzewo decyzyjne i KNN działają dobrze, ale regresja liniowa spada w osobliwości. Rozumiem z twojej odpowiedzi, że powinienem usunąć „poziom z drugiej zmiennej”, ale nie wiem, co to właściwie znaczy? Na przykład mam 3 funkcje numeryczne i 3 kategoryczne (producent, model i typ paliwa). Model jest oczywiście zależny od producenta, ponieważ jeden producent może mieć n modeli. Jak więc postępować w tego rodzaju typowym scenariuszu, jeśli chcę użyć regresji liniowej?
Harvey,