Python决策树之基于信息增益的特征选择示例


Posted in Python onJune 25, 2018

本文实例讲述了Python决策树之基于信息增益的特征选择。分享给大家供大家参考,具体如下:

基于信息增益的特征选取是一种广泛使用在决策树(decision tree)分类算法中用到的特征选取。该特征选择的方法是通过计算每个特征值划分数据集获得信息增益,通过比较信息增益的大小选取合适的特征值。

一、定义

1.1 熵

信息的期望值,可理解为数据集的无序度,熵的值越大,表示数据越无序,公式如下:

Python决策树之基于信息增益的特征选择示例

其中H表示该数据集的熵值, pi表示类别i的概率, 若所有数据集只有一个类别,那么pi=1H=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.6和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, 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 '最好用于划分数据集的特征为:', best_feature

运行结果:

初始信息熵为: 0.970950594455 按照特征0分类后的信息熵为: 0.550977500433 信息增益为: 0.419973094022
初始信息熵为: 0.970950594455 按照特征1分类后的信息熵为: 0.8 信息增益为: 0.170950594455
最好用于划分数据集的特征为: 0

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
布同 统计英文单词的个数的python代码
Mar 13 Python
python实现的一个火车票转让信息采集器
Jul 09 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
spark: RDD与DataFrame之间的相互转换方法
Jun 07 Python
tensorflow实现加载mnist数据集
Sep 08 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python安装本地whl的实例步骤
Oct 12 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
python实现三次密码验证的示例
Apr 29 Python
python实现逆序输出一个数字的示例讲解
Jun 25 #Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 #Python
python逆序打印各位数字的方法
Jun 25 #Python
python爬虫的数据库连接问题【推荐】
Jun 25 #Python
python让列表倒序输出的实例
Jun 25 #Python
python实现将一个数组逆序输出的方法
Jun 25 #Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 #Python
You might like
几种显示数据的方法的比较
2006/10/09 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
JavaScript中检测变量是否存在遇到的一些问题
2013/11/11 Javascript
javascript操纵OGNL标签示例代码
2014/06/16 Javascript
JavaScript日期类型的一些用法介绍
2015/03/02 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
AngularJS 实现按需异步加载实例代码
2015/10/18 Javascript
解决jquery无法找到其他父级子集问题的方法
2016/05/10 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
2020/05/10 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
vue 解决兄弟组件、跨组件深层次的通信操作
2020/07/27 Javascript
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
Android分包MultiDex策略详解
2017/10/30 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
维多利亚的秘密官方旗舰店:VICTORIA’S SECRET
2018/04/02 全球购物
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
衰败城市英国官网:Urban Decay英国
2020/04/29 全球购物
十八届三中全会感言
2014/03/10 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书