任务
使用网格搜索对模型进行调优并采用五折交叉验证的方式进行模型评估
实现
之前已经进行过数据探索,缺失值和异常值处理、特征生成、特征删除、缩放等处理,具体可见前几篇博客。本文只进行带交叉验证的网格搜索调参,然后与调参前评分做比较。
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.由于网格调参十分耗时,所以在选择参数范围时应该更加有针对性,目前只是盲目划分。