Определение: Индекс Джини (примесь Джини): Указывает вероятность того, что случайно выбранная выборка будет неправильно классифицирована в наборе выборок.
注意: Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。
То есть индекс Джини (примесь Джини) = вероятность того, что выборка выбрана * вероятность того, что выборка неправильно классифицирована
Свойства коэффициента Джини такие же, как у информационной энтропии: он измеряет неопределенность случайных величин; Чем больше G, тем выше неопределенность данных; Чем меньше G, тем ниже неопределенность данных; G = 0, все образцы в наборе данных относятся к одному классу;
код
def cal_gini_index(data, label_len):
'''
:param data: (list)数据集
:param label_len: (int)数据集中每一行的标签数
:return: gini (float)Gini指数
'''
total_asmple = len(data)
if len(data) == 0:
return 0
for a in range(label_len):
label_counts = label_uniq_cnt(data,a) # 统计数据集中不同标签的个数
print(label_counts)
# 计算数据集的Gini指数
gini = 0
for label in label_counts:
gini = gini + pow(label_counts[label], 2)
gini = 1 - float(gini) / pow(total_asmple, 2)
print(gini)
def label_uniq_cnt(data,a):
'''
统计数据集中不同标签的个数
:param data: (list)原始数据
:param a: 每一种标签的下标号
:return: label_uniq_cnts(int)样本中的标签的个数,统计的是每一种类各个取值的数量,把每一个种类的各种取值的数量放在字典中存储返回
'''
label_uniq_cnts = {}
for x in data:
label = x[a] # 取得每一个样本的类标签label
#print(label)
if label not in label_uniq_cnts:
label_uniq_cnts[label] = 0
label_uniq_cnts[label] += 1
return label_uniq_cnts
if __name__ == '__main__':
data = [('用', '有', '是'), ('用', '有', '是'), ('用', '无', '否'), ('不用', '有', '否'), ('不用', '有', '否')]
cal_gini_index(data,len(data[0]))
результат
{'用': 3, '不用': 2}
0.48
{'有': 4, '无': 1}
0.31999999999999995
{'是': 2, '否': 3}
0.48
Это дает общую вероятность того, что ряду данных будет присвоен неверный результат случайным образом. Чем выше вероятность, тем более необоснованным является разбиение данных.