1. Label encoding
import numpy as np
import pandas as pd
country=['Taiwan','Australia','Ireland','Australia','Ireland','Taiwan']
age=[25,30,45,35,22,36]
salary=[20000,32000,59000,60000,43000,52000]
dic={'Country':country,'Age':age,'Salary':salary}
data=pd.DataFrame(dic)
data
從上面的資料可以看到country那欄皆為字串, 大部分的模型都是基於數學運算,字串無法套入數學模型進行運算,在此先對其進行Label encoding編碼,我們從 sklearn library中導入 LabelEncoder class,對第一行資料進行fit及transform並取代之。Label encoding程式碼如下:
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()
data_le=pd.DataFrame(dic)
data_le['Country'] = labelencoder.fit_transform(data_le['Country'])
data_le
可以看到country中的三個國家都被數字0、1、2取代。然而這會產生一個問題,由於這本質上是類別資料,並沒有順序大小之分,當我們對其進行Label encoding後,模型會認為他們之間存在著0<1<2,因此這種無序的離散值One hot encoding會更加的合適。
2. One hot encoding
One Hot encoding的編碼邏輯為將類別拆成多個行(column),每個列中的數值由1、0替代,當某一列的資料存在的該行的類別則顯示1,反則顯示0。
然而,在指定column進行編碼的情形下,One hot encoding無法直接對字串進行編碼,必須先透過Label encoding將字串以數字取代後再進行One hot encoding處理。程式碼如下:
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])
data_str_ohe=onehotencoder.fit_transform(data_le).toarray()
pd.DataFrame(data_str_ohe)
categorical_features = [0]: 表示欲在data上執行One hot encoding的index為0
data_le: 為經過Label encoding編碼的資料(註:OneHotEncoder的輸入要為2-D array,而Label encoding為1-D array)
OneHotEncoder會轉出scipy.csr_matrix資料結構用.toarray()轉array
從結果可以知道,數字0的column 代表的是Australia、數字1的column 代表的是Ireland,而數字2的column 代表的是Taiwan。
除了轉換字串外,One hot encoding也可以轉換數字。在此處的data就不需要先經過Label encoding編碼。
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder()
data_whole_ohe=onehotencoder.fit_transform(data).toarray()
使用Pandas進行One hot encoding
在Pandas中,利用get_dummies函數可以直接進行One hot encoding編碼,其程式碼如下:
data_dum = pd.get_dummies(data)
pd.DataFrame(data_dum)
get_dummies可以直接轉字串,反而無法轉換數字,在沒指定columns的情況下,資料會全部轉換,另外get_dummies會依據其變數名稱自動新增新行名。
比較
OneHotEncoder : 可以處理數字但不能直接處理字串值, 需先將字串對映成數值。
get_dummies : 僅能將字串轉換為One hot encoding表示形式, 沒指定columns會全部轉換。
結論:
- 原始資料是有序離散值的話 => Label Encoding
- 原始資料是無序離散值的話 => One Hot Encoding (Dummies)