欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

机器学习决策树算法案例实战

程序员文章站 2022-03-01 16:38:14
机器学习决策树算法案例实战构造数据好坏比例7:3import pandas as pdimport numpy as npbad_df = pd.DataFrame(data={ "sex":['男', '男', '女', '男', '女', '男'], "status":['单身', '已婚', '已婚', '单身', '已婚', '单身'], "age":[39, 25, 26, 26, 21, 27], "month":[15, 12, 12, 42, 30...

机器学习决策树算法案例实战

构造数据

好坏比例7:3

import pandas as pd
import numpy as np
bad_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
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:年龄,month:贷款期限,amount:贷款金额,y:是否逾期,bad逾期;good未逾期

提出问题

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

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

决策树解决

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

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

参考地址:https://www.cnblogs.com/keye/p/10564914.html

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(2TkTk0TkTk1)+TS(2STs0STs1)

T : 总 样 本 数 T:总样本数 T:
T k : 第 k 个 分 组 的 样 本 数 T_k:第k个分组的样本数 Tk:k
T k 0 : 第 k 个 分 组 的 样 本 中 y = 0 的 样 本 数 T_{k0}:第k个分组的样本中y=0的样本数 Tk0:ky=0
T k 1 : 第 k 个 分 组 的 样 本 中 y = 1 的 样 本 数 T_{k1}:第k个分组的样本中y=1的样本数 Tk1:ky=1
S = T − T k , 去 掉 k 个 分 组 之 后 的 所 有 样 本 数 据 S=T-T_k,去掉k个分组之后的所有样本数据 S=TTk,k
T s 0 : S 中 y = 0 的 样 本 数 T_{s0}:S中y=0的样本数 Ts0:Sy=0
T s 1 : S 中 y = 1 的 样 本 数 T_{s1}:S中y=1的样本数 Ts1:Sy=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. 数的深度(划分的区间)大于指定的区间,结束。
# 修改一下数据类型,
# 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)  
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的客户,可能为逾期用户。

本文地址:https://blog.csdn.net/weixin_42060598/article/details/110429763