LabelEncoder()为同一输入返回不同的值?

时间:2018-02-20 18:23:44

标签: python python-3.x scikit-learn

我使用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',但我得到了不同的数字:1113。为什么会发生这样的事当我对这些值进行逆变换时,我可以得到相同的结果。我不是这些结果有什么问题吗?它会影响我以后的操作,例如使用朴素贝叶斯分类器吗?

1 个答案:

答案 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()步骤的相同拟合对象。