根据基尼指数生成决策树时,要注意几个问题:
一、需要判断数据是分类型的还是数值型的,对分类型的拆分子集需判断值是否相等,而对数值型的则需要先计算出区分的值,比较数据与区分值的大小进行拆分。
二、如果是分类型还要注意一个问题,因为基尼指数生成的都是二叉树。所以当类别大于3时,情况会比较多,比如特征的取值有4个的话,需要分成6类。但本例子,是按照特征取值最多为3类的情况来写的。如果类别多于3个,还需要改写该部分的程序。
三、由于编程属于业余拓展爱好,代码可能不够精炼,仅供参考,请包涵。
数据集data(和上一篇CART决策树计算方法中的相一致):
是否有房 婚姻状况 年收入 是否拖欠贷款
序号
1 是 单身 12.5 否
2 否 已婚 10.0 否
3 否 单身 7.0 否
4 是 已婚 12.0 否
5 否 离异 9.5 是
6 否 已婚 6.0 否
7 是 离异 22.0 否
8 否 单身 8.5 是
9 否 已婚 7.5 否
10 否 单身 9.0 是
def feature_select(data):
total_Gini={}
feature_num=len(data.keys())-1
for m in range(feature_num):
s={}
if data.iloc[:,m].dtype==object:
crosstable=pd.crosstab(data.iloc[:,m],data.iloc[:,-1],margins=True)
n=len(data.iloc[:,m].unique())#变量的个数
if n==2:
first_value_proportion=crosstable.iloc[:,0]/crosstable.All
second_value_proportion=crosstable.iloc[:,1]/crosstable.All
sample_counts_proportion=crosstable.iloc[:,2]/crosstable.iloc[2,2]
first_Gini_index=1-np.square(first_value_proportion[0])-np.square(second_value_proportion[0])
second_Gini_index=1-np.square(first_value_proportion[1])-np.square(second_value_proportion[1])
s[data.iloc[:,m].unique()[1]]=sample_counts_proportion[0]*first_Gini_index+sample_counts_proportion[1]*second_Gini_index
total_Gini[data.keys()[m]]=sorted(s.items(),key=lambda x:x[1])[0]
elif n>2:
for x in range(n):
first_value_crosstab=crosstable.iloc[x