客户逾期贷款预测[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.由于网格调参十分耗时,所以在选择参数范围时应该更加有针对性,目前只是盲目划分。

参考

网格搜索调参

交叉验证原理小结

猜你喜欢

转载自blog.csdn.net/truffle528/article/details/84379538