sklearn.preprocessing.LabelEncoder的使用

在训练模型之前,我们通常都要对训练数据进行一定的处理。将类别编号就是一种常用的处理方法,比如把类别“男”,“女”编号为0和1。可以使用sklearn.preprocessing中的LabelEncoder处理这个问题。

作用

将n个类别编码为0~n-1之间的整数(包含0和n-1)。

例子

假设我们要对性别数据进行编码,则数据可以分为两种情况:无NaN,有NaN。
首先导入要使用的包

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

无NaN

数据如下

sex = pd.Series(["male", "female", "female", "male"])

使用LabelEncoder进行处理,过程如下

le = preprocessing.LabelEncoder()    #获取一个LabelEncoder
le = le.fit(["male", "female"])      #训练LabelEncoder, 把male编码为0,female编码为1
sex = le.transform(sex)                #使用训练好的LabelEncoder对原数据进行编码
print(sex)

输出:

[1 0 0 1]

可以看到LabelEncoder将源数据中用字符串表示的类别编码成int型的数字,便于训练。
根据编码后的类别还可以获取编码前的类别:

le.inverse_transform([1,0,0,1])

输出:

array(['male', 'female', 'female', 'male'], dtype='<U6')

有NaN

假如数据中包含NaN,如下

sex = pd.Series(["male", "female", "female", np.nan])

这时执行

le = preprocessing.LabelEncoder()    #获取一个LabelEncoder
le = le.fit(["male", "female"])      #训练LabelEncoder, 把male编码为0,female编码为1
sex = le.transform(sex)                #使用训练好的LabelEncoder对原数据进行编码
print(sex)

就会出错

ValueError: y contains previously unseen labels: nan

解决方法也很简单,只要把NaN替换掉就行了

sex.fillna("unknown", inplace=True)

le = preprocessing.LabelEncoder()    #获取一个LabelEncoder
le = le.fit(["male", "female", "unknown"])      #训练LabelEncoder, 把male编码为0,female编码为1, unknown为2
sex = le.transform(sex)                #使用训练好的LabelEncoder对原数据进行编码
print(sex)

输出:

[1 0 0 2]

这里将NaN替换为unkown,将unknown加入le.fit中,这样unknown就会被编码为2了。

总结

sklearn.preprocessing.LabelEncoder可以简单方便地将数据中的类别编码。

posted @ 2018-12-17 22:00  ColdCode  阅读(21116)  评论(0编辑  收藏  举报
AmazingCounters.com