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 相关文章推荐
在Python3中初学者应会的一些基本的提升效率的小技巧
Mar 31 Python
Python用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python3.5集合及其常见运算实例详解
May 01 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
Jul 11 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
tensorflow使用指定gpu的方法
Feb 04 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Pycharm2020最新激活码|永久激活(附最新激活码和插件的详细教程)
Sep 29 Python
Django中和时区相关的安全问题详解
Oct 12 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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
php socket实现的聊天室代码分享
2014/08/16 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
Twig模板引擎用法入门教程
2016/01/20 PHP
9个比较实用的php代码片段
2016/03/15 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
javascript如何创建表格(javascript绘制表格的二种方法)
2013/12/10 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
javascript实现youku的视频代码自适应宽度
2015/05/25 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
微信小程序 教程之数据绑定
2016/10/18 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
原生js实现碰撞检测
2020/03/12 Javascript
python3实现随机数
2018/06/25 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
python 画三维图像 曲面图和散点图的示例
2018/12/29 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
Servlet面试题库
2015/07/18 面试题
护理专业的自荐信
2013/10/22 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
房屋租赁意向书
2014/04/01 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
文明单位汇报材料
2014/12/24 职场文书
酒店厨房管理制度
2015/08/06 职场文书
iPhone13将有八大升级
2021/04/15 数码科技
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫