算法实践TASK4:模型调优

算法实践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

上次任务的图片(上图)与这次任务图片的对比(下图)。
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值