Jak wykonać jedno-gorące kodowanie dla zmiennych wielu kategorii

Węzeł źródłowy: 841101

W tym artykule dowiemy się, w jaki sposób możemy obsługiwać zmienne wielokategoryczne przy użyciu techniki inżynierii cech One Hot Encoding.

Zanim jednak przejdziemy dalej, przeprowadźmy krótką dyskusję na temat inżynierii funkcji i kodowania One Hot.

Inżynieria funkcji

Zatem inżynieria cech to proces wydobywania funkcji z surowych danych przy użyciu wiedzy dziedzinowej problemu. Funkcje te można wykorzystać do poprawy wydajności algorytmów uczenia maszynowego, a jeśli wydajność wzrośnie, zapewni to najlepszą dokładność. Można również powiedzieć, że inżynieria funkcji to to samo, co stosowane uczenie maszynowe. Inżynieria cech to najważniejsza sztuka uczenia maszynowego, która tworzy ogromną różnicę między dobrym modelem a złym modelem. Jest to trzeci krok w cyklu życia każdego projektu związanego z analizą danych.

Koncepcja przejrzystości modeli uczenia maszynowego jest rzeczą skomplikowaną, ponieważ różne modele często wymagają różnych podejść do różnych rodzajów danych. Jak na przykład:-

  • Dane ciągłe
  • Cechy kategoryczne
  • Brakujące wartości
  • Normalizacja
  • Daty i czas

Ale tutaj omówimy tylko cechy kategoryczne. Cechy kategoryczne to te cechy, w których typ danych jest typem obiektu. Wartość punktu danych w dowolnej cesze kategorycznej nie jest w formie liczbowej, lecz w formie obiektowej.

Istnieje wiele technik postępowania ze zmiennymi kategorycznymi, niektóre z nich to:

  • Kodowanie etykietowe lub kodowanie porządkowe
  • Jedno gorące kodowanie
  • Kodowanie fikcyjne
  • Kodowanie efektów
  • Kodowanie binarne
  • Kodowanie bazylejskie
  • Kodowanie skrótu
  • Kodowanie docelowe

Zatem tutaj zajmujemy się funkcjami kategorycznymi za pomocą One Hot Encoding, dlatego przede wszystkim omówimy One Hot Encoding.

Jedno gorące kodowanie

Wiemy, że zmienne kategoryczne zawierają wartości etykiet, a nie wartości liczbowe. Liczba możliwych wartości jest często ograniczona do ustalonego zestawu. Zmienne kategoryczne są często nazywane nominalnymi. Wiele algorytmów uczenia maszynowego nie może bezpośrednio operować na danych etykiet. Wymagają, aby wszystkie zmienne wejściowe i zmienne wyjściowe były numeryczne.

Oznacza to, że dane kategoryczne należy przekształcić do postaci liczbowej. Jeśli zmienna kategoryczna jest zmienną wyjściową, możesz także chcieć przekonwertować przewidywania modelu z powrotem na postać kategorialną, aby je przedstawić lub wykorzystać w jakiejś aplikacji.

na przykład Dane dotyczące płci mają formę 'męski' i 'Kobieta'.

Jeśli jednak zastosujemy kodowanie typu one-hot, wówczas kodowanie i umożliwienie modelowi przyjęcia naturalnego porządku między kategoriami może skutkować słabą wydajnością lub nieoczekiwanymi wynikami.

Do reprezentacji liczb całkowitych można zastosować kodowanie One-Hot. W tym miejscu zmienna zakodowana w postaci liczby całkowitej jest usuwana i dodawana jest nowa zmienna binarna dla każdej unikalnej wartości całkowitej.

Na przykład kodujemy zmienną kolorów,

Kolor czerwony  Niebieski kolor
0 1
1 0
0 1

Teraz zaczniemy naszą podróż. W pierwszym kroku pobieramy zbiór danych umożliwiający przewidywanie cen domów.

Dataset

Tutaj użyjemy zbioru danych house_price, który jest używany do przewidywania ceny domu w zależności od wielkości obszaru.

Jeśli chcesz pobrać zbiór danych prognoz cen domów, kliknij tutaj.

Importowanie modułów

Teraz musimy zaimportować ważne moduły z Pythona, które będą używane do kodowania one-hot

# importowanie pand import pand jako pd # importowanie numpy import numpy jako np # importowanie OneHotEncoder z sklearn.preprocessing import OneHotEncoder()

Tutaj używamy pand, które są używane do analizy danych, NumPyused dla tablic n-wymiarowych, a ze sklearn użyjemy jednej ważnej klasy One Hot Encoder do kodowania kategorycznego.

Teraz musimy odczytać te dane za pomocą Pythona.

Czytanie zbioru danych

Ogólnie rzecz biorąc, zbiór danych ma postać CSV, a zbiór danych, którego używamy, jest również w formie CSV. Do odczytu pliku CSV użyjemy funkcji pandy read_csv(). zobacz poniżej:

# odczyt zbioru danych df = pd.read_csv('house_price.csv') df.head()

wyjście:-

Musimy jednak używać zmiennych kategorycznych tylko dla jednego gorącego kodera i będziemy próbować wyjaśniać tylko za pomocą zmiennych kategorycznych, aby ułatwić zrozumienie.

aby oddzielić zmienne kategoryczne od danych, musimy sprawdzić, ile cech ma wartości kategoryczne.

Sprawdzanie wartości kategorycznych

Do sprawdzania wartości używamy funkcji pandasselect_dtypes, która służy do wybierania typów danych zmiennej.

# sprawdzanie funkcji cat = df.select_dtypes(include='O').keys() # wyświetlanie zmiennych cat

wyjście:-

 

Teraz musimy usunąć te kolumny liczbowe ze zbioru danych i użyjemy tej zmiennej kategorycznej do naszego użytku. Do stosowania kodowania one-hot używamy tylko 3-4 kolumn kategorialnych ze zbioru danych.

Tworzenie nowej ramki danych

Teraz, aby użyć zmiennych kategorycznych, utworzymy nową ramkę danych wybranych kolumn kategorycznych.

# tworzenie nowych df # ustawianie kolumn, których używamy new_df = pd.read_csv('house_price.csv',usecols=['Sąsiedztwo','Zewnętrzne 1.”, „Zewnętrzne 2']) nowy_df.head()

wyjście:-

Teraz musimy dowiedzieć się, ile unikalnych kategorii występuje w każdej kolumnie kategorycznej.

Znajdowanie unikalnych wartości

Do znalezienia unikalnych wartości użyjemy funkcji pandas Unique().

# unikalne wartości w każdej kolumnie dla x w new_df.columns: #drukowanie unikalnych wartości print(x ,':', len(new_df[x].unique()))

wyjście:-

Okolica : 25
Zewnętrzne 1.: 15
Zewnętrzne 2.: 16

Teraz przejdziemy do naszej techniki polegającej na zastosowaniu kodowania one-hot na zmiennych wielokategorycznych.

Technika dla zmiennych wielokategorycznych

Technika polega na tym, że ograniczymy jednokrotne kodowanie do 10 najczęstszych etykiet zmiennej. Oznacza to, że utworzylibyśmy jedną zmienną binarną tylko dla każdej z 10 najczęściej występujących etykiet, jest to równoznaczne z zgrupowaniem wszystkich pozostałych etykiet w nowej kategorii, która w tym przypadku zostanie usunięta. Zatem 10 nowych zmiennych fikcyjnych wskazuje, czy występuje jedna z 10 najczęściej występujących etykiet 1 albo nie wtedy 0 dla konkretnej obserwacji.

Najczęstsze zmienne

Tutaj wybierzemy 20 najczęściej występujących zmiennych.

Załóżmy, że bierzemy jedną zmienną kategoryczną Sąsiedztwo.

# znalezienie 20 najlepszych kategorii new_df.Neighborhood.value_counts().sort_values(ascending=False).head(20)

wydajność:

Kiedy zobaczysz na tym obrazie wyjściowym, zauważysz, że Nazwy etykieta powtarza się 225 razy w kolumnach Sąsiedztwo, a gdy idziemy w dół, liczba ta maleje.

Wzięliśmy więc 10 najlepszych wyników z góry i przekonwertowaliśmy te 10 najlepszych wyników na kodowanie typu one-hot, a lewe etykiety zamieniły się na zero.

wyjście:-

 

Lista najczęstszych zmiennych kategorycznych

# utwórz listę z 10 najważniejszymi zmiennymi top_10 = [x dla x w new_df.Neighborhood.value_counts().sort_values(rosnąco=False).head(10).index] top_10

wyjście:-

['Nazwy',
„CollgCr”,
'Stare Miasto',
„Edwardsa”,
„Somerst”,
„Gilberta”,
„NridgHt”,
'Tracz',
„NWAmes”,
„SawyerW”]

W kolumnie Sąsiedztwo znajduje się 10 najważniejszych etykiet kategorycznych.

Utwórz plik binarny

Teraz musimy utworzyć 10 zmiennych binarnych z etykiet top_10:

# utwórz plik binarny etykiet

dla etykiety w top_10:

nowy_df = np.where(new_df['Sąsiedztwo']==etykieta,1,0)

new_df[['Okolica']+top_10]


wyjście:-

Nazwy CollgCr Stare Miasto Edwards Somerseta Gilbert NridgHt Tracz NWA Sawyer W
0 CollgCr 0 1 0 0 0 0 0 0 0 0
1 Weenkera 0 0 0 0 0 0 0 0 0 0
2 CollgCr 0 1 0 0 0 0 0 0 0 0
3 Crawfora 0 0 0 0 0 0 0 0 0 0
4 Brak Ridge'a 0 0 0 0 0 0 0 0 0 0
5 Mitchel 0 0 0 0 0 0 0 0 0 0
6 Somerseta 0 0 0 0 1 0 0 0 0 0
7 NWA 0 0 0 0 0 0 0 0 1 0
8 Stare Miasto 0 0 1 0 0 0 0 0 0 0
9 BrkSide 0 0 0 0 0 0 0 0 0 0
10 Tracz 0 0 0 0 0 0 0 1 0 0
11 NridgHt 0 0 0 0 0 0 1 0 0 0

Możesz zobaczyć, jak etykiety top_10 są teraz konwertowane do formatu binarnego.

Weźmy przykład, zobacz w tabeli gdzie 1 wskaźnik Weenkera który nie należał do naszej etykiety kategorii top_10, więc spowoduje to 0 wszystkie kolumny.

Teraz zrobimy to dla wszystkich zmiennych kategorycznych, które wybraliśmy powyżej.

Wszystkie wybrane zmienne w OneHotEncoding

# dla wszystkich zmiennych kategorycznych wybraliśmy def top_x(df2,variable,top_x_labels): dla etykiety w top_x_labels: df2[variable+'_'+label] = np.where(data[variable]==label,1,0) # read dane ponownie data = pd.read_csv('D://xdatasets/train.csv',usecols = ['Sąsiedztwo','Exterior1st','Exterior2nd']) #koduj Sąsiedztwo w 10 najczęściej występujących kategoriach top_x(data, 'Sąsiedztwo',top_10) # wyświetl dane data.head()

Wynik:-

Teraz stosujemy kodowanie one-hot do wszystkich zmiennych wielokategorycznych.

Teraz zobaczymy zalety i wady One Hot Encoding dla wielu zmiennych.

Zalety

  • Proste do wdrożenia
  • Nie wymaga dużo czasu na zmienną eksplorację
  • Nie rozszerza znacząco przestrzeni funkcji.

Niedogodności

  • Nie dodaje żadnych informacji, które mogłyby zwiększyć przewidywalność zmiennej
  • Nie przechowuj informacji o ignorowanych zmiennych.

Uwagi końcowe

Podsumowując, uczymy się, jak radzić sobie ze zmiennymi wielokategorycznymi. Jeśli natkniesz się na ten problem, będzie to bardzo trudne zadanie. Dziękuję za przeczytanie tego artykułu.

Połącz się ze mną na LinkedIn: Profil

Przeczytaj inne moje artykuły: https://www.analyticsvidhya.com/blog/author/mayurbadole2407/

Dziękuję😎

Media pokazane w tym artykule nie są własnością Analytics Vidhya i są używane według uznania Autora.

Możesz również przeczytać ten artykuł w naszej aplikacji mobilnej Pobierz z Google Play

Powiązane artykuły

Źródło: https://www.analyticsvidhya.com/blog/2021/05/how-to-perform-one-hot-encoding-for-multi-categorical-variables/

Znak czasu:

Więcej z Analityka Widhja