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.
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.
Odpowiedzi:
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.
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.
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]]