关注一下~,更多商业数据分析案例等你来撩
本文包含的代码知识点如下导图,已在公众号“数据分析与商业实践”首发,欲获取源数据与包含详细注释的源代码可空降文末 ~~
数据读入
数据说明
- obey:违约情况,1-违约;0-履约
- gender:性别,1-男,0-女
- AGE:年龄;
- edu_class: 教育阶层,0-3 分别表示初中,高中,大专,大学
- nrProm:n recent promotion / month 最近一个月的电话营销次数
- prom:最近一周是否有打电话
- telephone_service: 客户是否有过电话投诉
数据探索
对各分类变量进行数量上的统计
将连续变量转化为分类变量
连续变量的存在是使决策树模型不稳定的主要原因之一,这里使用等宽分箱
而且将连续变量转化为类别变量后,可以与其他类别变量一起,都直接使用卡方检验或方差分析,写成函数快捷操作也更方便。
等宽分箱:每个分箱中的样本量一致
等深分箱:每个分箱中的取值范围一致
方差分析与卡方检验
- 多分类使用方差分析如 obey 与 AGE, edu_class, nrProm
- 二分类用卡方检验或方差分析如 obey 与 gender,posTrend,prom,telephone_service
插播一条样本量和置信水平 α_level 的注意点(置信水平 α 的选择经验)
样本量过大,α-level 就没什么意义了。数据量很大时,p 值就没用了,样本量通常不超过 5000,所以为了证明两变量间的关系是稳定的,样本量要控制好。
上述代码框可以反复运行几次,避免随机抽样不平均或有例外,可以发现除了最不显著的 prom 和也不怎么显著的 nrProm 和 edu_class 外,其他变量都十分显著,刷新多次就会发现,来来去去都是这三个变量不怎么显著
筛选变量
去除 prom 与 nrProm 这两个变量,剩下的用于后续建模
data = df.drop(columns=['edu_class', prom', 'nrProm'])
data.sample(3)
决策树建模
定义树
拆分测试集与训练集
训练定义好的树并进行预测
模型评估
在测试集上的表现
这里表现出了过渡拟合的情况,毕竟决策树往死里建的话可以精确到每一位用户,那模型的泛化性便大打折扣。比较好的模型是 trainning 和 test 的曲线都往左上角突出,而且两条线几乎是没有间隔。这也解释了为什么我们需要对测试集和训练集都进行预测,其实是为了这一步的画图工作。上图中,红train 与 蓝test 之间有不少间隔,说明模型在训练集上的表现比训练集要好,训练集表现更好 -- 过度拟合(因为模型记住了训练集中的一些噪声点,说明可能需要回到开头处理一下异常值或者在拆分测试训练集的时候下点其他功夫如交叉验证等),又或者是建模参数的选择方面出了问题,总之需要根据实际情况探索是什么原因导致了在测试集上的表现相对减弱,即模型的泛化能力降低了)。其中的一个解决办法是我们可以考虑降低模型的复杂度,拔高一下模型在测试集的表现,模型在训练集的表现稍微降一点点也没事。
至于 ROC 曲线与 AUC 等模型评估指标的理解,可参考文章
趣析逻辑回归模型评价指标mp.weixin.qq.com再次看出模型在测试集与训练集的表现上的差距还是比较大的。
模型优化
梯度优化
重复模型评估的步骤与查看模型预测结果
果然,牺牲了小部分在训练集上的精准度,换来了模型更高的泛化性,过拟合的问题得到了较好的解决。
查看“最优”模型的各种参数,并重新建模
# 下面这行代码将显示出决策树建模中各种参数的最优组合
clfcv.best_params_
# 用 best_params 得出的最佳组合进行建模,需要手动输入参数。
clf = tree.DecisionTreeClassifier(criterion='gini', max_depth=3,
min_samples_split=4)
clf.fit(X_train, y_train) # 使用训练数据建模,建模结果便是调优前后对比图中的下半部分,这里不再显示
可视化决策树
注:相关数据源和超详细的代码(python,Jupyter Notebook 版本 + 详细注释)已经整理好,在 “ 数据分析与商业实践 ” 公众号后台回复 “决策违约 ” 即可获取。
后续会不断更新常见场景下的 Python 实践