无论是风里,还是在雨里,我都在这里守候着你~
一个成功的决策,等于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的贷款者会拖欠贷款
领取专属 10元无门槛券
私享最新 技术干货