我是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.]])
有人可以一步一步地向我解释这里发生了什么吗?我清楚地知道一个热编码器如何工作,但我无法弄清楚这个代码是如何工作的。任何帮助表示赞赏。谢谢!
答案 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])
清除?
>>> enc.feature_indices_
array([0, 2, 5, 9])
表示将连接三个特征的向量。由于有三个功能,表示将始终有三个&#34; True&#34;条目(1),其余的&#34;错误&#34; (0)。
由于有2 + 3 + 4个可能的值,因此表示长度为9个条目。
在指数9处结束路障
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])
对给定值进行编码只需连接三个单向量,值为0,1,1:
将这些端到端压缩,转换为给定的 float 格式,我们在示例中显示了数组。