李航统计学习方法决策树的特征选择例5.2python代码

自己写一直报错一直报错。。。然后还是参考了机器学习实战上关于数据集划分的部分,所以这篇主要为了记录一下实战上的好方法:还可以这样分?!

先上图:

下面直接上代码:

# -*- coding:utf-8 -*-
#@author:xinxinzhang
from math import log
def loadDataSet():
    dataSet = [['青年', '否', '否', '一般', '否'],
               ['青年', '否', '否', '好', '否'],
               ['青年', '是', '否', '好', '是'],
               ['青年', '是', '是', '一般', '是'],
               ['青年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '一般', '否'],
               ['中年', '否', '否', '好', '否'],
               ['中年', '是', '是', '好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['中年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '非常好', '是'],
               ['老年', '否', '是', '好', '是'],
               ['老年', '是', '否', '好', '是'],
               ['老年', '是', '否', '非常好', '是'],
               ['老年', '否', '否', '一般', '否']]
    label = ['年龄', '有工作', '有自己的房子', '信贷情况']
    return dataSet, label

def shannoEnt(dataSet):
    labelCount={}
    numOfData=len(dataSet)
    for data in dataSet:
        classify=data[-1]
        if classify not in labelCount.keys():
            labelCount[classify]=1
        else:labelCount[classify]+=1
    H=0.0
    for value in labelCount.values():
        pi=value/numOfData
        H-=pi*log(pi,2)
    return H

def chooseBestFeatureSplit(dataSet):
    HD=shannoEnt(dataSet)
    bestGain=0.0
    bestFeature=-1   #为啥初始化为1,因为特征从0开始扫描,所以如果没找到最优特征,就会返回-1
    for i in range(len(dataSet[0])-1):
        feat=[data[i] for data in dataSet]
        prob=0.0
        for value in set(feat):
            subData=splitData(dataSet,i,value)
            prob+=(len(subData)/len(dataSet))*shannoEnt(subData)
        Gain=HD-prob
        if Gain>bestGain:
            bestGain=Gain
            bestFeature=i
    print('最优特征是:',label[bestFeature])
    return bestFeature


def splitData(dataSet,axis,value):  #机器学习实战上关于数据集的划分
    retDataSet=[]
    for data in dataSet:
        if data[axis]==value:
            reducedData=data[:axis]
            reducedData.extend(data[axis+1:])
            retDataSet.append(reducedData)
    return retDataSet



dataSet,label=loadDataSet()
chooseBestFeatureSplit(dataSet)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值