定義:基尼指數(基尼不純度):表示在樣本集合中一個隨機選中的樣本被分錯的概率。
注意: 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
複製程式碼
這樣得到某一行資料被隨機分配到錯誤結果的總概率。這一概率越高,說明對資料的拆分越不合理。