标签编码器多个级别

时间:2016-03-15 21:35:32

标签: python python-2.7 numpy scikit-learn

我正在使用python标签编码器来转换我的数据。这是我的样本数据。

                         Database      Target    Market_Description    Brand  \
0            CN_Milk powder_Incl_Others    NaN  Shanghai Hyper total  O.Brand   
1            CN_Milk powder_Incl_Others    NaN  Shanghai Hyper total  O.Brand   
2            CN_Milk powder_Incl_Others    NaN  Shanghai Hyper total  O.Brand   

  Sub_Brand Category                   Class_Category  
0       NaN      NaN  Hi Cal Adult Milk Powders- C1  
1       NaN      NaN  Hi Cal Adult Milk Powders- C1  
2       NaN      NaN  Hi Cal Adult Milk Powders- C1 

我在所有列中应用转换

df3 = CountryDF.apply(preprocessing.LabelEncoder().fit_transform)   

当我检查Target列的唯一值时,它会显示

>>> print pd.unique(CountryDF.Target.ravel())

>>> [nan 'Elder' 'Others' 'Lady']

但是当我在转换后检查相同时,我会得到多个级别。

>>> print pd.unique(df3.Target.ravel())
>>> [ 40749 667723 667725 ...,  43347  43346  43345]

我不确定这是怎么回事?我期望有四个独特的值,因为我认为转换实现的工作方式是获取唯一值并在每个值上分配排序的numpy,任何人都可以帮助我理解这一点。

编辑: - 此数据集是大数据集的子集。这与此有什么关系吗?

EDIT2: - @Kevin我尝试了你的建议,这很奇怪。看到这个。 enter image description here

1 个答案:

答案 0 :(得分:1)

我不认为大数据集会影响您的结果。 LabelEncoder的目的是转换预测目标(在您的情况下,我假设,Target列)。来自User Guide

  

LabelEncoder是一个实用程序类,用于帮助标准化标签,使它们只包含0到n_classes-1之间的值。

以下是一个示例,请注意我在示例Target中更改了CountryDF的值,仅用于演示目的:

from sklearn.preprocessing import LabelEncoder
import numpy as np
import pandas as pd

CountryDF = pd.DataFrame([['CN_Milk powder_Incl_Others',np.nan,'Shanghai Hyper total','O.Brand',np.nan,np.nan,'Hi Cal Adult Milk Powders- C1'],
                              ['CN_Milk powder_Incl_Others','Elder','Shanghai Hyper total','O.Brand',np.nan,np.nan,'Hi Cal Adult Milk Powders- C1'],
                              ['CN_Milk powder_Incl_Others','Others','Shanghai Hyper total','O.Brand',np.nan,np.nan,'Hi Cal Adult Milk Powders- C1'],
                              ['CN_Milk powder_Incl_Others','Lady','Shanghai Hyper total','O.Brand',np.nan,np.nan,'Hi Cal Adult Milk Powders- C1'],
                             ['CN_Milk powder_Incl_Others',np.nan,'Shanghai Hyper total','O.Brand','S_B1',np.nan,'Hi Cal Adult Milk Powders- C1'],
                             ['CN_Milk powder_Incl_Others',np.nan,'Shanghai Hyper total','O.Brand','S_B2',np.nan,'Hi Cal Adult Milk Powders- C1']],
                            columns=['Database','Target','Market_Description','Brand','Sub_Brand', 'Category','Class_Category'])

首先,初始化LabelEncoder,然后拟合并转换数据(同时将转换后的数据分配到新列)。

le = LabelEncoder() # initialze the LabelEncoder once

#Create a new column with transformed values.
CountryDF['EncodedTarget'] = le.fit_transform(CountryDF['Target'])

注意,最后一列EncodedTargetTarget的转换副本。

CountryDF

Database    Target  Market_Description  Brand   Sub_Brand   Category    Class_Category  EncodedTarget
0   CN_Milk powder_Incl_Others  NaN     Shanghai Hyper total    O.Brand     NaN     NaN     Hi Cal Adult Milk Powders- C1   0
1   CN_Milk powder_Incl_Others  Elder   Shanghai Hyper total    O.Brand     NaN     NaN     Hi Cal Adult Milk Powders- C1   1
2   CN_Milk powder_Incl_Others  Others  Shanghai Hyper total    O.Brand     NaN     NaN     Hi Cal Adult Milk Powders- C1   3
3   CN_Milk powder_Incl_Others  Lady    Shanghai Hyper total    O.Brand     NaN     NaN     Hi Cal Adult Milk Powders- C1   2

我希望这有助于澄清LabelEncoder。如果这还没有完全回答您的问题,可能会引导您走上正确的道路,转变您的功能(这可能是您尝试做的事情?) - 查看OneHotEncoder

修改 我向CountryDF添加了另外两行(见上文),它为Sub_Brand列提供了两个唯一值,它们跟随一系列连续的NaN。我很难过为什么你会看到这种行为,它适用于我,熊猫0.17.0和scikit 0.17。

df3 = CountryDF.apply(LabelEncoder().fit_transform)
df3
Database    Target  Market_Description  Brand   Sub_Brand   Category    Class_Category
0   0   0   0   0   0   0   0
1   0   1   0   0   0   1   0
2   0   3   0   0   0   2   0
3   0   2   0   0   0   3   0
4   0   0   0   0   1   4   0
5   0   0   0   0   2   5   0

我无法重现您的问题,您是否有指向数据的链接?

pd.unique(CountryDF.Target.ravel())    
array([nan, 'Elder', 'Others', 'Lady'], dtype=object)
pd.unique(df3.Target.ravel())
array([0, 1, 3, 2])