sklearn LabelEncoder中的标签不一致?

时间:2016-07-18 09:05:44

标签: python pandas scikit-learn

我在数据框上应用了LabelEncoder(),返回以下内容:

  

enter image description here

order/new_cart具有不同的标签编码数字,例如70, 64, 71, etc

这是不一致的标签,还是我在某处做错了什么?

2 个答案:

答案 0 :(得分:4)

LabelEncoder适用于一维数组。如果将其应用于多个列,则它将在列中保持一致,但不能跨列。

作为一种解决方法,您可以将数据帧转换为一维数组,并在该数组上调用LabelEncoder。

假设这是数据帧:

df
Out[372]: 
   0  1  2
0  d  d  a
1  c  a  c
2  c  c  b
3  e  e  d
4  d  d  e
5  d  b  e
6  e  e  b
7  a  e  b
8  b  c  c
9  e  a  b

用ravel然后重塑:

pd.DataFrame(LabelEncoder().fit_transform(df.values.ravel()).reshape(df.shape), columns = df.columns)
Out[373]: 
   0  1  2
0  3  3  0
1  2  0  2
2  2  2  1
3  4  4  3
4  3  3  4
5  3  1  4
6  4  4  1
7  0  4  1
8  1  2  2
9  4  0  1

编辑:

如果要存储标签,则需要保存LabelEncoder对象。

le = LabelEncoder()
df2 = pd.DataFrame(le.fit_transform(df.values.ravel()).reshape(df.shape), columns = df.columns)

现在,le.classes_为您提供了类(从0开始)。

le.classes_
Out[390]: array(['a', 'b', 'c', 'd', 'e'], dtype=object)

如果要按标签访问整数,可以构造一个dict:

dict(zip(le.classes_, np.arange(len(le.classes_))))
Out[388]: {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}

您可以使用transform方法执行相同操作,而无需构建dict:

le.transform('c')
Out[395]: 2

答案 1 :(得分:2)

您的LabelEncoder对象正在重新适合您的DataFrame的每一列。

由于applyfit_transform函数的工作方式,您不小心在框架的每一列上调用了fit函数。让我们来看看发生在以下行中的最新情况:

labeled_df = String_df.apply(LabelEncoder().fit_transform)
  1. 创建新的LabelEncoder对象
  2. 调用apply传递fit_transform方法。对于DataFrame中的每一列,它会在编码器上调用fit_transform作为参数传入列。这样做有两件事:
    A.重新安装编码器(修改其状态) B.根据您的编码器新配件返回列的元素代码。
  3. 代码在列之间不一致,因为每次调用fit_transform时,LabelEncoder对象都可以选择新的转换代码。

    如果您希望代码在列之间保持一致,则应将LabelEncoder与整个数据集相匹配。

    然后将transform函数传递给apply函数,而不是fit_transform函数。您可以尝试以下方法:

    encoder = LabelEncoder()
    all_values = String_df.values.ravel() #convert the dataframe to one long array
    encoder.fit(all_values)
    labeled_df = String_df.apply(encoder.transform)