我正在使用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,任何人都可以帮助我理解这一点。
编辑: - 此数据集是大数据集的子集。这与此有什么关系吗?
答案 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'])
注意,最后一列EncodedTarget
是Target
的转换副本。
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])