11

我是 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 编码器是如何工作的,但我无法弄清楚这段代码是如何工作的。任何帮助表示赞赏。谢谢!

4

2 回答 2

16

让我们首先写下您的期望(假设您知道 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_

来自文档:

每个特征的值数。

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])

来自文档:

特征范围的索引。原始数据中的特征 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 开始映射。

希望能解决一些问题。

于 2017-03-11T01:16:45.053 回答
14

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

>>> 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])

该表示将连接三个特征的向量。由于存在三个特征,表示将始终具有三个“真”条目(1),其余的“假”(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]

将这些端对端拍打,转换为给定的浮点格式,我们就有了示例中显示的数组。

于 2017-03-11T00:44:26.660 回答