最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python決策樹(shù)之基于信息增益的特征選擇示例

 更新時(shí)間:2018年06月25日 10:29:20   作者:Eric Chan  
這篇文章主要介紹了Python決策樹(shù)之基于信息增益的特征選擇,結(jié)合實(shí)例形式分析了決策樹(shù)中基于信息增益的特征選擇原理、計(jì)算公式、操作流程以及具體實(shí)現(xiàn)技巧,需要的朋友可以參考下

本文實(shí)例講述了Python決策樹(shù)之基于信息增益的特征選擇。分享給大家供大家參考,具體如下:

基于信息增益的特征選取是一種廣泛使用在決策樹(shù)(decision tree)分類算法中用到的特征選取。該特征選擇的方法是通過(guò)計(jì)算每個(gè)特征值劃分?jǐn)?shù)據(jù)集獲得信息增益,通過(guò)比較信息增益的大小選取合適的特征值。

一、定義

1.1 熵

信息的期望值,可理解為數(shù)據(jù)集的無(wú)序度,熵的值越大,表示數(shù)據(jù)越無(wú)序,公式如下:

其中H表示該數(shù)據(jù)集的熵值, pi表示類別i的概率, 若所有數(shù)據(jù)集只有一個(gè)類別,那么pi=1,H=0。因此H=0為熵的最小值,表示該數(shù)據(jù)集完全有序。

1.2 信息增益

熵的減少或者是數(shù)據(jù)無(wú)序度的減少。

二、流程

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)\特征 不浮出水面是否可以生存 是否有腳蹼 屬于魚(yú)類
1
2
3
4
5

3.1 原始數(shù)據(jù)信息熵

p(是魚(yú)類) = p1 =0.4
p(非魚(yú)類) = p2 =0.6

通過(guò)信息熵公式可得原始數(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打包后的exe還原成.py的實(shí)現(xiàn)步驟

    Python打包后的exe還原成.py的實(shí)現(xiàn)步驟

    本文主要介紹了Python打包后的exe還原成.py的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python創(chuàng)建exe文件的實(shí)現(xiàn)步驟

    python創(chuàng)建exe文件的實(shí)現(xiàn)步驟

    本文主要介紹了python創(chuàng)建exe文件的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • 詳解Python中的偏函數(shù)(Partial Functions)

    詳解Python中的偏函數(shù)(Partial Functions)

    Python中的偏函數(shù)是來(lái)自函數(shù)式編程的一個(gè)強(qiáng)大工具,它的主要目標(biāo)是減少函數(shù)調(diào)用的復(fù)雜性這個(gè)概念可能起初看起來(lái)有點(diǎn)困難理解,但一旦你明白了它的工作方式,它可能會(huì)成為你的編程工具箱中的重要組成部分,文中有相關(guān)的代碼介紹,需要的朋友可以參考下
    2023-06-06
  • tensorboard 可視化之localhost:6006不顯示的解決方案

    tensorboard 可視化之localhost:6006不顯示的解決方案

    這篇文章主要介紹了tensorboard 可視化之localhost:6006不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python spilt()分隔字符串的實(shí)現(xiàn)示例

    python spilt()分隔字符串的實(shí)現(xiàn)示例

    split() 方法可以實(shí)現(xiàn)將一個(gè)字符串按照指定的分隔符切分成多個(gè)子串,本文介紹了spilt的具體使用,感興趣的可以了解一下
    2021-05-05
  • Python中@classmethod和@staticmethod的區(qū)別

    Python中@classmethod和@staticmethod的區(qū)別

    本文主要介紹了Python中@classmethod和@staticmethod的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Python讀取Excel繪制直方圖的方法

    Python讀取Excel繪制直方圖的方法

    這篇文章主要介紹了Python讀取Excel繪制直方圖,以下將詳細(xì)介紹如何使用 Python 的?pyecharts、matplotlib?和?seaborn?三個(gè)庫(kù)從 Excel 中讀取數(shù)據(jù)并繪制直方圖(Histogram),需要的朋友可以參考下
    2025-04-04
  • 使用Pandas如何讀取多個(gè)分隔方式的文件

    使用Pandas如何讀取多個(gè)分隔方式的文件

    這篇文章主要介紹了使用Pandas如何讀取多個(gè)分隔方式的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python?OpenCV?Canny邊緣檢測(cè)算法的原理實(shí)現(xiàn)詳解

    Python?OpenCV?Canny邊緣檢測(cè)算法的原理實(shí)現(xiàn)詳解

    這篇文章主要介紹了Python?OpenCV?Canny邊緣檢測(cè)算法的原理實(shí)現(xiàn)詳解,由于邊緣檢測(cè)對(duì)噪聲敏感,因此對(duì)圖像應(yīng)用高斯平滑以幫助減少噪聲,具體詳情需要的小伙伴可以參考一下
    2022-07-07
  • 使用python獲取電腦的磁盤信息方法

    使用python獲取電腦的磁盤信息方法

    今天小編就為大家分享一篇使用python獲取電腦的磁盤信息方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11

最新評(píng)論

屯留县| 深圳市| 清徐县| 潜江市| 双鸭山市| 东乡| 游戏| 涟水县| 灵武市| 诸城市| 德令哈市| 芜湖市| 怀仁县| 固镇县| 南宫市| 西丰县| 马龙县| 怀宁县| 开平市| 绥江县| 东丽区| 绍兴县| 陵水| 黄浦区| 长兴县| 焦作市| 泾阳县| 平遥县| 临沧市| 庄浪县| 始兴县| 舟曲县| 周宁县| 安福县| 浏阳市| 洪洞县| 灵寿县| 开鲁县| 大同县| 湘阴县| 咸宁市|