iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

機器學習入門系列 第 26

ML_Day26(類別型特徵處理)

這個章節要介紹類別型特徵處理,要訓練模型時,data必須要是數值形式,所以要將類別型的特徵進行轉換,以下是我參加機器學習百日馬拉松所練習的題目,因為簡單易懂,所以提供給想從入門的朋友參考。

以下兩種編碼方式是類別型特徵常用的轉換方法:

  • 標籤編碼 ( Label Encoding )
    https://ithelp.ithome.com.tw/upload/images/20191008/20116157Xn1nffi3aa.png

  • 獨熱編碼 ( One Hot Encoding )
    https://ithelp.ithome.com.tw/upload/images/20191008/20116157ozvuieNYsB.png

標籤編碼 / 獨熱編碼的比較
https://ithelp.ithome.com.tw/upload/images/20191008/20116157Rsx55pk0IU.png

  • 非深度學習時,類別型特徵建議預設採標籤編碼; 深度學習時,預設採獨熱編碼
  • 因非深度學習時主要是樹狀模型 (隨機森林 / 梯度提升樹等基於決策樹的模型,不熟的話可以參考ML_Day17(隨機森林(Random Forest))),⽤兩次⾨檻就能分隔關鍵類別; 但深度學習主要依賴倒傳遞,標籤編碼會不易收斂

類別標籤實作

import pandas as pd
import numpy as np
import copy, time
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.preprocessing import LabelEncoder

data_path = '../data/'
df_train = pd.read_csv(data_path + 'house_train.csv.gz')
df_test = pd.read_csv(data_path + 'house_test.csv.gz')

train_Y = np.log1p(df_train['SalePrice'])
ids = df_test['Id']
df_train = df_train.drop(['Id', 'SalePrice'] , axis=1)
df_test = df_test.drop(['Id'] , axis=1)
df = pd.concat([df_train,df_test])
object_features = []
for dtype, feature in zip(df.dtypes, df.columns):
    if dtype == 'object':
        object_features.append(feature)
print(f'{len(object_features)} Object Features : {object_features}\n')

['MSZoning', 'Street', 'Alley', 'LotShape', 'LandContour', 'Utilities', 'LotConfig', 'LandSlope', 'Neighborhood', 'Condition1', 'Condition2', 'BldgType', 'HouseStyle', 'RoofStyle', 'RoofMatl', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'ExterQual', 'ExterCond', 'Foundation', 'BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2', 'Heating', 'HeatingQC', 'CentralAir', 'Electrical', 'KitchenQual', 'Functional', 'FireplaceQu', 'GarageType', 'GarageFinish', 'GarageQual', 'GarageCond', 'PavedDrive', 'PoolQC', 'Fence', 'MiscFeature', 'SaleType', 'SaleCondition'],找出類別型欄位,以便後續做轉換。

標籤編碼 + 線性回歸

df_temp = pd.DataFrame()
for c in df.columns:
    df_temp[c] = LabelEncoder().fit_transform(df[c])
train_X = df_temp[:train_num]
estimator = LinearRegression()
start = time.time()
print(f'shape : {train_X.shape}')
print(f'score : {cross_val_score(estimator, train_X, train_Y, cv=5).mean()}')
print(f'time : {time.time() - start} sec')

score : 0.6615606866851304
time : 0.240739107131958 sec

獨熱編碼 + 線性迴歸

df_temp = pd.get_dummies(df)
train_X = df_temp[:train_num]
estimator = LinearRegression()
start = time.time()
print(f'score : {cross_val_score(estimator, train_X, train_Y, cv=5).mean()}')
print(f'time : {time.time() - start} sec')

score : -7.147129671268879e+22
time : 0.10600709915161133 sec


上一篇
ML_Day25(去除離群值)
下一篇
ML_Day27(相關係數簡介)
系列文
機器學習入門28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言