统计学习方法第五章决策树的选择最优特征划分例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
相关文章推荐
- 李航统计学习方法决策树的特征选择例5.2python代码
- 统计学习方法第五章决策树的ID3算法代码实践 例5.3
- 统计学习方法第五章决策树C4.5算法代码实践
- 统计学习方法第五章CART算法代码实践例题5.4
- 李航 统计学习 例5,1 根据信息增益选择最优特征
- 统计学习方法第10章隐马尔可夫模型后向算法例题10.2代码实践
- 统计学习方法第6 章的例6.1求最大熵用随机数代码实践
- 统计学习方法——第五章决策树
- 统计学习方法第10章隐马尔可夫模型Viterbi算法例10.3代码实践
- 统计学习方法第二章例题2.2代码实践,感知机的对偶形式的代码实现
- 统计学习方法第三章例3.1代码实践
- 机器学习实战之决策树(2)---选择最好的特征来划分数据集
- 李航 统计学习方法 第五章 决策树 课后 习题 答案
- 统计学习方法第七章的序列最小最优化算法SMO代码实践
- 统计学习方法第11章条件随机场例11.1的代码实践
- 统计学习方法第11章条件随机场(CRF)的Viterbi算法例题11.3代码实践
- 统计学习方法第八章AdaBoost算法的例8.1代码实践
- 机器学习笔记 - 决策树最优划分属性选择
- 统计学习方法第四章朴素贝叶斯的贝叶斯估计,例题4.2代码实践
- Python进行文本预处理(文本分词,过滤停用词,词频统计,特征选择,文本表示)