Python留出法与n折交叉验证的对比,5折交叉验证和15折交叉验证的区别(循环绘制ROC曲线)

模型的检验

1.用留出法(80%训练集,20%测试集)拆分数据,用训练集训练逻辑回归模型,并在测试集数据上验证模型的效果(以AUC为标准)。

一个模型很重要的是其在新样本的预测能力,因此只在原数据集上回测检验模型评估其拟合能力往往是不够的,还需要评估模型的泛化能力,就是评估模型对新样本(测试集)的预测能力。这里使用留出法将数据分为训练集和测试集,将800条数据用来训练模型,并将得到的模型在200条数据的测试集上进行预测,进行模型精度的评价,得到对应的ROC曲线和AUC值。

#绘制测试集的ROC曲线
lw = 2
plt.figure(figsize=(5,5),dpi=200)
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_prob, pos_label=1)
auc=round(metrics.roc_auc_score(y_test, y_prob),3)
plt.plot(fpr, tpr, color='steelblue',lw=lw, label='ROC curve (Area & Auc = %0.2f)' % auc) ###假正率为横坐标,真正率为纵坐标做曲线
plt.plot([0, 1], [0, 1], color='#8b8b8b', lw=lw, linestyle='--')
plt.xlim([-0.05, 1.05])
plt.ylim([-0.05, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC_Curve')#Receiver operating characteristic example
plt.legend(loc="lower right")
plt.show()

在这里插入图片描述

如图ROC曲线图,ROC曲线横轴为正确预测的比率(TPR),纵轴为错误预测的比率(FPR)。根据该模型ROC曲线上下的面积,计算模型的AUC值约为0.80,又因在测试集预测得出的结果,可以初步说明该模型在新样本(预测)的预测能力较强,模型的泛化能力较强。但经过多次单独建立模型,发现相同数据得到AUC值并不完全一样,有时0.7有时0.8,可见使用留出法建立模型的AUC值不是特别稳定。使用留出法建立模型的ROC曲线没有在原数据回测模型光滑,一个得到200个预测结果,一个得到1000条预测结果。ROC曲线变得不光滑的原因很可能是测试集样本量变少且模型特征分布不均匀,导致TPR和FPR在不同区间变化不稳定。

2.用15折交叉验证法拆分数据,每次用训练集训练逻辑回归模型,并在测试集数据上验证模型模型的效果(以AUC为标准)

在检验模型对新样本(测试集)预测能力的过程中,可以使用n折交叉验证的方法检验模型的过拟合和欠拟合现象。在数据和模型其他变量保持不变的情况下,按照数据的索引划分了十五次训练集和测试集,并单独用各份数据的训练集训练模型并在测试集上进行预测,完成了对该数据集的15折交叉验证,计算每次试验的AUC值后得到下表:

15折交叉验证AUC: 0.862 0.85 0.846 0.804 0.776 0.774 0.745 0.739 0.731 0.719 0.705 0.659 0.645 0.628

在该数据集的15折交叉验证中,十五个模型AUC值的均值约为0.7521,模型AUC值的最大值约为0.862,最小值约为0.628,极差为0.234。由于AUC均值和最值有较大出入,可以初步预估AUC值约为0.862的模型很可能存在一定的过拟合现象,AUC值约为0.628的模型很可能存在一定的欠拟合现象。模型经过15折交叉验证所产生AUC值的极差较大,可见该数据集的数据的特征分布不是十分均匀,其训练集和测试集的划分在一定程度上影响该模型的精度AUC值,影响模型对新样本的预测能力,因此需要根据15折交叉验证的结果进行模型的选择或优化,最大程度减少模型的过拟合或欠拟合现象。

3.将题1和2的结果与TASK5的结果对比并说明。

使用留出法对数据集进行一次划分得到模型的AUC值约为0.80,而15折交叉验证15次划分数据集得到模型的AUC均值为0.752。15折交叉验证的模型精度低于留出法的模型精度,可以预估题1留出法得到的模型存在一定的过拟合现象。如果以题1数据集划分所建立的模型为后续模型优化和业务结论的基础,就需要处理模型的过拟合现象,使用惩罚项降低模型的复杂程度,降低模型过拟合的可能性。

为了更好的让留出法所建立模型和15折交叉验证进行对比,在模型的建立上进行进一步分析,在数据和其他变量保持不变的情况下,进一步绘制出15折交叉验证的ROC曲线:

from sklearn.model_selection import KFold
k_fold=KFold(n_splits=15)
i=1
AUC= []
plt.figure(figsize=(17,17),dpi=200)
for train_index, test_index in k_fold.split(data_new):
    logit=sm.Logit(data_new.loc[train_index,'是否按期还款_1'], data_new.loc[train_index,train_cols])
    result=logit.fit()
    y_prob=result.predict(data_new.loc[test_index,train_cols])
    auc=metrics.roc_auc_score(data_new.loc[test_index,'是否按期还款_1'], y_prob)
    plt.subplot(5,5,i)
    fpr, tpr, thresholds = metrics.roc_curve(data_new.loc[test_index,'是否按期还款_1'], y_prob, pos_label=1)
    auc1='AUC:'+str(round(auc,3))
    plt.plot(fpr, tpr,linewidth=2.5) #绘制ROC曲线图
    plt.plot([0, 1], [0, 1], color='#8b8b8b', lw=2, linestyle='--')
    plt.text(x=0.3,y=0.45,s=auc1,fontsize=15)#
    plt.title("第"+str(i)+"次实验的ROC曲线")
    i+=1
    AUC.append(auc)
plt.show()
print("经过15折交叉验证,逻辑回归的AUC的均值为:%0.4f"%(sum(AUC)/len(AUC)))

在这里插入图片描述

图2:15折交叉验证ROC曲线图
如图2交叉验证ROC曲线图,15折交叉验证中每次试验得到的ROC曲线比留出法模型的ROC曲线更不光滑,一是15折试验是将数据分成了15份每份,每份预测得66个结果少于留出法处理后建模预测得到的200条结果,也因此可以很明显地看出数据集的特征分布不均匀现象,比如第一个红框所指模型很有可能存在过拟合现象,第二个红框很可能存在欠拟合现象。
图3:5折交叉验证ROC曲线图
图3:5折交叉验证ROC曲线图
如5折交叉验证ROC曲线图,留出法建立的模型是将训练集和测试集按照8:2的比例进行分开,也就相当于五折交叉验证中偶然选择了随机的一组数据建模,其AUC值可能是0.8,0.7或0.6。因为数据特征分布不均匀,有的数据训练出来的模型会产生过拟合现象,有的模型会出现欠拟合的现象。再次说明了在该数据集建模的过程中,训练集和测试集的划分在一定程度上影响该模型的精度AUC值,影响模型对新样本的预测能力,也再次说明仅仅是划分一次训练集和测试集的模型是不具有强说服力的,需要根据15折交叉验证的结果对进行模型的选择或优化,就需要使用惩罚项降低模型的拟合程度,降低模型的复杂程度。

4.模型验证的总结:

如果所选模型AUC远高于交叉验证得到的均值,存在过拟合现象,就需要使用惩罚项降低模型的拟合程度,降低模型的复杂程度。如果所选模型的AUC远低于交叉验证得到的均值,可以说明模型存在一定的欠拟合现象,可以通过增加模型的迭代次数等方法,增加模型对数据的描述能力。降低模型的过拟合或欠拟合的可能性。最终使得模型的复杂度和模型对数据的描述能力达到均衡,从而提高模型对客户是否按期还款的预测能力,进行客户人群的精准细分。提高模型对互联网征信相关业务问题的解决能力,比如减少预测失败所导致客户流失的可能,降低未按期还款客户的广告成本等等。

参考文献:
[1]王聪,韩志,胥仲桥,王丽莎.基于逻辑回归的中小微企业信贷策略研究[J].商讯,2021(02):91-92.

  • 模型和学习笔记系列2_END

点赞和收藏是周更的动力,真心谢谢!

欢迎交流和讨论,有偿纠错。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值