这一个很热

时间:2018-05-29 08:19:51

标签: python machine-learning one-hot-encoding

阅读:

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

它声明“使用一个热的又称一个K方案来编码分类整数特征。”

这是否也意味着它会对单词列表进行单热编码?

来自维基百科的一个热门编码的定义(https://en.wikipedia.org/wiki/One-hot
“在自然语言处理中,单热矢量是1×N矩阵(矢量),用于区分词汇表中的每个单词与词汇表中的每个其他单词。所有单元格中的向量由0组成,但单个除外单词中的1用于唯一标识单词。“

运行下面的代码LabelEncoder不是一个热编码的正确实现,而OneHotEncoder是正确的实现:

import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer
from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

# define example
data = ['w1 w2 w3', 'w1 w2']

values = array(data)
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)

# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)

mlb = MultiLabelBinarizer()

print('fit_transform\n' , mlb.fit_transform(data))
print('\none hot\n' , onehot_encoder.fit_transform(integer_encoded))

打印:

fit_transform
 [[1 1 1 1 1]
 [1 1 1 0 1]]

one hot
 [[0. 1.]
 [1. 0.]]

所以LabelEncoder不是单热编码,LabelEncoder使用的编码类型是什么?

从上面的输出看,OneHotEncoder产生的矢量比LabelEncoder的编码方案更密集。

更新:

如何决定使用LabelEncoder或OneHotEncoder对机器学习算法的数据进行编码?

1 个答案:

答案 0 :(得分:1)

我认为你的问题不够明确......

首先,LabelEncoder0n_classes-1之间的值进行编码,而OneHotEncoder使用one-hot又称为K的一种方案对分类整数要素进行编码。他们是不同的。

其次,是OneHotEncoder对单词列表进行编码。在维基百科的定义中,它说a one-hot vector is a 1 × N matrix。但是什么是N?实际上,N是你词汇量的大小。

例如,如果您有五个单词a, b, c, d, e。然后对它们进行一次热编码:

a -> [1, 0, 0, 0, 0]  # a one-hot 1 x 5 vector
b -> [0, 1, 0, 0, 0]  # a one-hot 1 x 5 vector
c -> [0, 0, 1, 0, 0]  # a one-hot 1 x 5 vector
d -> [0, 0, 0, 1, 0]  # a one-hot 1 x 5 vector
e -> [0, 0, 0, 0, 1]  # a one-hot 1 x 5 vector
# total five one-hot 1 x 5 vectors which can be expressed in a 5 x 5 matrix.

第三,实际上我并不是100%肯定你在问什么...

最后,回答您更新的问题。大多数时候你应该选择单热编码或word embedding。原因是,LabelEncoder生成的向量太相似,这意味着彼此之间没有太大差异。由于类似的输入更有可能产生类似的输出。这使你的模型难以适应。