Dawid Loranc „What I cannot create, I do not understand.” - Richard Feynman
OneHotEncoder

OneHotEncoder

17.02.2017

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.

Zmienna Kolor
1 czerwony
2 zielony
3 niebieski
4 zielony
5 czerwony

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).

Zmienna Kolor
1 0
2 2
3 1
4 2
5 0

Przetwarzamy te dane za pomocą techniki one hot encoding:

Zmienna Czerwony Zielony Niebieski
1 1 0 0
2 0 0 1
3 0 1 0
4 0 0 1
5 1 0 0
#!/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.]]

Kategorie: Przepisy

Udostępnij: