Przejdź do głównej zawartości

OneHotEncoder

· 2 min aby przeczytać

Ten wpis jest kontynuacją poprzedniego wpisu o LabelEncoder. Tym razem będzie o technice zwanej one hot encoding albo kod 1 z n. Mając kategorie zamienione na odpowiadające im liczby możemy zamienić je także na kilka kolumn (ich liczba zależy od tego ile jest kategorii), które zawierają zera i jedynki oznaczające odpowiednio czy dany wiersz należy do kategorii czy nie. Metodę tę stosujemy, gdy używamy algorytmu, który może mieć problem ze zmiennymi liczbowymi (bo zakładają jakiś porządek).

Przypuśćmy, że mamy kategorię "kolor" z trzema możliwymi wartościami: czerwony, zielony, niebieski.

ZmiennaKolor
1czerwony
2zielony
3niebieski
4zielony
5czerwony

Po zakodowaniu etykiet czerwony będzie zamieniony na zero, zielony na dwójkę, a niebieski na jedynkę (biblioteka scikit-learn wewnętrznie sobie jakoś sortuje te dane i dopiero tym posortowanym danym przypisuje odpowiedni numer).

ZmiennaKolor
10
22
31
42
50

Przetwarzamy te dane za pomocą techniki one hot encoding:

ZmiennaCzerwonyZielonyNiebieski
1100
2001
3010
4001
5100
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

from __future__ import print_function

import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

np.set_printoptions(threshold=np.inf)


X = np.array(['czerwony', 'zielony', 'niebieski', 'zielony', 'czerwony'])

lbl_enc = LabelEncoder()
lbl_enc.fit(X)
X_cat = lbl_enc.transform(X)

print(X_cat)

# tutaj zmieniamy jednowymiarową tablicę na dwuwymiarową, bo skrypt rzuca błędem
X_cat = X_cat.reshape(-1, 1)

encoder = OneHotEncoder()
encoder.fit(X_cat)
X_cat = encoder.transform(X_cat)
X_cat = X_cat.toarray()

print()
print(X_cat)

Na wyjściu otrzymujemy:

[0 2 1 2 0]

[[ 1. 0. 0.]
[ 0. 0. 1.]
[ 0. 1. 0.]
[ 0. 0. 1.]
[ 1. 0. 0.]]