1. 程式人生 > >客戶逾期貸款預測[6] - 網格搜尋調參和交叉驗證

客戶逾期貸款預測[6] - 網格搜尋調參和交叉驗證

任務

        使用網格搜尋對模型進行調優並採用五折交叉驗證的方式進行模型評估

實現

           之前已經進行過資料探索,缺失值和異常值處理、特徵生成、特徵刪除、縮放等處理,具體可見前幾篇部落格。本文只進行帶交叉驗證的網格搜尋調參,然後與調參前評分做比較。

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.由於網格調參十分耗時,所以在選擇引數範圍時應該更加有針對性,目前只是盲目劃分。

參考

網格搜尋調參

交叉驗證原理小結