Python決策樹之基於資訊增益的特徵選擇示例

2022-09-29 17:42:10 字數 3947 閱讀 2324

基於資訊增益的特徵選取是一種廣泛使用在決策樹(decision tree)分類演算法中用到的特徵選取。該特徵選擇的方法是通過計算每個特徵值劃分資料集獲得資訊增益,通過比較資訊增益的大小選取合適的特徵值。

1.1 熵

資訊的期望值,可理解為資料集的無序度,熵的值越大,表示資料越無序,公式如下:

其中h表示該資料集的熵值,pi表示類別i的概率, 若所有資料集只有乙個類別,那麼pi=1,h=0。因此h=0為熵的最小值,表示該資料集完全有序。

1.2 資訊增益

熵的減少或者是資料無序度的減少。

1、計算原始資料的資訊熵h1

2、選取乙個特徵,根據特徵值對資料進行分類,再對每個類別分別計算資訊熵,按比例求和,得出這種劃分方式的資訊熵h2

3、計算資訊增益:

infogain = h1 - h2

4、根據2,3計算所有特徵屬性對應的資訊增益,保留資訊增益較大的特徵屬性。

海洋生物資料

被分類項\特徵

不浮出水面是否可以生存

是否有腳蹼

屬於魚類1是

是是2是

是是3是

否否4否

是否5否

是否

3.1 原始資料資訊熵

p(是魚類) = p1 =0.4

p(非魚類) = p2 =0.6

通過資訊熵公式可得原始資料資訊熵h1 = 0.97095

3.2 根據特徵分類計算資訊熵

選擇'不服出水面是否可以生存'作為分析的特徵屬性

可將資料集分為[1,2,3]與[4,5],分別佔0和0.4。

[1,2,3]可計算該類資料資訊熵為h1=0.918295834054

[4,5] 可計算該類資料資訊熵為h2=0

計算劃分後的資訊熵h2 = 0.6 * h1 + 0.4 * h2 = 0.550977500433

3.3 計算資訊增益

infogain_0 = h1-h2 = 0.419973094022

3.4 特徵選擇

同理可得對特徵'是否有腳蹼'該特徵計算資訊增益infogain_1 = 0.170950594455

比較可得,'不服出水面是否可以生存'所得的資訊增益更大,因此在該例項中,該特徵是最好用於劃分資料集的特徵

# -*- coding:utf-8 -*-

#! python2

import numpy as np

from math import log

data_feature_matrix = np.array([[1, 1],

[1, 1],

[1, 0],

[0, 1],

[0, 1]]) # 特徵矩陣

category = ['yes', 'yes', 'no', 'no', 'no'] # 5個物件分別所屬的類別

def calc_shannon_ent(category_list):

""":param category_list: 類別列表

:return: 該類別列表的熵值

"""label_count = {} # 統計資料集中每個類別的個數

num = len(category_list) # 資料集個數

for i in range(num):

try:

label_count[category_list[i]] += 1

except keyerror:

label_count[category_list[i]] = 1

shannon_ent = 0.

for k in label_count:

prob = float(label_count[k]) / num

shannon_ent -= prob * log(prob, 2) # 計算資訊熵

return shannon_ent

def split_data(feature_matrix, category_list, feature_index, value):

"""篩選出指定特徵值所對應的類別列表

:param category_list: 類別列表

:param feature_matrix: 特徵矩陣

:param feature_index: 指定特徵索引

:param value: 指定特徵屬性的特徵值

:return: 符合指定特徵屬性的特徵值的類別列表

"""# feature_matrix = np.array(feature_matrix)

ret_index = np.where(feature_matrix[:, feature_index] == value)[0] # 獲取符合指定特徵值的索引

ret_category_list = [category_list[i] for i in ret_index] # 根據索引取得指定的所屬類別,構建為列表

return ret_category_list

def choose_best_feature(feature_matrix, category_list):

"""根據資訊增益獲取最優特徵

:param feature_matrix: 特徵矩陣

:param category_list: 類別列表

:return: 最優特徵對應的索引

"""feature_num = len(feature_matrix[0]) # 特徵個數

data_num = len(category_list) # 資料集的個數

base_shannon_ent = calc_shannon_ent(category_list=category_list) # 原始資料的資訊熵

best_info_gain = 0 # 最優資訊增益

best_feature_index = -1 #程式設計客棧 最優特徵對應的索引

for f in range(feature_num):

uni_value_list = set(feature_matrix[:, f]) # 該特徵屬性所包含的特徵值

new_shannon_ent = 0.

for value in uni_value_list:

sub_cate_list = split_data(feature_matrix=feature_matrix, category_list=category_list, featurwww.cppcns.come_index=f, value=value)

prob = float(len(sub_cate_list)) / data_num

new_shannon_ent += prob * calc_shannon_ent(sub_cate_list)

info_gain = base_shannon_ent - new_shannon_ent # 資訊增益

print '初始資訊熵為:', base_shannon_ent, '按照特徵%i分類後的資訊熵為:' % f, new_shannon_ent, '資訊增益為:', info_gain

if info_gain > best_info_gain:

best_info_gain = info_gain

best_feature_index = f

return best_feature_index

if __name__ == '程式設計客棧__main__':

best_feature = choose_best_feature(data_feature_matrix, category)

print '最好用於劃分資料集的特徵為:', best_feature

執行結果:

初始資訊熵為: 0.970950594455 按照特徵0分類後的資訊熵為: 0.550977500433 資訊增益為: 0.419973094022

初始資訊熵為: 0.970950594455 按照特徵1分類後的資訊熵為: 0.8 資訊增益為: 0.170950594455

最好用於劃分資料集的特徵為: 0

決策樹資訊增益

決策樹和整合演算法都是樹模型 決策樹 從根節點一步步走到葉子節點,所有的資料都會落到葉子節點,既可以做分類也可以做回歸。一顆樹有三種節點組成,根節點,中間幾點,葉子節點。根節點是第乙個選擇節點,也是最重要的乙個選擇特徵。葉子節點是存放最終的結果。決策樹的訓練和測試 訓練是建立一棵樹。測試是讓資料從根...

資訊增益與決策樹

決策樹是一種判別式模型。在一顆分類決策樹中,非葉子節點時決策規則,葉子節點是類別。當輸入乙個特徵向量時,按照決策樹上的規則從根節點向葉節點移動,最後根據葉節點的類別判定輸入向量的類別。決策樹也可以用來解決回歸問題。建立乙個決策樹模型主要有三個步驟 特徵選擇 決策樹的生成 決策樹的剪枝。而特徵選擇時要...

決策樹 資訊熵增益

from math import log import operator defcreatedateset dataset 青年 否 否 一般 否 青年 否 否 好 否 青年 是 否 好 是 青年 是 是 一般 是 青年 否 否 一般 否 中年 否 否 一般 否 中年 否 否 好 否 中年 是 是 ...