阅读:
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对机器学习算法的数据进行编码?
答案 0 :(得分:1)
我认为你的问题不够明确......
首先,LabelEncoder
对0
和n_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
生成的向量太相似,这意味着彼此之间没有太大差异。由于类似的输入更有可能产生类似的输出。这使你的模型难以适应。