我使用LabelEncoder()
将分类数据转换为数字数据。我有一个数据集如下:
['x','s','n','t','p','f','c','n','k','e','e','s','s','w','w','p','w','o','p','k','s','u','p']
['x','s','y','t','a','f','c','b','k','e','c','s','s','w','w','p','w','o','p','n','n','g','e']
['b','s','w','t','l','f','c','b','n','e','c','s','s','w','w','p','w','o','p','n','n','m','e']
...
我使用labelEncoder()
进行转换。代码如下。
for m in M:
le = preprocessing.LabelEncoder()
le_fitted = le.fit(m)
le.classes_
encoding = list(le.transform(m))
这是我的结果:
[11, 7, 4, 8, 6, 2, 0, 4, 3, 1, 1, 7, 7, 10, 10, 6, 10, 5, 6, 3, 7, 9]
[13, 10, 14, 11, 0, 4, 2, 1, 6, 3, 2, 10, 10, 12, 12, 9, 12, 8, 9, 7, 7, 5]
[0, 9, 11, 10, 4, 3, 1, 0, 6, 2, 1, 9, 9, 11, 11, 8, 11, 7, 8, 6, 6, 5]
我的问题是。为什么同一个角色有不同的数值?例如,第一个列表和第二个列表的第一个值是'x'
,但我得到了不同的数字:11
和13
。为什么会发生这样的事当我对这些值进行逆变换时,我可以得到相同的结果。我不是这些结果有什么问题吗?它会影响我以后的操作,例如使用朴素贝叶斯分类器吗?
答案 0 :(得分:1)
您正在为循环中的每个LabelEncoder
创建并插入新的m
。相反,您希望将编码器拟合一次,然后使用它来转换每个列表。
您可以首先通过获取所有列表的set union来获取所有可能的值进行编码。
from sklearn.preprocessing import LabelEncoder
from functools import reduce
# map each list in M to a set and then reduce using the set union (|)
all_M = list(reduce(lambda u, v: u | v, map(set, M)))
print all_M
#['a', 'c', 'b', 'e', 'g', 'f', 'k', 'm', 'l', 'o', 'n', 'p', 's', 'u', 't', 'w', 'y', 'x']
接下来创建一个编码器并在fit()
上致电all_M
。然后在列表中使用这个合适的编码器:
le = LabelEncoder()
le.fit(all_M)
for m in M:
encoding = list(le.transform(m))
print encoding
#[16, 12, 9, 13, 11, 4, 2, 9, 6, 3, 3, 12, 12, 15, 15, 11, 15, 10, 11, 6, 12, 14, 11]
#[16, 12, 17, 13, 0, 4, 2, 1, 6, 3, 2, 12, 12, 15, 15, 11, 15, 10, 11, 9, 9, 5, 3]
#[1, 12, 15, 13, 7, 4, 2, 1, 9, 3, 2, 12, 12, 15, 15, 11, 15, 10, 11, 9, 9, 8, 3]
一般情况下,对于任何预处理步骤,您只需要调用fit()
一次(通常在您的训练数据上)。然后,后续数据(包括测试数据)将使用transform()
步骤的相同拟合对象。