在訓練模型之前,我們通常都要對訓練數據進行一定的處理。將類別編號就是一種常用的處理方法,比如把類別“男”,“女”編號為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可以簡單方便地將數據中的類別編碼。