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的Django框架可适配的各种数据库介绍
Jul 15 Python
python通过加号运算符操作列表的方法
Jul 28 Python
Python的Django框架中forms表单类的使用方法详解
Jun 21 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
Python 文件操作的详解及实例
Sep 18 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
django为Form生成的label标签添加class方式
May 20 Python
详解Python的爬虫框架 Scrapy
Aug 03 Python
通过实例解析python subprocess模块原理及用法
Oct 10 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
PHP学习之数组值的操作
2011/04/17 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
jQuery使用slideUp方法实现控制元素缓慢收起
2015/03/27 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
在Python中用get()方法获取字典键值的教程
2015/05/21 Python
Python 装饰器深入理解
2017/03/16 Python
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
python 上下文管理器使用方法小结
2017/10/10 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
python pandas时序处理相关功能详解
2019/07/03 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python 面向对象之类class和对象基本用法示例
2020/02/02 Python
Python列表的深复制和浅复制示例详解
2021/02/12 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
毕业实习评语
2014/02/10 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
事业单位聘任报告
2015/03/02 职场文书
聘任书范文大全
2015/09/21 职场文书
《植树问题》教学反思
2016/03/03 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书