决策树原理:
决策树核心概念
信息熵 & 信息增益
熵: 熵(entropy)指的是体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。
信息熵(香农熵): 是一种信息的度量方式,表示信息的混乱程度,也就是说:信息越有序,信息熵越低。例如:火柴有序放在火柴盒里,熵值很低,相反,熵值很高。
信息增益: 在划分数据集前后信息发生的变化称为信息增益
我们学习的ID3决策树学习算法就是以信息增益为准则来选择划分属性。
输入训练集数据
这个数据集的路径写在了函数内,可以将文件路径和labels写在自定义函数外。
def getdataSet():
filename=open(r'C:\Users\op1691\Desktop\个人文件\学习文档\machinelearninginaction\Ch03\lenses.txt')
dt=pd.read_csv(filename,sep='\t')
train_dt=np.array(dt)
dt_list=train_dt.tolist()
labels=['age','prescript','astigmatic','tearRate']
return dt_list,labels
计算数据集信息熵
from math import log
import operator
import gc
import pandas as pd
import numpy as np
def calcShannonEnt(dataSet):
numEntries = len(dataSet)#计算鉴定数据集长度
labelCounts = {
}#创建空字典
for featVec in dataSet: #计算每个结果发生的个数,为求每个分类的概率做准备
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1 #得到每个结果对应的个数
shannonEnt = 0.0
for key in labelCounts: #求信息熵,信息熵公式
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2) #log base 2
return shannonEnt #自定义函数返回信息熵
划分数据集
def splitDateSet(dataSet,axis,value):#实现数据集划分,参数:待划分数据集、划分数据集的特征、特征值的返回值
retDataSet=[]#空列表
for featVec in dataSet:#
if featVec[axis]==value:#判断特征值等于特征的返回值
reducedFeatVec=featVec[:axis]#截取某特征之前的特征数据
reducedFeatVec.extend(featVec[axis+1:])#拼接某特征值之后的特征数据,构成新数据
retDataSet.append(reducedFeatVec) #数据集中满足特征值等于特征的返回值的样本
return retDataSet #划分某特征在特定特征值返回值时对应的数据集
选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataset):#选择数据集最好的特征划分的索引值
numFeatures=len(dataset[0])-1 #求特征字段个数
baseEntropy=calcShannonEnt(dataset)#求未划分前的信息熵
bestInfoGain=0.0; bestFeature=-1 # 初始化信息增益和最优特征
for i in range(numFeatures): #依次遍历每个特征,创建唯一的分类标签列表
featList=[example[i] for example in dataset] #求某特征的所有取值
uniqueVals=set(featList) #对某特征值进行去重,获得某特征的唯一元素取值
newEntropy=0.0
for value in uniqueVals