機器學習——基尼指數

yucheng1998發表於2019-07-24

定義:基尼指數(基尼不純度):表示在樣本集合中一個隨機選中的樣本被分錯的概率。

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

複製程式碼

這樣得到某一行資料被隨機分配到錯誤結果的總概率。這一概率越高,說明對資料的拆分越不合理。

相關文章