用python解释onehotencoder

时间:2017-03-10 22:28:02

标签: python machine-learning scikit-learn prediction one-hot-encoding

我是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 个答案:

答案 0 :(得分:13)

让我们首先写下您的期望(假设您知道One Hot Encoding的含义)

<强> 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'时,您指定可以从传递给{{1}的数据列中的值推断出您的要素(未编码的列)可能采用的值}。

这将我们带到fit

来自文档:

  

每个要素的值数。

enc.n_values_

以上意味着f0(第1列)可以取2个值(0,1),f1可以取3个值,(0,1,2),f2取4个值(0,1,2) ,3)。

实际上,这些是来自未编码特征矩阵中的特征f1,f2,f3的值。

然后,

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

来自文档:

  

功能范围的指数。原始数据中的要素i映射到   功能从feature_indices_ [i]到feature_indices_ [i + 1](然后   之后可能被active_features_掩盖了)

给定f1,f2,f3可以采用的位置范围(在编码空间中)。

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

将矢量[0,1,1]映射到一个热编码空间(在我们从enc.fit获得的映射下):

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

如何吗

f0中的第一个特征,即映射到位置0(如果元素为1而不是0,我们将其映射到位置1)。

下一个元素1映射到位置3,因为f1从位置2开始,元素1是f1可以承担的第二个可能值。

最后,第三个元素1占据位置6,因为它是第二个可能的值f2,f2开始从位置5开始映射。

希望清除一些东西。

答案 1 :(得分:11)

让我们一次采取这些功能:

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

我们将编码器拟合到一组四个向量中,每个向量具有3个特征。

>>> enc.n_values_
array([2, 3, 4])
  • 第一个功能有两个可能的值:0,1
  • 第二个功能有3个可能的值:0,1,2
  • 第3个功能有4个可能的值:0,1,2,3

清除?

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

表示将连接三个特征的向量。由于有三个功能,表示将始终有三个&#34; True&#34;条目(1),其余的&#34;错误&#34; (0)。

由于有2 + 3 + 4个可能的值,因此表示长度为9个条目。

  • 功能1从索引0开始
  • 功能2从索引2开始(F1开始+ len(F1))
  • 功能3从索引5开始(F2开始+ 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]

将这些端到端压缩,转换为给定的 float 格式,我们在示例中显示了数组。

相关问题