python实现求特征选择的信息增益

yipeiwu_com5年前Python基础

使用python语言,实现求特征选择的信息增益,可以同时满足特征中有连续型和二值离散型属性的情况。

师兄让我做一个特征选择的代码,我在网上找了一下,大部分都是用来求离散型属性的信息益益,但是我的数据是同时包含二值离散型和连续型属性的,所以这里实现了一下。

代码块

import numpy as np
import math

class IG():
  def __init__(self,X,y):

    X = np.array(X)
    n_feature = np.shape(X)[1]
    n_y = len(y)

    orig_H = 0
    for i in set(y):
      orig_H += -(y.count(i)/n_y)*math.log(y.count(i)/n_y)

    condi_H_list = []
    for i in range(n_feature):
      feature = X[:,i]
      sourted_feature = sorted(feature)
      threshold = [(sourted_feature[inde-1]+sourted_feature[inde])/2 for inde in range(len(feature)) if inde != 0 ]

      thre_set = set(threshold)
      if float(max(feature)) in thre_set:
        thre_set.remove(float(max(feature)))
      if min(feature) in thre_set:
        thre_set.remove(min(feature))
      pre_H = 0
      for thre in thre_set:
        lower = [y[s] for s in range(len(feature)) if feature[s] < thre]
        highter = [y[s] for s in range(len(feature)) if feature[s] > thre]
        H_l = 0
        for l in set(lower):
          H_l += -(lower.count(l) / len(lower))*math.log(lower.count(l) / len(lower))
        H_h = 0
        for h in set(highter):
          H_h += -(highter.count(h) / len(highter))*math.log(highter.count(h) / len(highter))
        temp_condi_H = len(lower)/n_y *H_l+ len(highter)/n_y * H_h
        condi_H = orig_H - temp_condi_H
        pre_H = max(pre_H,condi_H)
      condi_H_list.append(pre_H)

    self.IG = condi_H_list


  def getIG(self):
    return self.IG

if __name__ == "__main__":


  X = [[1, 0, 0, 1],
     [0, 1, 1, 1],
     [0, 0, 1, 0]]
  y = [0, 0, 1]


  print(IG(X,y).getIG())

输出结果为:

[0.17441604792151594, 0.17441604792151594, 0.17441604792151594, 0.6365141682948128]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

wxpython+pymysql实现用户登陆功能

wxpython+pymysql实现用户登陆功能

wxpython最为一款python GUI库,由于简单和轻便外加强大的功能而受到很多python爱好者的喜爱,pymysql作为python3.x版本连接mysql库,应用也非常广泛。...

详谈pandas中agg函数和apply函数的区别

在利用python进行数据分析 这本书中其实没有明确表明这两个函数的却别,而是说apply更一般化. 其实在这本书的第九章‘数组及运算和转换'点到了两者的一点点区别:agg是用来聚合运算...

Python使用面向对象方式创建线程实现12306售票系统

目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一...

Pycharm 创建 Django admin 用户名和密码的实例

Pycharm 创建 Django admin 用户名和密码的实例

1. 问题 使用PyCharm 创建完Django 项目 想登录admin 页面 却不知道用户名和密码。 用的默认sqlit 2.解决办法 2.1 打开manage.py 控制界面 2...

django 将model转换为字典的方法示例

平常的开发过程中不免遇到需要把model转成字典的需求,尤其是现在流行前后端分离架构,Json格式几乎成了前后端之间数据交换的标准,这种model转dict的需求就更多了,本文介绍日常使...