基於資訊增益的特徵選取是一種廣泛使用在決策樹(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 青年 否 否 一般 否 青年 否 否 好 否 青年 是 否 好 是 青年 是 是 一般 是 青年 否 否 一般 否 中年 否 否 一般 否 中年 否 否 好 否 中年 是 是 ...