iT邦幫忙

2022 iThome 鐵人賽

DAY 4
0
AI & Data

Machine Learning A-Z 學習筆記系列 第 4

[Day04] 拾起武器- Data Preprocessing(03)

  • 分享至 

  • xImage
  •  

Categorical Data 分類數據

上一篇提到數據預處理的章節
本篇繼續從分類數據開始

https://ithelp.ithome.com.tw/upload/images/20220919/20152557aSCKernAV0.png

這是我們目前的raw data
若我們今天想將Country 欄位的資料也丟進model 計算
就必須將它轉換成數字
可以使用scikit-learn 中的 LabelEncoder 類別來做
如下, 先創建一個LabelEncoder 物件叫 lblenc_x
接著呼叫fit_transform() 函式並指定要轉換的是所有row的第0個column
也就是country 欄位

"""
3. Use LabelEncoder to transfer the data
   (transfer from a string to a digit)
"""
# transfer label to digit
from sklearn.preprocessing import LabelEncoder
lblenc_x = LabelEncoder()
# init the label encoder and transfer it
# get all the rows with the colmun 0
x[:,0] = lblenc_x.fit_transform(x[:,0])

印出x 陣列可以看到country 欄位全被換成數字了
France —> 0
Spain —> 2
Germany —> 1
後面重複的country 就用這三個代碼替換
https://ithelp.ithome.com.tw/upload/images/20220919/20152557zt7M6GA7AA.png
接著我們可以利用OneHotEncoder & ColumnTransformer 將其轉換成二元的特徵資料
原理是把所有資料串在一起用1/0 表示
https://ithelp.ithome.com.tw/upload/images/20220919/20152557DsWrKBeAxk.png

這次我們創建一個ColumnTransformer物件叫ct
並呼叫fit_transform() 帶入x 進行資料替換
ColumnTranform() 需要帶入 1. 目標欄位名稱, 也就是Country 2. 一個OneHotEncoder 物件 3. 目標行號 4. remainder= passthrough

"""
4. <dummy encoding>
   Use the OneHotEncoder and ColumnTransformer to encode
   the a colmun of data
"""
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([("Country", OneHotEncoder(), [0])], remainder = 'passthrough')
x = ct.fit_transform(x)

結果如下
France 被轉成 1, 0, 0
Spain 被轉成 0, 0, 1
Germany 被轉成 0, 1, 0
https://ithelp.ithome.com.tw/upload/images/20220919/20152557KwVJExQoLP.png

需要注意的是課程中對於OneHotEncoder 的用法目前無法使用
因為scikit-learn 2.0 中已經不support categorical_features
因此需要改用columntranform 來做preprocessing
原本課程中的寫法會error

enc = OneHotEncoder(categorical_features=[0])

TypeError: init() got an unexpected keyword argument 'categorical_features'

LabelEncoder 跟 OneHotEncoder的差異

LabelEncoder 適合做有序型資料的encode, 例如衣服尺寸(XS, S, M, L) 這種有程度差異的資料
因為轉換後變成digit 就可以做排序
OneHotEncoder適合做無序型資料的encode, 例如國家, 語言, 性別這種沒有程度差異的資料
轉換成二元資料後就沒有順序上的問題, 都當作是unique id

Reference:

  1. https://stackoverflow.com/questions/59476165/typeerror-init-got-an-unexpected-keyword-argument-categorical-features

上一篇
[Day03] 拾起武器- Data Preprocessing(02)
下一篇
[Day05] 拾起武器- Data Preprocessing(04)
系列文
Machine Learning A-Z 學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言