Python決策樹之基于信息增益的特征選擇示例
本文實(shí)例講述了Python決策樹之基于信息增益的特征選擇。分享給大家供大家參考,具體如下:
基于信息增益的特征選取是一種廣泛使用在決策樹(decision tree)分類算法中用到的特征選取。該特征選擇的方法是通過計(jì)算每個(gè)特征值劃分?jǐn)?shù)據(jù)集獲得信息增益,通過比較信息增益的大小選取合適的特征值。
一、定義
1.1 熵
信息的期望值,可理解為數(shù)據(jù)集的無序度,熵的值越大,表示數(shù)據(jù)越無序,公式如下:
其中H表示該數(shù)據(jù)集的熵值, pi表示類別i的概率, 若所有數(shù)據(jù)集只有一個(gè)類別,那么pi=1
,H=0
。因此H=0
為熵的最小值,表示該數(shù)據(jù)集完全有序。
1.2 信息增益
熵的減少或者是數(shù)據(jù)無序度的減少。
二、流程
1、計(jì)算原始數(shù)據(jù)的信息熵H1
2、選取一個(gè)特征,根據(jù)特征值對(duì)數(shù)據(jù)進(jìn)行分類,再對(duì)每個(gè)類別分別計(jì)算信息熵,按比例求和,得出這種劃分方式的信息熵H2
3、計(jì)算信息增益:
infoGain = H1 - H2
4、根據(jù)2,3計(jì)算所有特征屬性對(duì)應(yīng)的信息增益,保留信息增益較大的特征屬性。
三、實(shí)例
海洋生物數(shù)據(jù)
被分類項(xiàng)\特征 | 不浮出水面是否可以生存 | 是否有腳蹼 | 屬于魚類 |
---|---|---|---|
1 | 是 | 是 | 是 |
2 | 是 | 是 | 是 |
3 | 是 | 否 | 否 |
4 | 否 | 是 | 否 |
5 | 否 | 是 | 否 |
3.1 原始數(shù)據(jù)信息熵
p(是魚類) = p1 =0.4
p(非魚類) = p2 =0.6
通過信息熵公式可得原始數(shù)據(jù)信息熵 H1 = 0.97095
3.2 根據(jù)特征分類計(jì)算信息熵
選擇'不服出水面是否可以生存'作為分析的特征屬性
可將數(shù)據(jù)集分為[1,2,3]與[4,5],分別占0.6和0.4。
[1,2,3]可計(jì)算該類數(shù)據(jù)信息熵為 h1=0.918295834054
[4,5] 可計(jì)算該類數(shù)據(jù)信息熵為 h2=0
計(jì)算劃分后的信息熵 H2 = 0.6 * h1 + 0.4 * h2 = 0.550977500433
3.3 計(jì)算信息增益
infoGain_0 = H1-H2 = 0.419973094022
3.4 特征選擇
同理可得對(duì)特征'是否有腳蹼'該特征計(jì)算信息增益 infoGain_1 = 0.170950594455
比較可得,'不服出水面是否可以生存'所得的信息增益更大,因此在該實(shí)例中,該特征是最好用于劃分?jǐn)?shù)據(jù)集的特征
四、代碼
# -*- 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個(gè)對(duì)象分別所屬的類別 def calc_shannon_ent(category_list): """ :param category_list: 類別列表 :return: 該類別列表的熵值 """ label_count = {} # 統(tǒng)計(jì)數(shù)據(jù)集中每個(gè)類別的個(gè)數(shù) num = len(category_list) # 數(shù)據(jù)集個(gè)數(shù) 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) # 計(jì)算信息熵 return shannon_ent def split_data(feature_matrix, category_list, feature_index, value): """ 篩選出指定特征值所對(duì)應(yīng)的類別列表 :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] # 根據(jù)索引取得指定的所屬類別,構(gòu)建為列表 return ret_category_list def choose_best_feature(feature_matrix, category_list): """ 根據(jù)信息增益獲取最優(yōu)特征 :param feature_matrix: 特征矩陣 :param category_list: 類別列表 :return: 最優(yōu)特征對(duì)應(yīng)的索引 """ feature_num = len(feature_matrix[0]) # 特征個(gè)數(shù) data_num = len(category_list) # 數(shù)據(jù)集的個(gè)數(shù) base_shannon_ent = calc_shannon_ent(category_list=category_list) # 原始數(shù)據(jù)的信息熵 best_info_gain = 0 # 最優(yōu)信息增益 best_feature_index = -1 # 最優(yōu)特征對(duì)應(yīng)的索引 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, feature_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 '最好用于劃分?jǐn)?shù)據(jù)集的特征為:', best_feature
運(yùn)行結(jié)果:
初始信息熵為: 0.970950594455 按照特征0分類后的信息熵為: 0.550977500433 信息增益為: 0.419973094022
初始信息熵為: 0.970950594455 按照特征1分類后的信息熵為: 0.8 信息增益為: 0.170950594455
最好用于劃分?jǐn)?shù)據(jù)集的特征為: 0
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
使用Python的Flask框架來搭建第一個(gè)Web應(yīng)用程序
Flask框架是一個(gè)以輕量級(jí)著稱的Web開發(fā)框架,近兩年來在Web領(lǐng)域獲得了極高的人氣,這里我們就來看如何使用Python的Flask框架來搭建第一個(gè)Web應(yīng)用程序2016-06-06python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法
這篇文章主要介紹了python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法,結(jié)合實(shí)例形式分析了Python針對(duì)微信公眾號(hào)接口操作的相關(guān)技巧,需要的朋友可以參考下2017-06-06pycharm2022沒有manage repositories配置鏡像源的解決方法
本文主要介紹了pycharm2022沒有manage repositories配置鏡像源的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02OpenCV實(shí)現(xiàn)機(jī)器人對(duì)物體進(jìn)行移動(dòng)跟隨的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于OpenCV實(shí)現(xiàn)機(jī)器人對(duì)物體進(jìn)行移動(dòng)跟隨的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11