用python解释onehotencoder

Sha*_*ant 9 python machine-learning prediction scikit-learn 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.]])
Run Code Online (Sandbox Code Playgroud)

有人可以一步一步地向我解释这里发生了什么吗?我清楚地知道一个热编码器如何工作,但我无法弄清楚这个代码是如何工作的.任何帮助表示赞赏.谢谢!

ors*_*ady 14

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

unecoded

f0 f1 f2
0, 0, 3
1, 1, 0
0, 2, 1
1, 0, 2
Run Code Online (Sandbox Code Playgroud)

编码

|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
Run Code Online (Sandbox Code Playgroud)

编码:

enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]),
Run Code Online (Sandbox Code Playgroud)

如果您使用默认值n_values='auto'.在使用default ='auto'时,您指定的是您的功能(未编码的列)可能采用的值可以从传递给的数据列中的值推断出来fit.

这带给我们的是 enc.n_values_

来自文档:

每个要素的值数.

enc.n_values_
array([2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

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

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

然后,

enc.feature_indices_
array([0, 2, 5, 9])
Run Code Online (Sandbox Code Playgroud)

来自文档:

特征范围的指数.原始数据中的特征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]
Run Code Online (Sandbox Code Playgroud)

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

1, 0, 0, 1, 0, 0, 1, 0, 0
Run Code Online (Sandbox Code Playgroud)

怎么样?

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

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

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

希望清除一些东西.


Pru*_*une 13

让我们一次一个地使用这些功能:

>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
Run Code Online (Sandbox Code Playgroud)

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

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

明确?

>>> enc.feature_indices_
array([0, 2, 5, 9])
Run Code Online (Sandbox Code Playgroud)

该表示将连接三个特征的向量.由于有三个特征,表示将始终具有三个"真"条目(1),其余为"假"(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.]])
Run Code Online (Sandbox Code Playgroud)

对给定值进行编码简单地连接三个单向量,对于值0,1,1:

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

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