不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第1张图片

本文已在公众号 “ 数据分析与商业实践 ” 首发,源数据与源代码可空降文末

本文将会包含如下知识点
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第2张图片

数据读入

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第3张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第4张图片

数据说明

  • obey:违约情况,1-违约;0-履约
  • gender:性别,1-男,0-女
  • AGE:年龄;
  • edu_class: 教育阶层,0-3 分别表示初中,高中,大专,大学
  • nrProm:n recent promotion / month 最近一个月的电话营销次数
  • prom:最近一周是否有打电话
  • telephone_service: 客户是否有过电话投诉

数据探索

对各分类变量进行数量上的统计

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第5张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第6张图片

将连续变量转化为分类变量

连续变量的存在是使决策树模型不稳定的主要原因之一,这里使用等宽分箱

而且将连续变量转化为类别变量后,可以与其他类别变量一起,都直接使用卡方检验或方差分析,写成函数快捷操作也更方便。

等宽分箱:每个分箱中的样本量一致
等深分箱:每个分箱中的取值范围一致

# 数据集中的两个连续变量
bins_label = [1, 2, 3, 4, 5]

df['AGE'] = pd.qcut(x=df['AGE'], q=5, labels=bins_label)
df['duration'] = pd.qcut(x=df['duration'], q=5, labels=bins_label)

方差分析与卡方检验

  • 多分类使用方差分析如 obey 与 AGE, edu_class, nrProm
  • 二分类用卡方检验或方差分析如 obey 与 gender,posTrend,prom,telephone_service

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第7张图片

插播一条样本量和置信水平 α_level 的注意点(置信水平 α 的选择经验)
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第8张图片
样本量过大,α-level 就没什么意义了。数据量很大时,p 值就没用了,样本量通常不超过 5000,所以为了证明两变量间的关系是稳定的,样本量要控制好。

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第9张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第10张图片
上述代码框可以反复运行几次,避免随机抽样不平均或有例外,可以发现除了最不显著的 prom 和也不怎么显著的 nrProm 和 edu_class 外,其他变量都十分显著,刷新多次就会发现,来来去去都是这三个变量不怎么显著

筛选变量

去除 prom 与 nrProm 这两个变量,剩下的用于后续建模

data = df.drop(columns=['edu_class', 'prom', 'nrProm'])
data.sample(3)

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第11张图片

决策树建模

定义树

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第12张图片

拆分测试集与训练集

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第13张图片

训练定义好的树并进行预测

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第14张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第15张图片

模型评估

在测试集上的表现
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第16张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第17张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第18张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第19张图片

这里表现出了过渡拟合的情况,毕竟决策树往死里建的话可以精确到每一位用户,那模型的泛化性便大打折扣。比较好的模型是 trainning 和 test 的曲线都往左上角突出,而且两条线几乎是没有间隔。这也解释了为什么我们需要对测试集和训练集都进行预测,其实是为了这一步的画图工作。上图中,红train 与 蓝test 之间有不少间隔,说明模型在训练集上的表现比训练集要好,训练集表现更好 – 过度拟合(因为模型记住了训练集中的一些噪声点,说明可能需要回到开头处理一下异常值或者在拆分测试训练集的时候下点其他功夫如交叉验证等),又或者是建模参数的选择方面出了问题,总之需要根据实际情况探索是什么原因导致了在测试集上的表现相对减弱,即模型的泛化能力降低了).其中的一个解决办法是我们可以考虑降低模型的复杂度,拔高一下模型在测试集的表现,模型在训练集的表现稍微降一点点也没事。

至于 ROC 曲线与 AUC 等模型评估指标的理解,可参考文章:

趣析逻辑回归模型评价指标

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第20张图片
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第21张图片

再次看出模型在测试集与训练集的表现上的差距还是比较大的。

模型优化

梯度优化

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第22张图片
重复模型评估的步骤与查看模型预测结果
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第23张图片

果然,牺牲了小部分在训练集上的精准度,换来了模型更高的泛化性,过拟合的问题得到了较好的解决。

查看“最优”模型的各种参数,并重新建模

# 下面这行代码将显示出决策树建模中各种参数的最优组合
clfcv.best_params_

# 用 best_params 得出的最佳组合进行建模,需要手动输入参数。
clf = tree.DecisionTreeClassifier(criterion='gini', max_depth=3,
                                  min_samples_split=4) 
clf.fit(X_train, y_train)  #  使用训练数据建模,建模结果便是调优前后对比图中的下半部分,这里不再显示

可视化决策树

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第24张图片

不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第25张图片

注:相关数据源和超详细的代码(python,Jupyter Notebook 版本 + 详细注释)已经整理好,在 “ 数据分析与商业实践 ” 公众号后台回复 “ 决策违约 ” 即可获取。

在这里插入图片描述
案例实战 | 逻辑回归实现客户流失预测

案例实战 | Python 实现 RFM 模型

后续会不断更新常见场景下的 Python 实践
不到70行Python代码,轻松玩转决策树预测客户违约模型(附案例数据与代码)_第26张图片

你可能感兴趣的:(#,项目实战,决策树,机器学习,python,数据分析)