定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。
注意: 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
这样得到某一行数据被随机分配到错误结果的总概率。这一概率越高,说明对数据的拆分越不合理。
Be First to Comment