Kodowanie zmiennych kategorialnych przy użyciu oszacowania prawdopodobieństwa

22

Próbuję zrozumieć, w jaki sposób mogę kodować zmienne kategorialne za pomocą oszacowania prawdopodobieństwa, ale jak dotąd nie odniosłem sukcesu.

Wszelkie sugestie będą mile widziane.

mały karzeł
źródło
Co robić, gdy przewidujemy czas, gdy nie mamy etykiety docelowej?
Ranjeet Singh,

Odpowiedzi:

24

Uczyłem się również tego tematu i oto, co znalazłem:

  • Ten rodzaj kodowania jest nazywany kodowanie prawdopodobieństwo , wpływ kodowania lub cel kodowania

  • Pomysł polega na kodowaniu zmiennej jakościowej za pomocą zmiennej docelowej (ciągłej lub jakościowej w zależności od zadania). Na przykład, jeśli masz zadanie regresji, możesz zakodować zmienną kategorialną za pomocą średniej celu. Dla każdej kategorii obliczasz odpowiednią średnią celu (wśród tej kategorii) i zamieniasz wartość kategorii na tę średnią.

  • Jeśli masz zadanie klasyfikacji, obliczasz względną częstotliwość celu w odniesieniu do każdej wartości kategorii.

  • Z matematycznego punktu widzenia to kodowanie oznacza prawdopodobieństwo twojego celu, zależne od wartości każdej kategorii.

  • Jeśli zrobisz to w prosty sposób, jak opisałem powyżej, prawdopodobnie uzyskasz tendencyjne oszacowanie. Dlatego w społeczności Kaggle używają zwykle 2 poziomów weryfikacji krzyżowej. Przeczytaj ten komentarz raddar tutaj . Odpowiedni notatnik jest tutaj .

Cytat:

Przyjmuje średnią wartość y. Ale nie jest to zwykły sposób, ale w krzyżowej walidacji w ramach krzyżowej walidacji;

Załóżmy, że mamy 20-krotną weryfikację krzyżową. potrzebujemy w jakiś sposób obliczyć średnią wartość funkcji dla # 1-krotności przy użyciu informacji z # 2- # 20-krotności.

Więc bierzesz # 2- # 20 foldów, tworzysz w nim kolejny zestaw weryfikacji krzyżowej (zrobiłem 10-krotnie). obliczyć średnie dla każdego opuszczenia jednego foldera (w końcu dostajesz 10 środków). Uśredniasz te 10 średnich i zastosujesz ten wektor do podstawowego zestawu sprawdzania poprawności nr 1. Powtórz to dla pozostałych 19 foldów.

Trudno to wytłumaczyć, trudno zrozumieć i opanować :) Ale jeśli zrobione poprawnie, może przynieść wiele korzyści :)

  • Kolejna implementacja tego kodowania jest tutaj .

  • W bibliotece vtreat mają implementację kodowania wpływu. Zobacz ten post .

  • W bibliotece CatBoost mają wiele opcji kodowania zmiennych jakościowych , w tym kodowania docelowego.

  • W sklearn nie ma jeszcze takiego kodowania.

Galina Alperowicz
źródło
1
Istnieje kodowanie docelowe w koderach kategorii Sklearn-contrib
Josh
Jak zaimplementowałbyś interakcję funkcji w przypadku użycia kodowania docelowego? Na przykład kodujesz F1 i F2 w kodowaniu docelowym. Czy pomnożyłbyś po prostu zakodowane wartości F1 * F2?
Michael Larionov,
Jeśli obliczysz średnią dla każdego fałdu LOO, to weźmiesz średnią z nich, jest dokładnie tak samo, jak bierzesz średnią z 2 - 20 z 20, nie rozumiem, dlaczego można to uznać za CV. Nie rozumiem też, co rozumie przez „wektor”, gdy uśrednia te 10.
SiXUlm
Późny komentarz; kodowanie docelowe w koderach kategorii jest prostym kodowaniem średnim; nie wykonuje regularyzacji fałdów w fałdach opisanych przez raddar.
Dan Scally
7

Kodowanie docelowe jest teraz dostępne w sklearn poprzez pakiet category_encoders.

Koder docelowy

klasa category_encoders.target_encoder.TargetEncoder (verbose = 0, cols = None, drop_invariant = False, return_df = True, impute_missing = True, handle_unknown = 'impute', min_samples_leaf = 1, wygładzenie = 1)

Kod docelowy dla funkcji jakościowych. Oparty na podejściu jednego z nich.

Jak zauważył Josh w powyższym komentarzu.

jeffhale
źródło
1

Kodowanie prawdopodobieństwa jest nadal niedostępne w scikit learn. Możesz to zrobić, tworząc słownik, a następnie wykonując funkcję zamiany.

dict1 = {'cate1':1,'cate2':1,'cate3':2,'cate4':2}
for i in df.shape[0]:
    df.iloc[i] = dict1[df.iloc[i]] 
chrisckwong821
źródło