决策树Gini指数 心脏病例子(附Python代码实现)

0. 介绍

Gini index: CART决策树使用“基尼指数”(Gini index)来选择划分属性。
数据集D的纯度可用基尼值来度量:
决策树Gini指数 心脏病例子(附Python代码实现)_第1张图片
直观来看,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率(二分类)。因此,Gini(D)越小, 则数据集D的纯度越高。
总结:Gini指数越大则表示数据越不纯,Gini越小表示数据相对越纯。
属性a的基尼指数定义为:
在这里插入图片描述
于是,我们在选择划分属性时,选择那个使划分后Gini系数最小的属性作为最优划分属性。
在这里插入图片描述

1. 心脏病例子:

收集数据:
决策树Gini指数 心脏病例子(附Python代码实现)_第2张图片
统计数据:
决策树Gini指数 心脏病例子(附Python代码实现)_第3张图片
第一次分叉:
决策树Gini指数 心脏病例子(附Python代码实现)_第4张图片
第二次分叉:
决策树Gini指数 心脏病例子(附Python代码实现)_第5张图片
第三次分叉:
决策树Gini指数 心脏病例子(附Python代码实现)_第6张图片
以此类推:
决策树Gini指数 心脏病例子(附Python代码实现)_第7张图片

2. 代码实现:

# 决策树 Gini指数 心脏病例子 


# 计算每个分支的gini指数
def gini_index_single(a, b):
    single_gini = 1 - (a/(a + b))**2 - (b/(a + b))**2
    return round(single_gini, 3)    #round() 方法返回浮点数x的四舍五入值。3为保留3位小数
print(gini_index_single(105, 39))


# 每个属性gini指数
def gini_index(a, b, c, d):
    # 计算左右分支分别的gini指数
    zuo = gini_index_single(a, b)
    you = gini_index_single(c, d)
    # 计算综合 ,加权平均
    gini_index = zuo * ((a + b)/ (a + b + c + d)) + you * ((c + d)/(a + b + c + d))
    return round(gini_index, 3)
print(gini_index(105, 39, 34, 125)) # 例子中Chest Pain 属性的gini指数
print(gini_index(37, 127, 100, 33)) # Good Blood Circulation 属性的gini指数
print(gini_index(92, 31, 45, 129))  # Blocked Arteries 属性的gini指数

# 上述三个属性输出结果为0.364, 0.36, 0.381
# gini指数越小,说明纯度越高, 所以选择第二个属性进行第一次分叉

# 进行第二次分叉判断
print(gini_index(13 , 98, 24, 29))  # 第二次分叉中的Chest Pain 属性
print(gini_index(24, 25, 13, 102))  # 第二次分叉中的Blocked Arteries属性
# 结果为0.3, 0.29 选择最小的Blocked Arteriers属性

# 判断是否需要进行进行第三次分叉
# 24/25分支
print(gini_index_single(24, 25))    # 结果为0.5
print(gini_index(17, 3, 7, 22))     # 结果为0.321
# 所以需要分叉,以此类推

3. 参考资料:

《机器学习》西瓜书 周志华
StatQuest
B站视频:https://www.bilibili.com/video/BV17J411C7zZ?p=62&t=64

4. 写给自己:

天行健,君子以自强不息

你可能感兴趣的:(决策树,python,机器学习)