机器学习笔记索引

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

决策树算法优缺点:优点:计算复杂度不高,输出结果易于理解,对中间值缺失不敏感,可以处理不相关的特征数据缺点:可能会产生过度匹配的问题适用数据类型:数值型和标称型算法思想:1.决策树构造的整体思想:决策树说白了就好像是if-else结构一样,它的结果就是你要生成这个一个可以从根开始不断判断选择到叶子节点的树,但是呢这里的if-else必然不会是让我们认为去设置的,我们要做的是提供一种方法,计算机可以根据这种方法得到我们所需要的决策树。这个方法的重点就在于如何从这么多的特征中选择出有价值的,并且按照最好的顺序由根到叶选择。完成了这个我们也就可以递归构造一个决策树了

2.信息增益划分数据集的最大原则是将无序的数据变得更加有序。既然这又牵涉到信息的有序无序问题,自然要想到想弄的信息熵了。这里我们计算用的也是信息熵(另一种方法是基尼不纯度)。公式如下:

数据需要满足的要求:1 数据必须是由列表元素组成的列表,而且所有的列白哦元素都要具有相同的数据长度

2 数据的最后一列或者每个实例的最后一个元素应是当前实例的类别标签

函数:calcShannonEnt(dataSet)

计算数据集的香农熵,分两步,第一步计算频率,第二部根据公式计算香农熵

splitDataSet(dataSet, aixs, value)

划分数据集,将满足X[aixs]==value的值都划分到一起,返回一个划分好的集合(不包括用来划分的aixs属性,因为不需要)

chooseBestFeature(dataSet)

选择最好的属性进行划分,思路很简单就是对每个属性都划分下,看哪个好。这里使用到了一个set来选取列表中唯一的元素,这是一中很快的方法

majorityCnt(classList)

因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类还是没有算完,这时候就会采用多数表决的方式计算节点分类

createTree(dataSet, labels)

基于递归构建决策树。这里的label更多是对于分类特征的名字,为了更好看和后面的理解。

1#coding=utf-82importOperator3frommathimportlog4importtime56defcreateDataSet():7dataSet=[[1,1,'yes'],8[1,1,'yes'],9[1,0,'no'],10[0,1,'no'],11[0,1,'no']]12labels = ['no surfaceing','flippers']13returndataSet, labels1415#计算香农熵16defcalcShannonEnt(dataSet):17numEntries =len(dataSet)18labelCounts ={}19forfeaVecindataSet:20currentLabel = feaVec[-1]21ifcurrentLabelnotinlabelCounts:22labelCounts[currentLabel] =023labelCounts[currentLabel] += 124shannonEnt = 0.025forkeyinlabelCounts:26PRob = float(labelCounts[key])/numEntries27shannonEnt -= prob * log(prob, 2)28returnshannonEnt2930defsplitDataSet(dataSet, axis, value):31retDataSet =[]32forfeatVecindataSet:33iffeatVec[axis] ==value:34reducedFeatVec =featVec[:axis]35reducedFeatVec.extend(featVec[axis+1:])36retDataSet.append(reducedFeatVec)37returnretDataSet3839defchooseBestFeatureToSplit(dataSet):40numFeatures = len(dataSet[0]) - 1#因为数据集的最后一项是标签41baseEntropy =calcShannonEnt(dataSet)42bestInfoGain = 0.043bestFeature = -144foriinrange(numFeatures):45featList = [example[i]forexampleindataSet]46uniqueVals =set(featList)47newEntropy = 0.048forvalueinuniqueVals:49subDataSet =splitDataSet(dataSet, i, value)50prob = len(subDataSet) /float(len(dataSet))51newEntropy += prob *calcShannonEnt(subDataSet)52infoGain = baseEntropy -newEntropy53ifinfoGain >bestInfoGain:54bestInfoGain =infoGain55bestFeature =i56returnbestFeature5758#因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类59#还是没有算完,这时候就会采用多数表决的方式计算节点分类60defmajorityCnt(classList):61classCount ={}62forvoteinclassList:63ifvotenotinclassCount.keys():64classCount[vote] =065classCount[vote] += 166returnmax(classCount)6768defcreateTree(dataSet, labels):69classList = [example[-1]forexampleindataSet]70ifclassList.count(classList[0]) ==len(classList):#类别相同则停止划分71returnclassList[0]72iflen(dataSet[0]) == 1:#所有特征已经用完73returnmajorityCnt(classList)74bestFeat =chooseBestFeatureToSplit(dataSet)75bestFeatLabel =labels[bestFeat]76myTree ={bestFeatLabel:{}}77del(labels[bestFeat])78featValues = [example[bestFeat]forexampleindataSet]79uniqueVals =set(featValues)80forvalueinuniqueVals:81subLabels = labels[:]#为了不改变原始列表的内容复制了一下82myTree[bestFeatLabel][value] =createTree(splitDataSet(dataSet,83bestFeat, value),subLabels)84returnmyTree8586defmain():87data,label =createDataSet()88t1 =time.clock()89myTree =createTree(data,label)90t2 =time.clock()91printmyTree92print'execute for',t2-t193if__name__=='__main__':94main()

机器学习笔记索引

来自为知笔记(Wiz)

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航