初學Python手記#3-資料前處理( Label encoding、 One hot encoding)

Pat Huang
6 min readApr 25, 2019

--

這兩個編碼方式的目的是為了將類別 (categorical)或是文字(text)的資料轉換成數字,而讓程式能夠更好的去理解及運算。

Label encoding : 把每個類別 mapping 到某個整數,不會增加新欄位

One hot encoding : 為每個類別新增一個欄位,用 0/1 表示是否

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)

程式碼:

--

--

Pat Huang

A rookie in learning python. I write this work diary to record every problem I encounter.隨手做了紀錄,紀錄在做題目當下所遇見的困難及如何釐清。因此有任何理解錯誤歡迎立即指正!