上一篇博文讲的k-NN算法是最简单的一种分类算法,精度高。但是,时间复杂度和空间复杂度都比较大,还有一个重要的缺点就是它无法给出数据的知识信息。说白了,就是不能为分类提供一个模型。这篇中讲到的决策树则能够从数据中提取规则,这些机器根据数据集创建规则时就是机器学习的过程。
1.决策树算法:
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
2.ID3算法
决策树的关键就是进行数据划分,数据划分有两种算法:ID3和C4.5。我们这里使用ID3算法。
简单的说,ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂。
关于信息增益的计算,可以参照以下博文,讲的简单明了:
http://shiyanjun.cn/archives/417.html
这里只列出公式,数据集的信息熵通过下式计算:
按照某一属性进行数据划分,得到的新的信息熵:
信息增益即为两者的差值:
要想计算信息增益,首先需要计算熵。
新建trees.py编辑代码如下:
from math import *
import operator
#计算信息熵
def calcShannonEnt(dataSet):
#数据数量
numEntries = len(dataSet)
labelCounts = {}
#统计每个属性出现的次数
for featVec in dataSet: #the the number of unique elements and their occurance
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 createDataSet():
dataSet=[[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels=['no surfacing','flippers']
return dataSet,labels
进入python界面,执行一下命令
>>>import trees
>>>myData,labels=trees.createDataSet()
>>>trees.calcShannonEnt(myData)
输出训练数据的熵值:
0.97.95.5944546686
3 现在得到了测试信息上的方法,我们下一步需要划分数据集。我们将要对每个特真正划分的数据结果进行熵的计算,通过信息增益的大小,判断那个属性划分数据集是最好的方式。我们有限系一个划分数据集的函数:
#划分数据集合,参数dataSet:待划分的数据集,axis表示划分数据集的属性在第几列
#value表示属性的值
#返回值:数据集合中属性axis列,属性值为value的数据集合,新集合的属性个数变为N-1
def splitDataSet(dataSet,axis,value):
#创建一个新的数据集,用于存放划分之后的数据集合
reDataSet=[]
for featVec in dataSet:
if featVec[axis]== value:
#如何有符合条件的属性,添加到新的数据集中
#注意,这里面去掉了用于划分的属性列
reducedFeatVec=featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
reDataSet.append(reducedFeatVec)
return reDataSet
测试数据集合:
>>>reload(trees)
>>>myData,Labels=trees.createDataSet()
按照第一列属性进行划分,划分的值为1
>>>trees.splitDataSet(myData,0,1)
返回[[1,'yes'],[1,'yes'],[0,'no']]
4.接下来我们就可以循环使用上面的函数,选择最好的划分属性,继续编辑代码如下:
#选择最好的划分属性
def chooseBestFeatureToSplit(dataSet):
#属性个数
numFeatures=len(dataSet[0])-1
#原始数据的信息熵
baseEntropy=calcShannonEnt(dataSet)
#初始化信息增益、最好划分属性
baseInfoGain=0.0
bestFeature=-1
#遍历所有属性
for i in range(numFeatures):
#统计第i个属性的值,注意python的这种写法,简直太强大了!
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>baseInfoGain):
baseEntropy=infoGain;
bestFeature=i
return bestFeature
5 上一步我们其实实现了决策树是如何划分树枝的。下面我们将以上的方法整合起来,构建一个真正的决策树。
构建树的过程是一个递归过程:首先我们根据最好的属性进行数据划分,由于数据的特征值可能不止两个,因此可能存在大于两个的分支,第一次划分之后,数据将被传递到下一节点。在这个节点上,我们继续进行数据划分。递归进行下去。递归终止的条件:程序遍历完所有划分数据集的属性,或者每个分支下的所有实例都具有相同的分类。如果所有实例具有相同的分类,则得到一个叶子节点。当然,我们也可以设置算法可以划分的最大分组数目。先写一个统计函数:
#统计分类名称列表中每个类标签出现的频率
def majorityCnt(classList):
classCount={}
for vote in classList:
if vote not in classCount.keys():classCount[vote]=0
classCount[value]+=1
sortedClassCount=sorted(classCount.iteritems(),\
key=operator.iteritems(1),reverse=True)
return sortedClassCount[0][0]
接下来,我们就可以按照刚才的递归方式及递归结束时间构建决策树了:
#构建决策树
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)
#这里的labels表示属性列表,并不是类标签
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
测试我们的决策树
>>>reload(trees)
>>>myData,Labels=trees.createDataSet()
>>>myTree=createTree(myData,Labels)
得到如下结果:
- 大小: 4.1 KB
分享到:
相关推荐
这个"机器学习实战项目决策树完整项目"提供了一个实际应用决策树算法的案例,可以帮助学习者深入理解并掌握决策树的构建、训练和评估过程。 决策树的基本原理是通过学习数据集中的特征来构建一个树形模型,其中每个...
总之,这个压缩包提供了对决策树和ID3算法的全面理解,包括理论和实践两方面,对于学习和应用机器学习的读者来说是一份宝贵的资料。通过阅读代码和注释,你可以深入掌握如何在Python中实现决策树,并理解其内在的...
### 机器学习实战-决策树-隐形眼镜测试数据 #### 知识点解析 在《机器学习实战》一书中,作者通过多个实例介绍了各种机器学习算法的实际应用过程。其中,“决策树”章节是该书的一个重点部分,它不仅详细解释了...
适合人群:对机器学习有一定基础并想进一步深入研究的科研人员和开发人员,尤其是那些使用 R 语言进行数据分析的工作者。 使用场景及目标:适用于需要进行分类和回归任务的数据分析师和研究人员,帮助他们提高模型的...
使用python3版本修改机器学习实战中python2的代码
决策树是一种广泛应用于机器学习领域的算法,主要用于分类和回归任务。在这个“决策树代码”压缩包中,包含的文件主要用于实现决策树模型的构建、可视化和执行。下面将详细讲解决策树的基本概念、工作原理以及如何...
机器学习入门与实战(scikit-learn和Keras)课件—决策树.pdf机器学习入门与实战(scikit-learn和Keras)课件—决策树.pdf机器学习入门与实战(scikit-learn和Keras)课件—决策树.pdf机器学习入门与实战(scikit-learn和...
本资源包提供了一个关于如何使用Python进行机器学习实战,特别是决策树应用的教程。 首先,决策树算法基于特征和目标变量构建树形结构,其中每个内部节点代表一个特征测试,每个分支代表测试的结果,而叶节点则代表...
1、tree.py:决策树代码 2、treePlotter.py:在matplot中生成树形图的代码 3、classifierStorage.txt:生成树的测试数据 4、lenses.txt:决策树预测隐形眼镜类型所用的样本,每行前四个为特征:['age', 'prescript',...
在这个名为“机器学习实战项目——决策树&随机森林&时间序列预测股价.zip”的压缩包中,包含了一系列关于机器学习的应用,特别是聚焦于决策树、随机森林以及时间序列预测在股票价格预测上的应用。以下是这些技术的...
"机器学习案例实战:使用sklearn构造决策树模型"这一主题,聚焦于如何利用Python中的scikit-learn(简称sklearn)库构建和应用决策树模型。sklearn是机器学习实践中最常用的数据科学库之一,提供了丰富的机器学习...
在机器学习领域,决策树、随机森林、线性回归、逻辑回归、贝叶斯分类以及k近邻(k-Nearest Neighbors, kNN)算法是广泛应用的基础模型,它们各有特色,适用于不同的问题类型。接下来,我们将深入探讨这些概念及其在...
本项目为Python3环境下机器学习实战源码集,总计包含3076个文件,涵盖3040个txt文档、27个py源码文件、6个html文件和3个md文件。内容丰富,包含kNN、决策树、贝叶斯、逻辑回归、SVM、线性回归、树回归等多种机器学习...
《机器学习》算法实例-决策树算法-预测鱼类和非鱼类实例 根据不浮出水面是否可以生存、是否有脚蹼2 个特征,将动物分成两类: 鱼类和非鱼类。 收集数据: 可以使用任何方法 准备数据: 树构造算法(这里使用的是ID3算法...
在本案例中,我们关注的是使用Python实现决策树,具体体现在"机器学习实战"第三章的内容。虽然描述中提到这章可能并不太实用,但理解决策树的基本原理和Python实现仍然是非常重要的。 首先,让我们探讨决策树的基本...
《机器学习实战》是一本非常受欢迎的机器学习入门书籍,它通过实际的代码示例帮助读者理解各种机器学习算法的工作原理。本压缩包文件“机器学习实战示例代码.rar”包含了书中各个章节的关键示例代码,是理论学习与...
在“机器学习实战”中,决策树的学习通常包括以下几个步骤: 1. **数据预处理**:首先,我们需要对原始数据进行清洗和转换,处理缺失值、异常值,并将非数值特征转换为数值形式,以便于算法处理。 2. **特征选择**:...
**机器学习实战之树回归** 在机器学习领域,树回归是一种广泛应用的方法,它结合了决策树的直观性和回归分析的预测能力。本文将深入探讨树回归的核心概念、工作原理以及在实际应用中的策略。 首先,我们需要理解...
【决策树模型】是一种广泛应用的监督学习方法,尤其在分类问题中表现突出。它通过创建一个树状模型来表示样本空间及其类别分配规则。在这个实验中,我们将关注决策树在【鸢尾花数据集】上的应用,这是一个经典的数据...
在"机器学习实战——决策树"这个主题中,我们将深入探讨决策树的原理、构建过程以及在实际问题中的应用。 一、决策树的基本概念 决策树是一种非参数监督学习方法,它根据特征值来做出一系列决策,最终到达一个决策...