参考资料
- 《机器学习》-周志华
- 《统计学习方法》-李航
- 《机器学习实战》-Peter Harrington (美)
- 《加号机器学习讲义》-加号老师
摘要
机器学习包含监督学习、非监督学习、以及强化学习三大部分。监督学习又分为分类和回归两大类。决策树模型
就属于监督学习里的分类模型
。
正文
1.概念
决策树是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其叶子结点,最后将实例分到叶结点的类中。
决策树包含ID3和C4.5决策树以及CART决策树。
2.决策树的学习步骤
2.1决策树学习通常包含3个步骤:特征选择,决策树的生成和决策树的修剪。
2.2决策树模型的图示
3.特征选择
特征选择在于选取对训练数据具有分类能力的特征。这样可以特高决策树学习的效率。如果利用一个特征仅此那个分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比。
3.1熵的定义
H(x)=∑ni=1pi∗logpi
熵只依赖于x的分布,而与x的取值无关,所以也可以将x的熵记做:
H(p)=∑ni=1pi∗logpi
3.2信息增益
g(D,A)=H(D)−H(D|A)
一般地,熵H(Y)与条件熵H(Y|X)之差称之为互信息,决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
3.3信息增益比
特征A对训练数据集D的信息增益比Gr(D,A)定义为其信息增益G(D,A)与训练数据集D的经验熵H(D)之比:
gr(D,A)=g(D,A)H(D)
4.决策树算法
4.1 ID3算法
4.2 C4.5算法
熵H(p)随概率p变化的曲线如图
4.3 CART算法
4.3.1 最小二乘回归树
4.3.2 分类树的生成
5.主要代码实现
# 计算数据集的熵
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 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:
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob * calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if (infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
# 根据数据集创建决策树
def createTree(dataSet,labels):
classList = [example[-1] for example in dataSet]
if classList.count(classList[0]) == len(classList):
return classList[0]
if len(dataSet[0]) == 1:
return majorityCnt(classList)
bestFeat = chooseBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree = {bestFeatLabel:{}}
del(labels[bestFeat])
featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree
总结
决策树的主要优点是模型仅有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。
决策树学习旨在构建一个与训练数据拟合很好,并且复杂的决策树。因为从可能的决策树中直接选取最优决策树时NP完全问题。现实中采用启发式方法学习次优化的决策树。
本章代码下载 https://github.com/yanwosky4/MLNotebookProject/tree/master/note3-DecisionTree
邮箱: yanwosky4@gmail.com
github地址: https://github.com/yanwosky4 ,欢迎Star