文章目录

  • 构造数据
  • 决策树解决
  • 报错解决
  • 源码地址

构造数据

我们用pandas生成20条数据,其中标签为bad的数据有6条,标签为good的数据有14条,代码如下:

import pandas as pd
import numpy as npbad_df = pd.DataFrame(data={"sex":['男', '男', '女', '男', '女', '男'],"status":['单身', '已婚', '已婚', '单身', '已婚', '单身'],"age":[39, 25, 26, 26, 21, 27],"month":[15, 12, 12, 42, 30, 48],"amount":[1271, 1484, 609, 4370, 3441, 10961],"y":["bad"]*6,
})good_df = pd.DataFrame(data={"sex":['男','女','女','男','男','女','男','男','女','男','女','男','男','男'],"status":['单身','已婚','已婚','单身','单身','已婚','单身','单身','已婚','单身','已婚','单身','单身','单身'],"age":[29, 26, 26, 47, 32, 59, 56, 51, 31, 23, 28, 45, 36, 36],"month":[24, 12, 24, 15, 48, 15, 12, 6, 21, 13, 24, 6, 36, 12],"amount":[2333,763,2812,1213,7238,5045,618,1595,2782,882,1376,1750,2337,1542],"y":["good"]*14,
})df = pd.concat(objs=[bad_df,good_df],ignore_index=True)

数据中包括:sex(性别)、status(婚姻状况)、age(年龄)、month(贷款年限)、amount(贷款金额)、y(客户标签:good未逾期,bad逾期)。

数据预览如下:

sex status age month amount y
0 单身 39 15 1271 bad
1 已婚 25 12 1484 bad
2 已婚 26 12 609 bad
3 单身 26 42 4370 bad
4 已婚 21 30 3441 bad
5 单身 27 48 10961 bad
6 单身 29 24 2333 good
7 已婚 26 12 763 good
8 已婚 26 24 2812 good
9 单身 47 15 1213 good
10 单身 32 48 7238 good
11 已婚 59 15 5045 good
12 单身 56 12 618 good
13 单身 51 6 1595 good
14 已婚 31 21 2782 good
15 单身 23 13 882 good
16 已婚 28 24 1376 good
17 单身 45 6 1750 good
18 单身 36 36 2337 good
19 单身 36 12 1542 good

## 解决问题 **现在有一个人,sex=男,status=单身,age=24,month=12,amount=2000,根据上面的信息,判断y应该是good or bad?**

  • 根据上面的信息,并没有直接的答案,比如:当age<20,y就是bad。找不到类似这样的结论。
  • 可以选用决策树算法来判断,如下图。从上往下走,最后结果为1(bad)

决策树解决

优点:通俗易懂,便于理解

缺点:随着样本的改变而出现不同的树

sklearn地址:https://scikit-learn.org/stable/modules/tree.html

简单了解一下CART(Classification And Regression Tree)

  • 最核心的一个概念,GINI系数。
    G I N I k = T k T ∗ ( 2 ∗ T k 0 T k ∗ T k 1 T k ) + S T ∗ ( 2 ∗ T s 0 S ∗ T s 1 S ) GINI_k=\frac{T_k}{T}*(2*\frac{T_{k0}}{T_{k}}*\frac{T_{k1}}{T_k})+\frac{S}{T}*(2*\frac{T_{s0}}{S}*\frac{T_{s1}}{S}) GINIk​=TTk​​∗(2∗Tk​Tk0​​∗Tk​Tk1​​)+TS​∗(2∗STs0​​∗STs1​​)

T : 总样本数 T:总样本数 T:总样本数
T k : 第 k 个分组的样本数 T_k:第k个分组的样本数 Tk​:第k个分组的样本数
T k 0 : 第 k 个分组的样本中 y = 0 的样本数 T_{k0}:第k个分组的样本中y=0的样本数 Tk0​:第k个分组的样本中y=0的样本数
T k 1 : 第 k 个分组的样本中 y = 1 的样本数 T_{k1}:第k个分组的样本中y=1的样本数 Tk1​:第k个分组的样本中y=1的样本数
S = T − T k , 去掉 k 个分组之后的所有样本数据 S=T-T_k,去掉k个分组之后的所有样本数据 S=T−Tk​,去掉k个分组之后的所有样本数据
T s 0 : S 中 y = 0 的样本数 T_{s0}:S中y=0的样本数 Ts0​:S中y=0的样本数
T s 1 : S 中 y = 1 的样本数 T_{s1}:S中y=1的样本数 Ts1​:S中y=1的样本数

  • 步骤:(数值型数据,比如收入)

    1. 对收入数据去重排序后,相邻的数据取平均数,得到A1,A2,A3,…
    2. 以A1,A2,A3,…为分界线,计算每一个A对应的GINI系数,
    3. 选择最小的GINI系数为分割点,继续第1,2步,直到达到条件结束。
    4. 最小的GINI系数小于阈值,结束。
    5. 数的深度(划分的区间)大于指定的区间,结束。
  • 步骤:(分类型数据,比如婚姻)
    1. 分类型数据,数据已经分好,比如分为单身(A1),已婚(A2),离婚(A3),其他(A4)
    2. 计算所有组合的GINI系数
    3. 选择最小的GINI系数为分割点,继续第1,2步,直到达到条件结束
    4. 最小的GINI系数小于阈值,结束。
    5. 数的深度(划分的区间)大于指定的区间,结束。
  • 决策树步骤:
    1. 计算所有特征每一个分组的GINI系数,最小的GINI系数为根节点,划分好数据
    2. 继续计算每个划分好的GINI系数,找出最小的GINI系数,为根节点,继续重复
    3. 最小的GINI系数小于阈值,结束。
    4. 数的深度(划分的区间)大于指定的区间,结束。

代码如下:

df2 = df.copy()
# 修改一下数据类型,
# sex:0(男),1(女)
# status:0(单身),1(已婚)
# y:0(good),1(bad)
df2["sex"] = df2["sex"].map(lambda x:0 if x=="男" else 1)
df2["status"] = df2["status"].map(lambda x:0 if x=="单身" else 1)
df2["y"] = df2["y"].map(lambda x:0 if x=="good" else 1)from sklearn import tree
X, y = df2.iloc[:,:-1],df2.iloc[:,-1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, y)import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
# graph.render("tree") pdf
iris = load_iris()
dot_data = tree.export_graphviz(clf, out_file=None,proportion=True, feature_names=['sex', 'status', 'age', 'month', 'amount',],  class_names=["0","1"],  filled=True, rounded=True,  special_characters=True)
graph = graphviz.Source(dot_data)

jupyter中查看graph结果如下:

graph

# 预测sex=男,status=单身,age=24,month=12,amount=2000,的结果
clf.predict(X=[[0,0,24,12,2000]])
# array([1])

预测结果为1,(bad),所以sex=男,status=单身,age=24,month=12,amount=2000的客户,可能为逾期用户。

报错解决

  • failed to execute WindowsPath(‘dot‘), make sure the Graphviz executables are on your systems‘ PATH

1、安装graphviz

pip install graphviz

2、打开 https://graphviz.org/download/ 官网下载对应的版本,例如:windows_10_cmake_Release_graphviz-install-8.0.3-win64.exe

3、安装时勾选 Add Graphviz to the system PATH for all users,点击下一步直到安装成功即可。

4、重启电脑即可解决

源码地址

链接:https://pan.baidu.com/s/1G2agrUMALP6oPfBeHdqRaQ?pwd=ogn3
提取码:ogn3

Python数据分析实战【十二】:机器学习决策树算法案例实战【文末源码地址】相关推荐

  1. Python数据分析实战【六】:用Python实现自动发送邮件和发送钉钉消息【文末源码地址】

    目录 发送邮件源码 发送钉钉消息源码 源码地址 本文可以学习到以下内容: 使用requests库发送钉钉消息 使用email和smtplib库发送邮件 使用163邮箱服务,自动发送邮件及附件 发送邮件 ...

  2. Python数据分析实战【九】:用Python处理省份城市编码数据【文末源码地址】

    文章目录 项目背景 项目代码 新增省份编码 获取编码映射数据 合并数据 统计省份用户数 使用SQL实现 源码地址 本文可以学习到以下内容: 免费获取全国省份.城市编码以及经纬度数 使用 pandas ...

  3. 用Python给娃送上一份猪年春节礼物。文末源码!

    随着农历猪年的到来,Pig的卡通形象以火爆的热度迅速成为大家心中的新一任萌宠,尤其是深受小朋友喜欢的小猪佩奇,作为一枚关心热点又家有小娃的非典型程序猿小编,也来蹭蹭热点,让我们用Python来送给娃一 ...

  4. Python数据分析实战【七】:用Python实现对Excel文件中的数据进行md5加密【文末源码地址】

    文章目录 获取数据 加密函数 数据加密 结尾 源码地址 本文可以学习到以下内容: 使用 pandas 中的 to_excel 生成 excel 数据 使用 pandas 中的 read_excel 读 ...

  5. “数字炸弹“——练习Python基础知识的小游戏【文末源码地址】

    文章目录 数字"炸弹" 基本代码 核心代码 源码地址 数字"炸弹" 数字炸弹小游戏,平时可以多个人一块玩.游戏规则也很简单:从0~100之间选一个数字,作为&q ...

  6. java计算机毕业设计数据分析星辰网智能手机销售网站MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计数据分析星辰网智能手机销售网站MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计数据分析星辰网智能手机销售网站MyBatis+系统+LW文档+源码+调试部署 ...

  7. pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...

  8. 35. 实战:Python实现视频去水印(文末源码)

    目录 前言 目的 思路 代码实现 1. 请求URL,查看源代码 2. 源代码中没有就去抓包工具 3. 拿到视频源链接,继续检索来源 4. 拿到数据和链接,二进制写入到本地 完整源码 运行效果 总结 前 ...

  9. Python数据分析第十二课:单变量、双变量及多变量分析图

    一.单变量分析绘图 什么是单变量分析? 单变量其实就是我们通常接触到的数据集中的一列数据. 单变量分析是数据分析中最简单的形式,其中被分析的数据只包含一个变量.因为它是一个单一的变量,它不处理原因或关 ...

最新文章

  1. 除了芯片 我们还应关注哪些核心技术
  2. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图
  3. Nginx 反向代理 负载均衡 虚拟主机
  4. VS里的VC++属性和C/C++属性有什么区别?
  5. 把变量赋值给寄存器_散装 vs 批发谁效率高?变量访问被ARM架构安排的明明白白...
  6. 挑战Unity、UE4,曾戈祭出次世代VR引擎
  7. sql limit 子句_SQL Join子句介绍和概述
  8. 计算机应用技术 应聘职位,计算机应用技术求职简历范文
  9. 逆向链表c语言,C语言逆向打印双向链表程序
  10. 【渝粤教育】国家开放大学2018年春季 0508-22T影视特技及后期合成 参考试题
  11. PHP下SESSION无法跨页传递的解决
  12. 红米手机计算机软件,红米手机怎么连接电脑,手把手教你红米手机连接电脑的方法...
  13. MySQL的刷脏页策略
  14. 使用 backdoor 工具注入ShellCode
  15. V社线下沙龙·深圳站——12.05(周六)
  16. 某阿里大神想和java程序员说的话
  17. 3.1.1 docker入门
  18. 传奇微端大带宽服务器如何选择
  19. vue使用elementui实现表格中上下移动功能
  20. pdf文档翻译软件有哪些?Pdf文档翻译软件分享。

热门文章

  1. leakCanary检测内存泄漏的原理
  2. matlab设置列宽,matlab和Excel的交互-(2-单元格操作)
  3. RemoteViews之RemoteViews的内部机制
  4. Android App Widget中如何调用RemoteView中的函数
  5. ESP8266-01S使用教程
  6. 如何在Win10中隐藏一个磁盘盘符
  7. 数据模型与业务模型(领域模型)的区别
  8. leaflet 卷帘,比较两个地图的叠加sideBySide
  9. 电力-端口映射与才茂DTU通信
  10. 高分辨率对地观测系统重大科技专项简介