使用OrdinalEncoder在Python中转换分类值

时间:2019-06-08 02:06:12

标签: python scikit-learn

我有一个包含很多列的数据集

No  Name  Sex  Blood  Grade  Height  Study
1   Tom   M    O      56     160     Math
2   Harry M    A      76     192     Math
3   John  M    A      45     178     English
4   Nancy F    B      78     157     Biology
5   Mike  M    O      79     167     Math
6   Kate  F    AB     66     156     English
7   Mary  F    O      99     166     Science

我想将其更改为类似的内容

No  Name  Sex  Blood  Grade  Height  Study
1   Tom   0    0      56     160     0
2   Harry 0    1      76     192     0
3   John  0    1      45     178     1
4   Nancy 1    2      78     157     2
5   Mike  0    0      79     167     0
6   Kate  1    3      66     156     1
7   Mary  0    0      99     166     3

我知道有一个图书馆可以做到这一点

from sklearn.preprocessing import OrdinalEncoder

我尝试过,但是没有用

enc = OrdinalEncoder()
enc.fit(df[["Sex","Blood", "Study"]])

有人可以帮助我发现我在做什么以及如何做吗?

谢谢

2 个答案:

答案 0 :(得分:6)

我认为必须指出,这不是变量的序数编码的示例。性别,血液和学习都不应具有序数表(提出问题的人也未建议)。顺序数据具有排名(例如,参见https://en.wikipedia.org/wiki/Ordinal_data)。此处的示例没有排名。

如果变量是目标变量,则可以使用LabelEncoder。(https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

然后您可以执行以下操作:

from sklearn.preprocessing import LabelEncoder

for col in ["Sex","Blood", "Study"]:
    df[col] = LabelEncoder().fit_transform(df[col])

如果变量是功能部件,则应使用Ordinalencoder来实现。 (请参阅对我的答案的评论)。

不幸的是,Ordinalencoder的命名是从数学而不是统计命名的角度来看“普通”的。

更多关于sklearn中的序号编码器和标签编码器的区别:https://datascience.stackexchange.com/questions/39317/difference-between-ordinalencoder-and-labelencoder

答案 1 :(得分:0)

你快到了!

基本上是fit方法,请准备编码器(适合您的数据,即准备映射),但不要转换数据。

您必须调用transform来转换数据,或使用fit_transform来拟合和转换相同的数据。

enc = OrdinalEncoder()
enc.fit(df[["Sex","Blood", "Study"]])
df[["Sex","Blood", "Study"]] = enc.transform(df[["Sex","Blood", "Study"]])

或直接

enc = OrdinalEncoder()
df[["Sex","Blood", "Study"]] = enc.fit_transform(df[["Sex","Blood", "Study"]])

注意:这些值将不是您提供的值,因为内部fit方法使用numpy.unique,该方法给出的结果按字母顺序而不是按出现顺序排序。

enc.categories_可以看到

[array(['F', 'M'], dtype=object),
 array(['A', 'AB', 'B', 'O'], dtype=object),
 array(['Biology', 'English', 'Math', 'Science'], dtype=object)]```

数组中的每个值均由其位置编码。 (F将被编码为0,M将被编码为1)