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

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

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

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

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

一、定義

1.1 熵

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

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

1.2 信息增益

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

二、流程

1、計算原始數(shù)據(jù)的信息熵H1

2、選取一個特征,根據(jù)特征值對數(shù)據(jù)進行分類,再對每個類別分別計算信息熵,按比例求和,得出這種劃分方式的信息熵H2

3、計算信息增益:

infoGain = H1 - H2

4、根據(jù)2,3計算所有特征屬性對應的信息增益,保留信息增益較大的特征屬性。

三、實例

海洋生物數(shù)據(jù)

被分類項\特征 不浮出水面是否可以生存 是否有腳蹼 屬于魚類
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ù)特征分類計算信息熵

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

可將數(shù)據(jù)集分為[1,2,3]與[4,5],分別占0.6和0.4。

[1,2,3]可計算該類數(shù)據(jù)信息熵為 h1=0.918295834054

[4,5] 可計算該類數(shù)據(jù)信息熵為 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

比較可得,'不服出水面是否可以生存'所得的信息增益更大,因此在該實例中,該特征是最好用于劃分數(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個對象分別所屬的類別
def calc_shannon_ent(category_list):
  """
  :param category_list: 類別列表
  :return: 該類別列表的熵值
  """
  label_count = {} # 統(tǒng)計數(shù)據(jù)集中每個類別的個數(shù)
  num = len(category_list) # 數(shù)據(jù)集個數(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) # 計算信息熵
  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] # 根據(jù)索引取得指定的所屬類別,構建為列表
  return ret_category_list
def choose_best_feature(feature_matrix, category_list):
  """
  根據(jù)信息增益獲取最優(yōu)特征
  :param feature_matrix: 特征矩陣
  :param category_list: 類別列表
  :return: 最優(yōu)特征對應的索引
  """
  feature_num = len(feature_matrix[0]) # 特征個數(shù)
  data_num = len(category_list) # 數(shù)據(jù)集的個數(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)特征對應的索引
  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 '最好用于劃分數(shù)據(jù)集的特征為:', best_feature

運行結(jié)果:

初始信息熵為: 0.970950594455 按照特征0分類后的信息熵為: 0.550977500433 信息增益為: 0.419973094022
初始信息熵為: 0.970950594455 按照特征1分類后的信息熵為: 0.8 信息增益為: 0.170950594455
最好用于劃分數(shù)據(jù)集的特征為: 0

更多關于Python相關內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)學運算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

兰考县| 龙州县| 石狮市| 巴马| 临潭县| 营山县| 平山县| 临桂县| 昭苏县| 大竹县| 大化| 曲周县| 天长市| 江孜县| 木里| 尼勒克县| 十堰市| 牟定县| 通榆县| 祁阳县| 白朗县| 固始县| 慈利县| 安宁市| 永定县| 南澳县| 稷山县| 津南区| 黔东| 满城县| 务川| 海宁市| 朔州市| 玉树县| 尼木县| 竹溪县| 青铜峡市| 高安市| 阿拉善左旗| 太仓市| 栾城县|