機器學習_ML_OneHotEncoder_獨熱編碼
說明
官方文件在另篇中我們說明了標籤轉置,用於label(目標類別)的時候是萬無一失,但是用於特徵呢?
很遺憾的,即使是0,1,2,3…對於整個模型的計算還是會有影響,這時候我們就必需改透過獨熱編碼來處理,一起來看sklearn怎麼幫我們達成。
IMPORT
from sklearn.preprocessing import OneHotEncoder
範例
資料集如下:類別 | 身高 | 體重 | 性別 | 年紀 |
---|---|---|---|---|
胖 | 175 | 70 | 男 | 35 |
瘦 | 160 | 50 | 女 | 31 |
瘦 | 175 | 男 | 27 | |
胖 | 180 | 80 | 女 | |
胖 | 180 | 100 | 男 | 18 |
# 載入需求lib
import numpy as np
import pandas as pd
# 獨熱編碼套件
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
# 手動寫入資料集,資料假裝透過插補完成了
ds = [
('胖',175,70,'男',35),
('瘦',160,50,'女',31),
('瘦',175,75,'男',27),
('胖',180,80,'女',27.5),
('胖',180,100,'男',18)]
columns = ['label','high','weight','sex','years']
# 假裝一下資料載入pandas,比較有fu
df = pd.DataFrame.from_records(ds,columns=columns)
# 確認資料是否載入pandas
df
# 資料拆分
X = df.iloc[:,1:].values
y = df.iloc[:,0].values
# 確認y的狀態
y
>>>array(['胖', '瘦', '瘦', '胖', '胖'], dtype=object)
# 標籤轉換
y_labelencoder = LabelEncoder()
y = y_labelencoder.fit_transform(y)
>>>array([1, 0, 0, 1, 1], dtype=int64)
X_labelencoder = LabelEncoder()
X[:,2] = X_labelencoder.fit_transform(X[:,2])
>>>array([1, 0, 1, 0, 1], dtype=int64)
# 獨熱編碼
# 需利用categorical_features來指定預執行獨熱編碼的index
onehotencoder = OneHotEncoder(categorical_features=[2])
X_hot = onehotencoder.fit_transform(X).toarray()
# 檢核X_hot
X_hot
使用Pandas
事實上,在轉獨熱編碼的時候,我還是習慣使用pandas。pd.get_dummies(df[['high', 'weight', 'sex', 'years']])
沒有留言:
張貼留言