您的位置:首页 > 编程语言

统计学习方法第五章决策树的选择最优特征划分例5-1-5.2代码实践

2018-01-18 10:53 323 查看
统计学习方法第五章决策树的选择最优特征划分例5-1-5.2代码实践个人体会:本来代码都想在python2.7中编译运行的,个人比较懒就在网上复制了一份这个例题的数据集然后各种编码问题太扎心,目前换成python3.6感觉很舒服,建议大家还是用python3吧方便了很多from numpy import *import mathdef loadDataSet(): #本书例题的数据集dataset = [['青年', '否', '否', '一般', '否'],['青年', '否', '否', '好', '否'],['青年', '是', '否', '好', '是'],['青年', '是', '是', '一般', '是'],['青年', '否', '否', '一般', '否'],['中年', '否', '否', '一般', '否'],['中年', '否', '否', '好', '否'],['中年', '是', '是', '好', '是'],['中年', '否', '是', '非常好', '是'],['中年', '否', '是', '非常好', '是'],['老年', '否', '是', '非常好', '是'],['老年', '否', '是', '好', '是'],['老年', '是', '否', '好', '是'],['老年', '是', '否', '非常好', '是'],['老年', '否', '否', '一般', '否']]label = ['年龄', '有工作', '有自己的房子', '信贷情况']return dataset,labeldef calculateEntopy(dataSet): #计算训练集的信息熵resultList=[data[-1] for data in dataSet]lenOfResult=float(len(resultList))uniqueLabels=set(resultList)curEntropy=0.0for label in uniqueLabels:prob=resultList.count(label)/lenOfResultcurEntropy -= prob*math.log(prob,2)return curEntropydef calculateGain(dataSet,i): #计算根据某个特征进行划分后的信息增益m=float(len(dataSet))baseEntropy=calculateEntopy(dataSet)listOfValue=[data[i] for data in dataSet]uniqueValueList=set(listOfValue)newEntropy=0.0for value in uniqueValueList:splitDataSet=[]for data in dataSet:if data[i] == value:4000returnList=data[:i]returnList.extend(data[i+1:])splitDataSet.append(returnList)newEntropy += (len(splitDataSet)/m)*calculateEntopy(splitDataSet)return baseEntropy-newEntropydef chooseBestValueToSplit(dataSet): #通过本函数寻找能获得最大增益的属性m,n=shape(dataSet)bestInfoGain=0;bestValue=0.0for i in range(n-1):curInfoGain=calculateGain(dataSet,i)if curInfoGain>bestInfoGain:bestInfoGain=curInfoGainbestValue=ireturn bestValuedataSet,label=loadDataSet()print(chooseBestValueToSplit(dataSet))print(label[chooseBestValueToSplit(dataSet)])
为了函数有扩展性替换成下面的脚本:
from numpy import *
import math

def loadDataSet():  # 本书例题的数据集
dataset = [['青年', '否', '否', '一般', '否'],
['青年', '否', '否', '好', '否'],
['青年', '是', '否', '好', '是'],
['青年', '是', '是', '一般', '是'],
['青年', '否', '否', '一般', '否'],
['中年', '否', '否', '一般', '否'],
['中年', '否', '否', '好', '否'],
['中年', '是', '是', '好', '是'],
['中年', '否', '是', '非常好', '是'],
['中年', '否', '是', '非常好', '是'],
['老年', '否', '是', '非常好', '是'],
['老年', '否', '是', '好', '是'],
['老年', '是', '否', '好', '是'],
['老年', '是', '否', '非常好', '是'],
['老年', '否', '否', '一般', '否']]
label = ['年龄', '有工作', '有自己的房子', '信贷情况']
return dataset, label

def calculateEntopy(dataSet):  # 计算训练集的信息熵
resultList = [data[-1] for data in dataSet]
lenOfResult = float(len(resultList))
uniqueLabels = set(resultList)
curEntropy = 0.0
for label in uniqueLabels:
prob = resultList.count(label) / lenOfResult
curEntropy -= prob * math.log(prob, 2)
return curEntropy

def splitDataSet(dataSet,i,value):  #根据某列的某个属性值对数据集进行划分
returnDataSet=[]
for data in dataSet:
if data[i] == value:
returnList=data[:i]
returnList.extend(data[i+1::])
returnDataSet.append(returnList)
return returnDataSet

def calculateGain(dataSet, i):  # 计算根据某个特征进行划分后的信息增益
m = float(len(dataSet))
baseEntropy = calculateEntopy(dataSet)
listOfValue = [data[i] for data in dataSet]
uniqueValueList = set(listOfValue)
newEntropy = 0.0
for value in uniqueValueList:
returnDataSet=splitDataSet(dataSet,i,value)
newEntropy += (len(returnDataSet) / m) * calculateEntopy(returnDataSet)
return baseEntropy - newEntropy

def chooseBestValueToSplit(dataSet):  # 通过本函数寻找能获得最大增益的属性
m, n = shape(dataSet)
bestInfoGain = 0
bestValue = 0.0
for i in range(n - 1):
curInfoGain = calculateGain(dataSet, i)
if curInfoGain > bestInfoGain:
bestInfoGain = curInfoGain
bestValue = i
return bestValue

dataSet, label = loadDataSet()
print(chooseBestValueToSplit(dataSet))
print(label[chooseBestValueToSplit(dataSet)])
输出结果为:
2
有自己的房子
made by zcl at CUMT
I know I can because I have a heart that beats

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AI ML