机器学习——基尼指数

2,784 阅读1分钟

定义:基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。

    注意: 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

这样得到某一行数据被随机分配到错误结果的总概率。这一概率越高,说明对数据的拆分越不合理。