算法实践TASK4:模型调优
1.任务:
使用网格搜索法对7个模型进行调优(调参时采用五折交叉验证的方式),并进行模型评估。
2.知识点介绍:
网格搜索法(Grid Search):一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
原始数据划分为3份,分别为:训练集、验证集和测试集;其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏。
然而,这种间的的grid search方法,其最终的表现好坏与初始数据的划分结果有很大的关系,为了处理这种情况,我们采用交叉验证的方式来减少偶然性。
交叉验证经常与网格搜索相结合,这种调参方法叫做grid search with cross validation。在sklearn中有实现这个功能的类GridSearchCV,这个类实现了fit,predict,score等方法,被当做了一个estimator,使用fit方法,该过程中:(1)搜索到最佳参数;(2)实例化了一个最佳参数的estimator。这个方法的主要缺点是比较耗时!
参照原文
3.代码实现:
导入数据包:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler #数据标准化数据包
from sklearn.model_selection import GridSearchCV #新增GridSearch
模型构建:
#模型构建
#GridSearchCV(estimator, param_grid, ... cv=None, ...)
param_lr = {'C':[0.1, 1, 10, 100]}
lr_model= GridSearchCV(LogisticRegression(solver='lbfgs', max_iter=1000), param_lr, cv=5)
param_svm = {'C':[0.1, 1, 10, 100]}
svm_model = GridSearchCV(SVC(probability=True), param_lr, cv=5)
params_dt = {'criterion': ['gini', 'entropy']}
dt_model = GridSearchCV(DecisionTreeClassifier(), params_dt, cv=5)
params_grid = {'n_estimators':range(20,81,10)}
rf_model = GridSearchCV(RandomForestClassifier(), params_grid, cv=5)
gbdt_model = GridSearchCV(GradientBoostingClassifier(),params_grid, cv=5)
xgb_model = GridSearchCV(XGBClassifier(),params_grid, cv=5)
lgbm_model = GridSearchCV(LGBMClassifier(),params_grid, cv=5)
模型优化:
for name, clf in models.items():
clf.fit(X_train,y_train)
print(clf.best_params_)
y_test_pred = clf.predict(X_test)
acc = metrics.accuracy_score(y_test, y_test_pred)
p = metrics.precision_score(y_test, y_test_pred)
r = metrics.recall_score(y_test, y_test_pred)
f1 = metrics.f1_score(y_test, y_test_pred)
y_test_proba = clf.predict_proba(X_test)
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_test_proba[:,1])
auc = metrics.auc(fpr, tpr)
df_result.loc[row] = [name, acc, p, r, f1, auc]
row += 1
# 模型的ROC曲线
plt.plot(fpr, tpr, lw=2, label=name+'ROC curve (auc = %0.2f)' % auc)
# 画对角线
plt.plot([0,1], [0,1], lw=2, linestyle='--')
# 固定横轴和纵轴的范围
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.legend()
plt.show()
print(df_result)
输出:
{'C': 0.1}
{'C': 1}
{'criterion': 'gini'}
{'n_estimators': 80}
{'n_estimators': 50}
{'n_estimators': 30}
{'n_estimators': 30}
Model Accuracy Precision Recall F1 score AUC
0 LR 0.783462 0.630208 0.337047 0.439201 0.755829
1 SVM 0.782761 0.709402 0.231198 0.348739 0.754259
2 DT 0.648914 0.354508 0.481894 0.408501 0.593475
3 RF 0.775053 0.626667 0.261838 0.369352 0.744741
4 GBDT 0.767344 0.574586 0.289694 0.385185 0.753967
5 XGBoost 0.776454 0.621951 0.284123 0.390057 0.764929
6 LightGBM 0.768746 0.592357 0.259053 0.360465 0.746740
上次任务的图片(上图)与这次任务图片的对比(下图)。