Объясните onehotencoder с помощью python

Я новичок в библиотеке scikit-learn и пытаюсь играть с ней для прогнозирования цен на акции. Я просматривал документацию и застрял в той части, где они поясняют OneHotEncoder(). Вот код, который они использовали :

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9])
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

может кто-нибудь, пожалуйста, объясните мне шаг за шагом, что здесь происходит? У меня есть четкое представление о том, как работает один горячий кодировщик, но я не могу понять, как работает этот код. Любая помощь приветствуется. Спасибо!

2 ответов


давайте начнем сначала, записав то, что вы ожидаете (предполагая, что вы знаете, что означает одна горячая кодировка)

unecoded

f0 f1 f2
0, 0, 3
1, 1, 0
0, 2, 1
1, 0, 2

закодированных

|f0|  |  f1 |  |   f2   |

1, 0, 1, 0, 0, 0, 0, 0, 1 
0, 1, 0, 1, 0, 1, 0, 0, 0
1, 0, 0, 0, 1, 0, 1, 0, 0
0, 1, 1, 0, 0, 0, 0, 1, 0

и закодированных:

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]),

если вы используете значение по умолчанию n_values='auto'. При использовании default= 'auto' вы указываете, что значения ваших функций (столбцы unencoded) возможно, взять на себя можно сделать вывод из значений в Столбцах данных, переданных в fit.

это подводит нас к enc.n_values_

документы:

количество значений на объект.

enc.n_values_
array([2, 3, 4])

вышеизложенное означает, что f0 (столбец 1) может принимать 2 значения (0, 1), f1 может принимать 3 значения, (0, 1, 2) и f2 может принимать 4 значения (0, 1, 2, 3).

действительно, это значения из функций f1 ,f2, f3 в unencoded характеристика матрицы.

затем,

enc.feature_indices_
array([0, 2, 5, 9])

документы:

индексы для диапазонов объектов. Функция i в исходных данных сопоставляется с функции от feature_indices_[i] до feature_indices_[i+1] (а затем потенциально замаскированный active_features_ впоследствии)

задан диапазон позиций (в закодированном пространстве), что функции f1, f2, f3 могут взять на себя.

f1: [0, 1], f2: [2, 3, 4], f3: [5, 6, 7, 8]

сопоставление вектор [0, 1, 1] в одно горячее кодированное пространство (под отображением мы получили от enc.fit):

1, 0, 0, 1, 0, 0, 1, 0, 0

как?

первая функция в f0, так что карты в положение 0 (если элемент был 1 вместо 0, мы бы отобразить его в положение 1).

следующий элемент 1 сопоставляется с позицией 3, поскольку f1 начинается с позиции 2, а элемент 1 является вторым возможным значением, которое может принять f1.

наконец, третий элемент 1 берет на себя позиция 6, так как она принимает второе возможное значение f2, и f2 начинает отображаться из позиции 5.

надеюсь, это прояснит некоторые вещи.


давайте возьмем эти функции на один раз:

>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

мы приспосабливаем кодировщик к набору из четырех векторов, с 3 функциями каждый.

>>> enc.n_values_
array([2, 3, 4])
  • 1-я функция имеет 2 возможных значения: 0, 1
  • 2-я функция имеет 3 возможных значения: 0, 1, 2
  • 3-я функция имеет 4 возможных значения: 0, 1, 2, 3

понятно?

>>> enc.feature_indices_
array([0, 2, 5, 9])

представление объединит векторы для трех объектов. Поскольку существует три функции, представление всегда будет иметь три" истинных "записи (1), остальные" ложные " (0).

так как есть 2+3+4 возможные значения, представление имеет длину 9 записей.

  • Функция 1 начинается с индекса 0
  • функция 2 начинается с индекса 2(F1 start + len (F1))
  • функция 3 начинается с индекса 5(F2 start + len (F2))

конец баррикады по индексу 9

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

кодировка данного значения просто объединяет три вектора, для значений 0, 1, 1:

  • F1: [1, 0]
  • F2: [0, 1, 0]
  • F3: [0, 1, 0, 0]

шлепните эти сквозные, преобразуйте в данный плавание format, и у нас есть массив, показанный в Примере.