首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

简单谈谈决策树DT

无论是风里,还是在雨里,我都在这里守候着你~

一个成功的决策,等于90%的

信息加上10%的直觉。

01

问题引入

请看下面的表格,考虑这样一个问题:如果知道了一个人的房屋所有情况,婚姻状况和年收入,如何判定这个人是否拖欠贷款呢?

思考过程大概是这样的,想把所有的因素按照重要性排序(重要的因素当然优先考量):如是否有房>婚否>年收入。然后在分类讨论,如果他有房的话,在考虑他是否结婚;如果他结婚了,在考虑他年收入多少,然后得出这个人是否是贷款拖欠者。

02

纯度(Purity)的度量

如果上面的思考过程进行下去,遇到的第一个问题就是:如何给特征(待考量的因素称为特征)排序的问题。既然要排序,当然要有一个标准,纯度就是这样一个标准。

常用的纯度度量指标有三个:

gini_index(基尼系数)

信息熵(entropy)

分类误差(missclassification_error)

下面以gini_index为例来讲一下纯度的度量。

gini系数的取值范围[0, 1),gini系数越低,代表分类的纯度越高!

gini系数的计算公式如下,其中t代表某个特征,j代表某个特征下对应的分类数。

如我们计算一下是否有房这个特征的gini系数。

首先,分别统计一下是否有房者的数量:得到有房者3人,无房者7人。

df['是否拖欠贷款'].groupby(df['是否有房']).count()

是否有房

否 7

是 3

在统计一下有/无房时是否拖欠贷款的人数。

df['是否拖欠贷款'].groupby([df['是否有房'],df['是否拖欠贷款']]).count()

是否有房 是否拖欠贷款

否 否 4

是 3

是 否 3

计算gini系数

有房的gini系数为:1-(0/3)^2-(3/3)^2=0

无房的gini系数为:1-(3/7)^2-(4/7)^2=0.49

那么,gini(是否有房)=3/10*0 + 7/10*0.49=0.34

同样的,可以计算婚姻状况和年收入的Gini系数。

得到,gini(婚姻状况)=0.30

年收入由于是连续值,计算的方法略微复杂些,此处暂且略过。

03

一点点小问题

当gini系数计算出来以后,是否就可以根据它来选择特征了呢?如婚姻状况的gini系数小于是否有房的gini系数,那么应该选择婚姻状况作为首要的考虑因素。

事情并不是这样的。为了便于理解,考虑一种极端情况,有一个新特征F,它有10个分类。如下:

那么计算一下,此时F的gini系数是多少呢?

gini(F==n) = 1 - (1/1)^2=0

所以此时gini(F) = 0

可见,如果一个特征下对应的分类越多,那么所计算的该分类的gini系数就倾向于越低,但是这是无意义的,并不是我们想要的。所以我们需要引入惩罚项。就如同C4.5算法对ID3算法的改进那样!

04

scikitlearn做决策树示例

python的scikitlearn包中集成了决策树算法,虽然本身决策算法可以支持非数值型变量,但是scikitlearn中的输入必须是数值型。所以,首先要把非数值型变量编码为数值型变量。下面是一个示例:

#编码

df['是否有房n'] = df.apply(lambda x: 1 if x['是否有房']=='是' else 0, axis=1)

def t(x):

if x['婚姻状况']=='单身':

return 0

elif x['婚姻状况']=='已婚':

return 1

else:

return 2

df['婚姻状况n'] = df.apply(t, axis=1)

df['是否拖欠贷款n'] = df.apply(lambda x: 1 if x['是否拖欠贷款']=='是' else 0, axis=1)

#提取训练的x,y

x = df.iloc[:,[-3,-2,2]].values

x

y = df.iloc[:,-1].values

#进行决策树训练

from sklearn import tree

clf = tree.DecisionTreeClassifier()

clf.fit(x,y)

#通过graphviz进行图形化输出

dot_data1 = tree.export_graphviz(clf, out_file=None,

feature_names = df.columns[:3],

class_names = df['是否拖欠贷款'].unique(),

filled=True, rounded=True,

special_characters=True)

graph = graphviz.Source(dot_data1)

graph

可以看出,训练出的决策树只考虑了年收入这个因素。

当年收入大于97.5K时,该贷款者不会拖欠贷款

当年收入小于等于80K时,该贷款者也不会拖欠贷款

当年收入介于80K~97.5K的贷款者会拖欠贷款

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181206G06MEA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券