特徵選擇是機器學習中的核心概念之一,不相關或部分相關的特徵會對模型性能產生負面影響,也會有效能的問題,適當的挑選與目標變量最相關的特徵集,有助降低模型的複雜性,並最大限度地減少訓練和推理所需的資源。這在您可能處理 TB 級數據或服務數百萬個請求的生產模型中具有更大的影響,這篇將實作出5個不同的特徵選擇,可從中取其優。
sklearn.ensemble.RandomForestClassifier
進行示範,程式碼參考 Machine Learning Data Lifecycle in Production 課程,經過改並以不同資料及呈現過程,執行細節請參見 Colab 實作範例 。整理特徵 X ,部分屬於分類資料可以用 One-Hot Encoding編碼,並且處理無效欄位。
定義評估模型,固定以 RandomForestClassifier
模型進行訓練,並對照各測試資料集之績效。
def use_RandomForestClassifier_evaluation_metrics_on_test_set(X,Y):
X_train, X_test, Y_train, Y_test = train_test_split(
X, Y, test_size = 0.2 ,stratify=Y, random_state = 9527)
# 標準化
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
# RandomForestClassifier訓練模型
model = RandomForestClassifier(criterion='entropy', random_state=9527)
model.fit(X_train_scaled, Y_train)
# 預測
y_predict_result = model.predict(X_test_scaled)
# 回傳evaluation_metrics_on_test_set
return {
'accuracy' : accuracy_score(Y_test, y_predict_result),
'roc' : roc_auc_score(Y_test, y_predict_result),
'precision' : precision_score(Y_test, y_predict_result),
'recall' : recall_score(Y_test, y_predict_result),
'f1' : f1_score(Y_test, y_predict_result),
'Feature Count' : len(X.columns)
}
查看關聯性,越淺代表高度正相關,越深代表高度負相關,關聯性介於 [1,-1] 之間。
選擇具有與其他特徵高度相關的某特徵 ,設定閾值選取符合特徵,並移除該特徵。本次實作挑選的是 FamilySize
,選擇超過門檻值的有代表性的特徵(無論正負相關 >0.2 ),並移除 FamilySize
本身。
# 取得具有與其他部分特徵高度相關的某特徵絕對值
cor_target = abs(cor["FamilySize"])
# 選擇高度相關的特徵(閾值 = 0.2)
relevant_features = cor_target[cor_target>0.2]
# 選擇特徵名稱
names = [index for index, value in relevant_features.iteritems()]
# 刪除目標特徵
names.remove('FamilySize')
print(names)
sklearn.feature_selection.SelectKBest
選擇最具影響力的特徵,這邊示範 選取 10
個特徵。sklearn.feature_selection.RFE
篩選,設定篩選出 k=10
個重要特徵,該設定也是超參數,您可以自行設定。
# Recursive Feature Elimination
def rfe_selection( X , Y, k=10):
# Split train and test sets
X_train, X_test, Y_train, Y_test = train_test_split(
X,
Y,
test_size = 0.2,
stratify=Y,
random_state = 9527)
scaler = StandardScaler().fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
model = RandomForestClassifier(
criterion='entropy',
random_state=9527
)
rfe = RFE(model, k)
rfe = rfe.fit(X_train_scaled, Y_train)
feature_names = X.columns[rfe.get_support()]
return feature_names
sklearn.feature_selection.SelectFromModel
選擇,以 threshold=0.013
作為篩選。經過一系列的特徵選擇,您可以視需求選擇所要採取的特徵,您追求準確率的話「遞迴特徵消除 Recursive feature elimination (RFE) 」分數最高,原本特徵從16個減少為10個,成功減少 37.5% ,運算資源可以大幅減少,而且各項指標成績都優於全數選取的結果。
您會發現過程中有許多超參數是可以自行調整的,在您的手上或許仍有優化空間,譬如將RFE的特徵改 k=9 試試看,性能與成績還可以再提升。