35

机器学习——基尼指数

 4 years ago
source link: https://www.tuicool.com/articles/3MvyMz3
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK