Kategoryzacja zmiennych

Kolejną czynnością często wykonywaną na etapie porządkowania danych jest kategoryzacja zmiennych. O co tutaj chodzi. Znów popatrzmy na przykład:

Country Age Salary Product purchases
France 44.0 72000.0 Yes
Spain 27.0 48000.0 Yes
Germany 30.0 54000.0 No
Spain 38.0 61000.0 No
Germany 40.0 Yes
France 35.0 58000.0 No
Spain 52000.0 No

Wśród atrybutów powyższej tabeli, dwie cechy można skategoryzować. Są to Country _u _Product purchases. Pierwsza z nich zawiera wartości ze zbioru trój-wartościowego: (France, Spain, Germany), a druga ze zbioru dwu-wartościowego: (Yes, No).

Kategoryzacja zmiennych jest istotna co najmniej z dwóch powodów:

  1. pozwala na optymalizację zajętości pamięci przez daną strukturę danych
  2. jest niezbędna w algorytmach uczenia maszynowego, które wymagają na wejściu wartości numerycznych. Kategoryzacja w tym przypadku pozwala zakodować wartości danej kategorii jako numeryczne identyfikatory
Przykład w Python

I znowu, do kategoryzacji danej cechy można wykorzystać moduł preprocessing w bibliotece scikit-learn oraz klasę LabelEncoder

from sklearn.preprocessing import LabelEncoder
labelEncoder_x = LabelEncoder()
X[:,0] = labelEncoder_x.fit_transform(X[:,0])

Przyjmuje ona jako parametr metody fit_transform kolumnę reprezentującą dane danej cechy i zwraca wartości danej cechy w postaci numerycznej, kodując unikalnie każdą wartość:

X
Out[3]: 
array([[0, 44.0, 72000.0],
       [2, 27.0, 48000.0],
       [1, 30.0, 54000.0],
       [2, 38.0, 61000.0],
       [1, 40.0, 63777.77777777778],
       [0, 35.0, 58000.0],
       [2, 38.77777777777778, 52000.0],
       [0, 48.0, 79000.0],
       [1, 50.0, 83000.0],
       [0, 37.0, 67000.0]], dtype=object)

Jest niestety z takim sposobem kodowania jeden problem. Kolejne wartości nienumeryczne są kodowane z wykorzystaniem kolejnych wartości numerycznych, co będzie w algorytmach uczenia maszynowego powodować, że mogą być one traktowane jako bardziej lub mniej znaczące, ze względu na swoją wartość liczbową.

Przykład w R

Jest to zdecydowanie prostsze, gdyż możemy zdefiniować cechę jako skategoryzowaną i już:

dataset$Country = factor(dataset$Country,
                         c('Spain', 'France', 'Germany'),
                         c(1,2,3))

Dummy encoding

Innym sposobem kodowania zmiennych skategoryzowanych, który radzi sobie z problemem opisanym powyżej jest kodowanie wartości za pomocą tylu cech ile unikalnych wartości występuje w kategorii. Jeśli kolumna Country w naszym przykładzie ma trzy wartości, to każdą z tych wartości możemy zapisać w trzech nowych cechach, gdzie każda z tych cech przyjmuje wartość 0 lub 1:

Country France Germany Spain
France 1 0 0
Germany 0 1 0
Spain 0 0 1
Przykład w Python
from klearn.preprocessing import OneHotEncoder
oneHotEncoder = OneHotEncoder(categorical_features = [0])
X = oneHotEncoder.fit_transform(X).toarray()

Parametr categorical_features przyjmuje wartość, która jest listą indeksów, wskazującą na zmiennej, które mają zostać zakodowane.

W wyniku dostaniemy następującą strukturę:

Wykorzystanie zmiennych dummy w modelu

Tak utworzone cechy wchodzą następnie jako zmienne niezależne do modelu. Istotne jest, aby do modelu wprowadzać n-1 cech, gdzie n oznacza liczbę kategorii dla cechy wyjściowej. Chodzi tutaj o to, że zmienna n jest zależna od zmiennych pozostałych i da się ją zawsze przedstawić jako n3 = 1 - n2 - n1. Angielski termin na taką zależności to multicollinearity.

results matching ""

    No results matching ""