欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

本文實(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)文章

  • Python3.8安裝Pygame教程步驟詳解

    Python3.8安裝Pygame教程步驟詳解

    這篇文章主要介紹了Python3.8安裝Pygame教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 使用Python的Flask框架來搭建第一個(gè)Web應(yīng)用程序

    使用Python的Flask框架來搭建第一個(gè)Web應(yīng)用程序

    Flask框架是一個(gè)以輕量級(jí)著稱的Web開發(fā)框架,近兩年來在Web領(lǐng)域獲得了極高的人氣,這里我們就來看如何使用Python的Flask框架來搭建第一個(gè)Web應(yīng)用程序
    2016-06-06
  • python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法

    python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法

    這篇文章主要介紹了python實(shí)現(xiàn)給微信公眾號(hào)發(fā)送消息的方法,結(jié)合實(shí)例形式分析了Python針對(duì)微信公眾號(hào)接口操作的相關(guān)技巧,需要的朋友可以參考下
    2017-06-06
  • TensorFlow的環(huán)境配置與安裝方法

    TensorFlow的環(huán)境配置與安裝方法

    這篇文章主要介紹了TensorFlow的環(huán)境配置與安裝方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • pycharm2022沒有manage repositories配置鏡像源的解決方法

    pycharm2022沒有manage repositories配置鏡像源的解決方法

    本文主要介紹了pycharm2022沒有manage repositories配置鏡像源的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 使用plt.bar柱狀圖減小柱子之間的間隔問題

    使用plt.bar柱狀圖減小柱子之間的間隔問題

    這篇文章主要介紹了使用plt.bar柱狀圖減小柱子之間的間隔問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解Python中的枚舉類型

    詳解Python中的枚舉類型

    枚舉(Enum)是一種數(shù)據(jù)類型,是綁定到唯一值的符號(hào)表示。。本文就來和大家聊聊Python中的枚舉類型,為什么需要枚舉類型,及如何使用
    2022-08-08
  • Python虛擬環(huán)境venv的使用方法

    Python虛擬環(huán)境venv的使用方法

    venv 是 Python 里的一個(gè)標(biāo)準(zhǔn)工具,它的主要功能是幫助用戶管理和控制虛擬環(huán)境,venv 的使用方法其實(shí)非常簡(jiǎn)單,下面我將詳細(xì)介紹如何創(chuàng)建虛擬環(huán)境,如何激活虛擬環(huán)境,以及如何退出虛擬環(huán)境的操作步驟,需要的朋友可以參考下
    2024-03-03
  • OpenCV實(shí)現(xiàn)機(jī)器人對(duì)物體進(jìn)行移動(dòng)跟隨的方法實(shí)例

    OpenCV實(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
  • python集合的新增元素方法整理

    python集合的新增元素方法整理

    在本篇文章里小編給大家整理了一篇關(guān)于python集合的新增元素方法整理內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。
    2020-12-12

最新評(píng)論