客戶逾期貸款預測[6] - 網格搜尋調參和交叉驗證
阿新 • • 發佈:2018-12-04
任務
使用網格搜尋對模型進行調優並採用五折交叉驗證的方式進行模型評估
實現
之前已經進行過資料探索,缺失值和異常值處理、特徵生成、特徵刪除、縮放等處理,具體可見前幾篇部落格。本文只進行帶交叉驗證的網格搜尋調參,然後與調參前評分做比較。
from sklearn.model_selection import GridSearchCV,train_test_split from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from xgboost.sklearn import XGBClassifier from lightgbm.sklearn import LGBMClassifier X_std_train,X_std_test,y_train,y_test = train_test_split(X_std,y,test_size=0.3,random_state=1122) #網格搜尋調參 def gridSearch_vali(model,param_grid,cv=5): print("parameters:{}".format(param_grid)) grid_search = GridSearchCV(estimator=model,param_grid=param_grid,cv=cv,scoring='f1_micro') grid_search.fit(X_std_train,y_train) print("Best parameters for",model,"is:{}".format(grid_search.best_params_)) return grid_search.best_params_ print("邏輯迴歸") lr_param_temp = {'C':[0.1,1,5],'penalty':['l1','l2']} lr = LogisticRegression() lr_param = gridSearch_vali(lr,lr_param_temp) lr.set_params(**lr_param) lr.fit(X_std_train,y_train) print("決策樹") dtc_param_temp = {'max_depth':[3,4,5,6]} dtc = DecisionTreeClassifier() dtc_param = gridSearch_vali(dtc,dtc_param_temp) dtc.set_params(**dtc_param) dtc.fit(X_std_train,y_train) print("svm線性核") svm_param_temp = {"gamma":[0.01,0.1],"C":[0.01,1]} svm = SVC(kernel='linear',probability=True) svm_param = gridSearch_vali(svm,svm_param_temp) svm.set_params(**svm_param) svm.fit(X_std_train,y_train) print("xgboost") xgbc_param_temp = {'max_depth':[5,10],'learning_rate':[0.1,1]} xgbc = XGBClassifier() xgbc_param = gridSearch_vali(xgbc,xgbc_param_temp) xgbc.set_params(**xgbc_param) xgbc.fit(X_std_train,y_train) print("lightgbm") lgbc_param_temp = {'max_depth':[5,10],'num_leaves':[20,50]} lgbc = LGBMClassifier() lgbc_param = gridSearch_vali(lgbc,lgbc_param_temp) lgbc.set_params(**lgbc_param) lgbc.fit(X_std_train,y_train) print('all done!')
accuracy | precision | recall | f1 score | roc auc score | roc曲線 | |
邏輯迴歸 | 訓練集: 0.8082 測試集: 0.7841 |
訓練集: 0.6946 測試集: 0.6905 |
訓練集: 0.3702 測試集: 0.3737 |
訓練集: 0.4830 測試集: 0.4849 |
訓練集: 0.8086 測試集: 0.8098 |
|
線性svm | 訓練集: 0.8115 測試集: 0.7870 |
訓練集: 0.7602 測試集: 0.7471 |
訓練集: 0.3230 測試集: 0.3273 |
訓練集: 0.4534 測試集: 0.4552 |
訓練集: 0.8081 測試集: 0.8054 |
|
決策樹 | 訓練集: 0.8031 測試集: 0.7673 |
訓練集: 0.7131 測試集: 0.6609 |
訓練集: 0.3118 測試集: 0.2964 |
訓練集: 0.4339 測試集: 0.4093 |
訓練集: 0.7670 測試集: 0.7473 |
|
xgboost | 訓練集: 0.9519 測試集: 0.7793 |
訓練集: 0.9894 測試集: 0.6667 |
訓練集: 0.8099 測試集: 0.3763 |
訓練集: 0.8907 測試集: 0.4811 |
訓練集: 0.9949 測試集: 0.7914 |
|
lightgbm | 訓練集: 0.9651 測試集: 0.7821 |
訓練集: 0.9943 測試集: 0.6742 |
訓練集: 0.8609 測試集: 0.3840 |
訓練集: 0.9228 測試集: 0.4893 |
訓練集: 0.9967 測試集: 0.7987 |
大部分模型評分相比調參前都有上升,有些模型評分稍有下降,可能需要嘗試更多引數範圍。
問題
1.暫時不是很明白為什麼有些模型在調參之後訓練集的評分下降,測試集的評分升高,這種相反的趨勢是正常的嗎?
2.由於網格調參十分耗時,所以在選擇引數範圍時應該更加有針對性,目前只是盲目劃分。