基尼不纯度:从一个数据集中随机选取子项,度量其被错误的划分到其余组里的几率。(书上解释)python
一个随机事件变成它的对立事件的几率(简单理解)spa
计算公式:(fi为某几率事件发生的几率)3d
下图是相关曲线图,能够参考数据挖掘导论的98页:
code
从上图能够看出,基尼系数和熵之半的曲线很是接近,仅仅在45度角附近偏差稍大。所以,基尼系数能够作为熵模型的一个近似替代。xml
讲解案例:blog
一个随机事件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.5rem
一个随机事件Y ,P(Y=0)= 0.1 ,P(Y=1)=0.9it
那么基尼不纯度就为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)