• 机器学习:基于AdaBoost算法模型对信用卡是否违约进行识别


    在这里插入图片描述

    系列文章目录

    作者:i阿极

    作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页

    😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

    📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


    大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持



    1、AdaBoost基本原理

    AdaBoost是一种通过改变训练样本权重来学习多个弱分类器并线性组合成强分类器的Boosting算法。一般来说,Boosting方法要解答两个关键问题:

    • 一是在训练过程中如何改变训练样本的权重或者概率分布
    • 二是如何将多个弱分类器组合成一个强分类器。

    针对这两个问题,AdaBoost的做法非常朴素:

    • 一是提高前一轮被弱分类器分类错误的样本的权重,而降低分类正确的样本的权重
    • 二是对多个弱分类器进行线性组合,提高分类效果好的弱分类器的权重,降低分类误差率高的弱分类器的权重。

    给定训练集
    在这里插入图片描述
    其中
    在这里插入图片描述
    AdaBoost训练算法如下:
    (1) 初始化训练数据样本的权重分布,即为每个训练样本分配一个初始权重:
    在这里插入图片描述
    (2) 对于t = 1,2,3,…,T,分别执行以下步骤:
    (a) 对包含权重分布 D t D_t Dt的训练集进行训练并得到弱分类器 G t ( x ) G_t(x) Gt(x)。 
    (b) 计算 G t ( x ) G_t(x) Gt(x)在当前加权训练集上的分类误差率:

    ϵ t = P ( G t ( x i ) ≠ y i ) = ∑ i = 1 N w t i I ( G t ( x i ) ≠ y i ) \epsilon_t=P\left(G_t\left(x_i\right) \neq y_i\right)=\sum_{i=1}^N w_{t i} I\left(G_t\left(x_i\right) \neq y_i\right) ϵt=P(Gt(xi)=yi)=i=1NwtiI(Gt(xi)=yi)

    (c )根据分类误差率计算当前弱分类器的权重系数 α t \alpha_t αt

    α t = 1 2 log ⁡ 1 − ϵ t ϵ t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt=21logϵt1ϵt

    (d) 调整训练集的权重分布:
    在这里插入图片描述

    其中 Z t Z_t Zt为归一化因子, Z t = ∑ i = 1 N w i exp ⁡ ( − α t y i G t ( x i ) ) Z_t=\sum_{i=1}^N w_i \exp \left(-\alpha_t y_i G_t\left(x_i\right)\right) Zt=i=1Nwiexp(αtyiGt(xi))

    (3) 最后构建 T T T个弱分类器的线性组合:
    在这里插入图片描述
    最终的强分类器可以写为:
    在这里插入图片描述

    根据 α t = 1 2 log ⁡ 1 − ϵ t ϵ t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt=21logϵt1ϵt的弱分类器权重系数计算过程中,当弱分类器的分类误差率 ϵ t ⩽ 1 2 \epsilon_t \leqslant \frac{1}{2} ϵt21时, 0 ⩽ α t 0 \leqslant\alpha_t 0αt,且 α t \alpha_t αt随着 ϵ t \epsilon_t ϵt的减小而变大,这也正是弱分类器权重系数计算公式的设计思想,它能够使得分类误差率较低的分类器有较大的权重系数。

    根据
    在这里插入图片描述
    训练样本权重分布可以写为:
    在这里插入图片描述
    当样本被弱分类器正确分类时,它的权重变小;当样本被弱分类器错误分类时,它的权重变大。相比之外,错误分类样本的权重增大了 e 2 α t \mathrm{e}^{2 \alpha_t} e2αt倍,这就使得在下一轮训练中,算法将更加关注这些误分类的样本。

    以上就是AdaBoost算法的基本原理。可以看到,算法步骤非常直观易懂,巧妙的算法设计能够非常好地回答Boosting方法的两个关键问题。上述关于AdaBoost的理解可以视为该模型的经典版本。

    2、实验环境

    Python 3.9

    Anaconda

    Jupyter Notebook

    3、AdaBoost函数语法

    AdaBoostClassifier分类器

    AdaBoostClassifier(base_estimator=None, n_estimators=50, 
                           learning_rate=1.0, algorithm='SAMME.R', random_state=None)
    
    • 1
    • 2

    AdaBoostClassifier回归器

    AdaBoostRegressor(base_estimator=None, n_estimators=50, 
                      learning_rate=1.0, loss='linear', random_state=None)
    
    • 1
    • 2
    • base_estimator:用于指定提升算法所应用的基础分类器,默认为分类决策树(CART),也可以是其他基础分类器,但分类器必须支持带样本权重的学习,如神经网络。
    • n_estimators:用于指定基础分类器的数量,默认为50个,当模型在训练数据集中得到完美的拟合后,可以提前结束算法,不一定非得构建完指定个数的基础分类器。
    • learning_rate:用于指定模型迭代的学习率或步长,即对应的提升模型F(x)可以表示为F(x)=F_m−1(x)+υα_mf_m(x),其中的υ就是该参数的指定值,默认值为1;对于较小的学习率υ而言,则需要迭代更多次的基础分类器,通常情况下需要利用交叉验证法确定合理的基础分类器个数和学习率。
    • algorithm:用于指定AdaBoostClassifier分类器的算法,默认为’SAMME.R’,也可以使用’SAMME’;使用’SAMME.R’时,基础模型必须能够计算类别的概率值;一般而言,'SAMME.R’算法相比于’SAMME’算法,收敛更快、误差更小、迭代数量更少。
    • loss:用于指定AdaBoostRegressor回归提升树的损失函数,可以是’linear’,表示使用线性损失函数;也可以是’square’,表示使用平方损失函数;还可以是’exponential’,表示使用指数损失函数;该参数的默认值为’linear’。
    • random_state:用于指定随机数生成器的种子。

    4、案例实战——信用卡是否违约的识别

    4.1导入数据

    # 导入第三方包
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 读入数据
    default = pd.read_excel(r'D:\CSDN\machine learning\default of credit card.xls')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.2绘制饼图查看是否违约的客户比例

    plt.axes(aspect = 'equal')
    # 中文乱码和坐标轴负号的处理
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 统计客户是否违约的频数
    counts = default.y.value_counts()
    # 绘制饼图
    plt.pie(x = counts, # 绘图数据
            labels=pd.Series(counts.index).map({0:'不违约',1:'违约'}), # 添加文字标签
            autopct='%.1f%%' # 设置百分比的格式,这里保留一位小数
           )
    # 显示图形
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    4.3拆分为训练集和测试集

    # 导入第三方包
    from sklearn import model_selection
    from sklearn import ensemble
    from sklearn import metrics
    
    # 排除数据集中的ID变量和因变量,剩余的数据用作自变量X
    X = default.drop(['ID','y'], axis = 1)
    y = default.y
    # 数据拆分
    X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.25, random_state = 1234)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    使用train_test_split函数将数据集拆分为训练集和测试集。其中,参数X和y分别表示自变量和因变量,test_size表示测试集的比例(此处设置为0.25,即25%),random_state用于控制数据集的随机拆分,确保结果可重复。

    4.4构建Adaboost模型并预测

    # 构建AdaBoost算法的类
    AdaBoost1 = ensemble.AdaBoostClassifier()
    # 算法在训练数据集上的拟合
    AdaBoost1.fit(X_train,y_train)
    # 算法在测试数据集上的预测
    pred1 = AdaBoost1.predict(X_test)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.5返回模型的预测结果

    # 返回模型的预测效果
    print('模型的准确率为:\n',metrics.accuracy_score(y_test, pred1))
    print('模型的评估报告:\n',metrics.classification_report(y_test, pred1))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.6计算客户违约的概率值,用于生成ROC曲线的数据

    y_score = AdaBoost1.predict_proba(X_test)[:,1]
    fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
    # 计算AUC的值
    roc_auc = metrics.auc(fpr,tpr)
    
    # 绘制面积图
    plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
    # 添加边际线
    plt.plot(fpr, tpr, color='black', lw = 1)
    # 添加对角线
    plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
    # 添加文本信息
    plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
    # 添加x轴与y轴标签
    plt.xlabel('1-Specificity')
    plt.ylabel('Sensitivity')
    # 显示图形
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    4.7查看自变量的重要性排序

    importance = pd.Series(AdaBoost1.feature_importances_, index = X.columns)
    importance.sort_values().plot(kind = 'barh')
    plt.show()
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    4.8取出重要性比较高的自变量建模

    predictors = list(importance[importance>0.02].index)
    predictors
    
    # 通过网格搜索法选择基础模型所对应的合理参数组合
    # 导入第三方包
    from sklearn.model_selection import GridSearchCV
    from sklearn.tree import DecisionTreeClassifier
    
    max_depth = [3,4,5,6]
    params1 = {'base_estimator__max_depth':max_depth}
    base_model = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier()),
                              param_grid= params1, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
    base_model.fit(X_train[predictors],y_train)
    # 返回参数的最佳组合和对应AUC值
    base_model.best_params_, base_model.best_score_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    4.9通过网格搜索法选择提升树的合理参数组合

    # 导入第三方包
    from sklearn.model_selection import GridSearchCV
    
    n_estimators = [100,200,300]
    learning_rate = [0.01,0.05,0.1,0.2]
    params2 = {'n_estimators':n_estimators,'learning_rate':learning_rate}
    adaboost = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3)),
                            param_grid= params2, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
    adaboost.fit(X_train[predictors] ,y_train)
    # 返回参数的最佳组合和对应AUC值
    adaboost.best_params_, adaboost.best_score_
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    4.10使用最佳的参数组合构建AdaBoost模型

    AdaBoost2 = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3),
                                           n_estimators = 300, learning_rate = 0.01)
    # 算法在训练数据集上的拟合
    AdaBoost2.fit(X_train[predictors],y_train)
    # 算法在测试数据集上的预测
    pred2 = AdaBoost2.predict(X_test[predictors])
    
    # 返回模型的预测效果
    print('模型的准确率为:\n',metrics.accuracy_score(y_test, pred2))
    print('模型的评估报告:\n',metrics.classification_report(y_test, pred2))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    4.11计算正例的预测概率,用于生成ROC曲线的数据

    y_score = AdaBoost2.predict_proba(X_test[predictors])[:,1]
    fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
    # 计算AUC的值
    roc_auc = metrics.auc(fpr,tpr)
    
    # 绘制面积图
    plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
    # 添加边际线
    plt.plot(fpr, tpr, color='black', lw = 1)
    # 添加对角线
    plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
    # 添加文本信息
    plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
    # 添加x轴与y轴标签
    plt.xlabel('1-Specificity')
    plt.ylabel('Sensitivity')
    # 显示图形
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述


    📢文章下方有交流学习区!一起学习进步!💪💪💪
    📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
    📢你的支持和鼓励是我创作的动力❗❗❗

  • 相关阅读:
    虚拟机ubuntu20.04连不上网
    2024 年,我想和这个世界聊聊
    暑假视力如何保护?护眼台灯可以保护视力
    MySQL-索引详解(三)
    天地图自定义标记点
    [NSSCTF]-Reverse:[HUBUCTF 2022 新生赛]simple_RE(base64换表)
    Redis到底是AP还是CP?
    牛血清白蛋白标记微囊藻毒素(MCLR)(BSA-MCLR)
    Java毕业设计 基于SpringBoot vue养老院管理系统 微信小程序
    图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
  • 原文地址:https://blog.csdn.net/AOAIYI/article/details/131181480