使用 python 解释 onehotencoder

Explain onehotencoder using 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.]])

有人可以一步步向我解释这里发生了什么吗?我很清楚 One hot encoder 是如何工作的,但我无法弄清楚这段代码是如何工作的。任何帮助表示赞赏。谢谢!

让我们一次一个地了解这些功能:

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

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

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

清除了吗?

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

表示将连接三个特征的向量。由于具有三个特征,表示将始终具有三个 "True" 条目 (1),其余 "False" (0).

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

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

将这些首尾相连,转换为给定的 float 格式,我们得到示例中显示的数组。

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

未编码

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' 时,您指定了您的特征(未编码 的列)可能采用的值可以从传递的数据列中的值推断出来至 fit.

这将我们带到 enc.n_values_

来自文档:

Number of values per feature.

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 的值。

然后,

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

来自文档:

Indices to feature ranges. Feature i in the original data is mapped to features from feature_indices_[i] to feature_indices_[i+1] (and then potentially masked by active_features_ afterwards)

给定的是特征 f1、f2、f3 可以承担的位置范围( 在编码的 space 中)。

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

将向量 [0, 1, 1] 映射到一个热编码 space(根据我们从 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 开始映射。

希望能解决一些问题。