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

决策树中基尼不纯度初步理解

程序员文章站 2024-02-11 12:41:04
...

基尼不纯度:从一个数据集中随机选取子项,度量其被错误的划分到其他组里的概率。(书上解释)

        一个随机事件变成它的对立事件的概率(简单理解)

计算公式:(fi为某概率事件发生的概率)

决策树中基尼不纯度初步理解决策树中基尼不纯度初步理解

下图是相关曲线图,可以参考数据挖掘导论的98页:

决策树中基尼不纯度初步理解

从上图可以看出,基尼系数和熵之半的曲线非常接近,仅仅在45度角附近误差稍大。因此,基尼系数可以做为熵模型的一个近似替代。

讲解案例:

一个随机事件X ,P(X=0)= 0.5 ,P(X=1)=0.5

      那么基尼不纯度就为   P(X=0)*(1 - P(X=0)) +  P(X=1)*(1 - P(X=1))  = 0.5

 

       一个随机事件Y ,P(Y=0)= 0.1 ,P(Y=1)=0.9

      那么基尼不纯度就为P(Y=0)*(1 - P(Y=0)) +   P(Y=1)*(1 -P(Y=1))  = 0.18

     很明显 X比Y更混乱,因为两个都为0.5 很难判断哪个发生。而Y就确定得多,Y=1发生的概率很大。而基尼不纯度也就越小。


结论:

(1)基尼不纯度可以作为 衡量系统混乱程度的 标准;

(2)基尼不纯度越小,纯度越高,集合的有序程度越高,分类的效果越好;

(3)基尼不纯度为 0 时,表示集合类别一致;

(4)在决策树中,比较基尼不纯度的大小可以选择更好的决策条件(子节点)。


Python3示例代码:

#示例代码:
my_data = [['fan', 'C', 'yes', 32, 'None'],
           ['fang', 'U', 'yes', 23, 'Premium'],
           ['ming', 'F', 'no', 28, 'Basic']]
 
# 计算每一行数据的可能数量
def uniqueCounts(rows):
    results = {}
    for row in rows:
        # 对最后一列的值计算
        #r = row[len(row) - 1]
        # 对倒数第三的值计算,也就是yes 和no 的一列
        r = row[len(row) - 3]
        if r not in results: results[r] = 0
        results[r] += 1
    return results
 
# 基尼不纯度样例
def giniImpurityExample(rows):
    total = len(rows)
    print(total)
    counts = uniqueCounts(rows)
    print(counts)
    imp = 0
    for k1 in counts:
        p1 = float(counts[k1]) / total
        print(counts[k1])
        for k2 in counts:
            if k1 == k2: continue
            p2 = float(counts[k2]) / total
            imp += p1 * p2
    return imp
 
 
gini = giniImpurityExample(my_data)
print('gini Impurity is %s' % gini)