暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Xgboost简单建模——Kaggle项目GiveMeSomeCredit实战

数据风控学习笔记 2022-02-11
1748
Xgboost简单建模

Kaggle项目GiveMeSomeCredit实战

  逮噶猴,经过几个月的闭关修炼,小记逐渐掌握了一些python基础知识(随后也会逐渐通过公众号分享给大家),已经迫不及待磨拳擦掌地想要通过项目实战巩固下从B站和书本里学到的数据分析和风控建模技能了。正好碰上春节假期,二话不说,就从现在开始,着手做个项目试试看吧!

在自学数据分析和建模的过程中,很多小伙伴都希望能够寻找一些靠谱数据和项目练手,kaggle作为一个国际化的数据科学竞赛平台,可以说是小伙伴们试水的绝佳选择啦。小记就职于风控行业,接触最多了解最深的就是风控行业的数据分析及建模流程,所以本次特地选取了kaggle平台上的经典案例give me some credit,基于这个案例进行数据清洗、数据预处理、特征筛选、特征分箱、模型训练、模型评估和评分卡映射一系列的实操试验,并且持续分享在公众号里哦~

这次首先分享的是使用xgboost进行简单建模,xgboost具有高效率高精度的特点,在数据科学竞赛和工业生产中都有着广泛的运用,下面就是具体的建模流程啦:

数据源:give me some credit数据集

数据源介绍:

来源于kaggle官网,主要为个人在银行的基本信息及信贷信息。

数据源地址:https://www.kaggle.com/c/GiveMeSomeCredit/data

建模目标:通过某客户在过去的个人信息及信贷信息信贷信息预测该客户在未来两年经理财务困境的概率,为银行的授信决策提供依据。

评价标准:AUC

关注重点:使用xgboost进行简单建模

01

环境配置

    # 基本功能
    import pandas as pd
    import numpy as np


    # 画图
    import matplotlib.pyplot as plt
    import seaborn as sns
    # 数据处理
    from sklearn.model_selection import train_test_split
    from sklearn.model_selection import KFold, cross_validate
    from sklearn.preprocessing import OneHotEncoder
    import imblearn


    # 模型算法
    import xgboost as xgb


    # 模型评价
    from sklearn.metrics import roc_curve
    from sklearn.metrics import auc,roc_auc_score
    from sklearn.metrics import accuracy_score,confusion_matrix,f1_score
    from sklearn.model_selection import cross_val_score


    # 风控
    import toad
    from toad.plot import  bin_plot,badrate_plot


    # pd显示配置
    pd.set_option('precision',3)
    pd.set_option('display.float_format',lambda x:'{:.4f}'.format(x))


    # sns风格与装饰
    sns.set(style='whitegrid',font='Simhei')


    # 系统路径
    import os
    os.chdir(r'C:\Users\28779\Desktop\GiveMeSomeCredit\GiveMeSomeCredit')


    # 输出每个cell代码返回的所有结果
    from IPython.core.interactiveshell import InteractiveShell
    InteractiveShell.ast_node_interactivity = 'all'


    # 屏蔽提示
    import warnings
    warnings.filterwarnings('ignore')


    02

    读取数据

      # 训练数据示例
      data = pd.read_csv('cs-training.csv')

      数据字典信息如下:

        # 查看尾部两行
        data.tail(2)
        # 查看&重命名列
        data.columns
        data.drop(columns='Unnamed: 0',inplace=True)
        column = ['target', 'RevUtilOfUnsecLines', 'age',
              '30-59DPD', 'DebtRatio', 'MonthlyIncome',
              'NumOfOpCreAndLoans', 'NumOf90DPD',
              'NumReaEstLoansOrLines', '60-89DPD',
              'NumberOfDependents']
        data.columns = column
        data.head()

          # 区分特征与标签
          fea = ['RevUtilOfUnsecLines''age',
                '30-59DPD', 'DebtRatio', 'MonthlyIncome',
                'NumOfOpCreAndLoans', 'NumOf90DPD',
                'NumReaEstLoansOrLines', '60-89DPD',
                'NumberOfDependents']
          label = 'target'
          ex_lis = []
          03

          数据概览

            # 查看标签分布
            data.target.value_counts()
            print('坏样本浓度为{:.4f}%'.format(100*data.target.mean()))
            0    139974
            1 10026
            Name: target, dtype: int64
            坏样本浓度为6.6840%
              # 查看数据重复情况
              data.duplicated().sum()
              # 查询重复数据明细
              data[data.duplicated()]
              609
                # 查看数据缺失情况
                missing_num = data.isna().sum()
                missing_rate = data.isnull().sum()/(data.isna().count())
                df_missing = pd.DataFrame({'num':missing_num,'rate':missing_rate})
                df_missing.rate = df_missing.rate.apply(lambda x :'{:.4f}%'.format(100*x))
                df_missing

                  # 查看异常数据情况
                  plt.figure(figsize=(20,15),dpi=100)
                  for i in range(len(fea)):
                     plt.subplot(3,4,i+1)
                     sns.boxplot(y=data[fea[i]],orient='v',width=0.5)
                     plt.title(fea[i])
                  plt.tight_layout()
                  plt.show()


                  04

                  数据划分

                    # 抽取30%的验证集
                    X_train,X_test,y_train,y_test = train_test_split(  
                       data[fea],data[label],test_size=0.3,random_state=42)
                    data_training = pd.concat([X_train,y_train],axis=1)
                    data_test = pd.concat([X_test,y_test],axis=1
                    05

                    模型训练

                      # 参数设定
                      model_xgb = xgb.XGBClassifier(
                      objective='binary:logistic',
                      n_estimators= 200,
                      max_depth= 12,
                      min_child_weight= 1,
                      seed= 42,
                      subsample= 0.8,
                      reg_alpha= 0, #L1正则化项的系数,用于减轻过拟合
                      reg_lambda= 1,#L2正则化项的系数,用于减轻过拟合
                      verbosity=2,#训练日志打印等级
                      silent=0,
                                      nthread= -1,#并行线程数
                      n_jobs=-1,
                                      eta=0.01,#学习率,控制每次学习的权重缩减
                      gamma=10,#叶子节点分裂时的损失减少量下线
                                      scale_pos_weight=1,#样本权重,通常用于处理样本不均衡的情况
                      early_stopping_rounds = 200,
                      eval_metric= 'auc'
                      )
                        # 交叉验证
                        cv = KFold(n_splits=5,shuffle=True,random_state=1412)
                        model_xgb_cv = cross_val_score(model_xgb,X_train,y_train,cv=cv,scoring='roc_auc')
                        model_xgb_cv.mean()
                        model_xgb_cv.var()
                        0.8589933800296461
                        3.090204263415678e-05
                          # 模型训练
                          model_xgb.fit(X_train,y_train)
                          # 模型预测
                          y_pre_train_xgb = model_xgb.predict_proba(X_train)[:,1]
                          y_pre_test_xgb = model_xgb.predict_proba(X_test)[:,1]
                          06

                          模型预测

                            # 评估函数
                            def model_evaluate(y_true,y_pre):
                               '''
                               input:
                                   y_true,series,样本标签,0或1
                                   y_pre,series,样本预测值,范围不限
                               output:
                                   ks,auc,float,模型ks,auc指标值
                                   ROC
                               '''
                                 
                               fpr,tpr,thresholds=roc_curve(y_true,y_pre,pos_label=None,sample_weight=None,drop_intermediate=True)
                               ks_cal = abs(fpr-tpr)
                               ks = max(ks_cal)
                               print('ks:',ks)


                               auc = roc_auc_score(y_true,y_pre)
                               print('auc:',auc)


                               # plot
                               plt.figure()
                               plt.plot([0,1],[0,1],lw=2,linestyle='--')
                               plt.plot(fpr,tpr,label='ROC Curve')
                               plt.title('ROC Curve')
                               plt.xlabel('False Positive Rate')
                               plt.ylabel('True Positive Rate')
                               plt.legend()
                               plt.show()
                               
                               return ks,auc
                              # 模型评估
                              model_evaluate(y_train,y_pre_train_xgb)
                              model_evaluate(y_test,y_pre_test_xgb)

                              可以看到,经过训练后的Xgboost模型表现如下:

                              训练集:ks约为0.583,auc约为0.867

                              测试集:ks约为0.570,auc约为0.858


                              以上,我们建立了简单的Xgboost模型,并且取得了一个还不错的auc结果,但其实,其实这个过程中还有许多可以调整和提升的地方,例如缺失值的处理、模型参数的调整等,小记也会持续和大家分享~





                              数据风控学习笔记
                              微信公众号:datascience_notebook



                              文章转载自数据风控学习笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                              评论