分类回归树
logit模型和分类回归树(cart)模型
logit模型和分类回归树(cart)模型
Logit模型和分类回归树(CART)模型都是重要的预测模型,但在应用和
性质上有显著的区别。
Logit模型,也被称为“评定模型”或“分类评定模型”,是离散选择法模
型之一,也是应用最广的模型。
它属于多重变量分析范畴,是社会学、生物统计学、临床、数量心理学、计量经济学、市场营销等统计实证分析的常用方法。
在社会科学中,应用最多的是 Logistic 回归分析。
根据因变量取值
类别不同,Logistic 回归分析又可以分为二元 Logistic 回归分析和多元Logistic 回归分析。
CART,全称为分类回归树,是几乎所有复杂决策树算法的基础。
CART 是
一棵二叉树,既能是分类树,也能是回归树,由目标任务决定。
当CART 是分类树时,采用 GINI 值作为结点分裂的依据;当CART 是回归树时,采用MSE(均方误差)作为结点分裂的依据。
综上所述,Logit模型和CART模型在应用和性质上都有显著的区别。
Logit 模型主要用于离散选择分析,而CART模型主要用于决策树的生成。
如需了解更多关于这两种模型的信息,建议咨询统计学专家或查阅统计学相关书籍。
CART(分类回归树)原理和实现
CART(分类回归树)原理和实现前⾯我们了解了决策树和adaboost的决策树墩的原理和实现,在adaboost我们看到,⽤简单的决策树墩的效果也很不错,但是对于更多特征的样本来说,可能需要很多数量的决策树墩或许我们可以考虑使⽤更加⾼级的弱分类器,下⾯我们看下CART(Classification And Regression Tree)的原理和实现吧CART也是决策树的⼀种,不过是满⼆叉树,CART可以是强分类器,就跟决策树⼀样,但是我们可以指定CART的深度,使之成为⽐较弱的分类器CART⽣成的过程和决策树类似,也是采⽤递归划分的,不过也存在很多的不同之处数据集:第⼀列为样本名称,最后⼀列为类别,中间为特征human constant hair true false false false true false mammalpython cold_blood scale false true false false false true reptilesalmon cold_blood scale false true false true false false fishwhale constant hair true false false true false false mammalfrog cold_blood none false true false sometime true true amphibiouslizard cold_blood scale false true false false true false reptilebat constant hair true false true false true false mammalcat constant skin true false false false true false mammalshark cold_blood scale true false false true false false fishturtle cold_blood scale false true false sometime true false reptilepig constant bristle true false false false true true mammaleel cold_blood scale false true false true false false fishsalamander cold_blood none false true false sometime true true amphibious特征名称如下["temperature","cover","viviparity","egg","fly","water","leg","hibernate"]1:数据集划分评分CART使⽤gini系数来衡量数据集的划分效果⽽不是⾹农熵(借⽤下⾯的⼀张图)def calGini(dataSet):numEntries = len(dataSet)labelCounts={}for featVec in dataSet:currentLabel = featVec[-1]if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0labelCounts[currentLabel] += 1gini=1for label in labelCounts.keys():prop=float(labelCounts[label])/numEntriesgini -=prop*propreturn gini2:数据集划分决策树是遍历每⼀个特征的特征值,每个特征值得到⼀个划分,然后计算每个特征的信息增益从⽽找到最优的特征;CART每⼀个分⽀都是⼆分的,当特征值⼤于两个的时候,需要考虑特征值的组合得到两个“超级特征值”作为CART的分⽀;当然我们也可以偷懒,每次只取多个特征值的⼀个,挑出最优的⼀个和剩下的分别作为⼀个分⽀,但⽆疑这得到的cart不是最优的# 传⼊的是⼀个特征值的列表,返回特征值⼆分的结果def featuresplit(features):count = len(features)#特征值的个数if count < 2:print"please check sample's features,only one feature value"return -1# 由于需要返回⼆分结果,所以每个分⽀⾄少需要⼀个特征值,所以要从所有的特征组合中选取1个以上的组合# itertools的combinations 函数可以返回⼀个列表选多少个元素的组合结果,例如combinations(list,2)返回的列表元素选2个的组合# 我们需要选择1-(count-1)的组合featureIndex = range(count)featureIndex.pop(0)combinationsList = []resList=[]# 遍历所有的组合for i in featureIndex:temp_combination = list(combinations(features, len(features[0:i])))combinationsList.extend(temp_combination)combiLen = len(combinationsList)# 每次组合的顺序都是⼀致的,并且也是对称的,所以我们取⾸尾组合集合# zip函数提供了两个列表对应位置组合的功能resList = zip(combinationsList[0:combiLen/2], combinationsList[combiLen-1:combiLen/2-1:-1])return resList得到特征的划分结果之后,我们使⽤⼆分后的特征值划分数据集def splitDataSet(dataSet, axis, values):retDataSet = []for featVec in dataSet:for value in values: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 #bestGiniGain = 1.0; bestFeature = -1;bestBinarySplit=()for i in range(numFeatures): #遍历特征featList = [example[i] for example in dataSet]#得到特征列uniqueVals = list(set(featList)) #从特征列获取该特征的特征值的set集合# 三个特征值的⼆分结果:# [(('young',), ('old', 'middle')), (('old',), ('young', 'middle')), (('middle',), ('young', 'old'))]for split in featuresplit(uniqueVals):GiniGain = 0.0if len(split)==1:continue(left,right)=split# 对于每⼀个可能的⼆分结果计算gini增益# 左增益left_subDataSet = splitDataSet(dataSet, i, left)left_prob = len(left_subDataSet)/float(len(dataSet))GiniGain += left_prob * calGini(left_subDataSet)# 右增益right_subDataSet = splitDataSet(dataSet, i, right)right_prob = len(right_subDataSet)/float(len(dataSet))GiniGain += right_prob * calGini(right_subDataSet)if (GiniGain <= bestGiniGain): #⽐较是否是最好的结果bestGiniGain = GiniGain #记录最好的结果和最好的特征bestFeature = ibestBinarySplit=(left,right)return bestFeature,bestBinarySplit所有特征⽤完时多数表决程序def majorityCnt(classList):classCount={}for vote in classList:if vote not in classCount.keys(): classCount[vote] = 0classCount[vote] += 1sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]现在来⽣成cart吧def createTree(dataSet,labels):classList = [example[-1] for example in dataSet]# print dataSetif classList.count(classList[0]) == len(classList):return classList[0]#所有的类别都⼀样,就不⽤再划分了if len(dataSet) == 1: #如果没有继续可以划分的特征,就多数表决决定分⽀的类别# print "here"return majorityCnt(classList)bestFeat,bestBinarySplit = chooseBestFeatureToSplit(dataSet)# print bestFeat,bestBinarySplit,labelsbestFeatLabel = labels[bestFeat]if bestFeat==-1:return majorityCnt(classList)myTree = {bestFeatLabel:{}}featValues = [example[bestFeat] for example in dataSet]uniqueVals = list(set(featValues))for value in bestBinarySplit:subLabels = labels[:] # #拷贝防⽌其他地⽅修改if len(value)<2:del(subLabels[bestFeat])myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)return myTree看下效果,左边是cart,右边是决策树,(根节点⽤cover和temperature是⼀样的,为了对⽐决策树,此时我选了cover),第三个图是temperature作为根节点的cart上⾯的代码是不考虑特征继续使⽤的,也就是每个特征只使⽤⼀次;但是我们发现有些有些分⽀⾥⾯特征值个数多余两个的,其实我们应该让这些特征继续参与下⼀次的划分可以发现,temperature作为根节点的cart没有变化,⽽cover作为根节点的cart深度变浅了,并且cover特征出现了两次(或者说效果变好了)下⾯是有变化的代码特征值多余两个的分⽀保留特征值def splitDataSet(dataSet, axis, values):retDataSet = []if len(values) < 2:for featVec in dataSet:if featVec[axis] == values[0]:#如果特征值只有⼀个,不抽取当选特征reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis+1:])retDataSet.append(reducedFeatVec)else:for featVec in dataSet:for value in values:if featVec[axis] == value:#如果特征值多于⼀个,选取当前特征retDataSet.append(featVec)return retDataSetcreateTree函数for循环判断是否需要移除当前最优特征for value in bestBinarySplit:if len(value)<2:del(labels[bestFeat])subLabels = labels[:] #拷贝防⽌其他地⽅修改myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)这样我们就⽣成了⼀个cart,但是这个数据集没有出现明显的过拟合的情景,我们换⼀下数据集看看sunny hot high FALSE nosunny hot high TRUE noovercast hot high FALSE yesrainy mild high FALSE yesrainy cool normal FALSE yesrainy cool normal TRUE noovercast cool normal TRUE yessunny mild high FALSE nosunny cool normal FALSE yesrainy mild normal FALSE yessunny mild normal TRUE yesovercast mild high TRUE yesovercast hot normal FALSE yesrainy mild high TRUE no特征名称:"Outlook" , "Temperature" , "Humidity" , "Wind"⽣成的cart⽐价合理,这是因为数据⽐较合理,我们添加⼀条脏数据看看cart会变成怎么样(右图),可以看到cart为了拟合我新加的这条脏数据,树深度增加1,叶⼦节点增加3,不过另⼀⽅⾯也是因为样本数少的原因,⼀个噪声样本就产⽣了如此⼤的印象overcast mild normal FALSE no下⼀篇博客我们继续讨论cart连续值的⽣成以及剪枝的实验。
分类与回归树
• 一个节点产生左右孩子后,递归地对左右孩子进 行划分即可产生分类回归树。当节点包含的数据 记录都属于同一个类别时就可以终止分裂了。 • 当分类回归树划分得太细时,会对噪声数据产生 过拟合作用。因此我们要通过剪枝来解决。剪枝 又分为前剪枝和后剪枝:前剪枝是指在构造树的 过程中就知道哪些节点可以剪掉,于是干脆不对 这些节点进行分裂,在分类回归树中可以使用的 后剪枝方法有多种,比如:代价复杂性剪枝、最 小误差剪枝、悲观误差剪枝等等。
• 分类与回归树: • 分类回归树(CART,Classification And Regression Tree)属于一种决策树,分类回 归树是一棵二叉树,且每个非叶子节点都 有两个孩子,所以对于第一棵子树其叶子 节点数比非叶子节点数多1。
• 上例是属性有8个,每个 属性又有多少离散的值可 取。在决策树的每一个节 点上我们可以按任一个属 性的任一个值进行划分。 比如最开始我们按: 1)表面覆盖为毛发和非毛发 2)表面覆盖为鳞片和非鳞片 3)体温为恒温和非恒温 等等产生当前节点的左右两个孩子。按哪种划分最好呢?有 3个标准可以用来衡量划分的好坏:GINI指数、双化指数、 有序双化指数。下面我们只讲GINI指数。
• 总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。 比如体温为恒温时包含哺乳类5个、鸟类2个,则: • 体温为非恒温时包含爬行类3个、鱼类3个、两栖类2个,则 • 所以如果按照“体温为恒温和非恒温”进行划分的话,我们得到GINI 的增益(类比信息增益):划分。
决策树之CART算法(回归树分类树)
决策树之CART算法(回归树分类树)
**CART算法(Classification and Regression Trees)**是一种运
用在分类和回归问题中的决策树学习算法,它的本质是一种机器学习算法,主要用于对数据进行分类和回归。
它由美国统计学家 Breiman等人在
1984年提出。
CART算法可以将复杂的数据集简单地划分成多个部分,其本质是一
种贪心算法,可以让学习者从实例中学习决策树,用于解决复杂的分类或
回归问题。
该算法通过构建最优二叉树来实现特征选择,从而使得分类的
准确性最大化。
###CART算法的原理
CART算法是一种有监督学习的算法,可以将训练数据或其他更复杂
的信息表示为一棵二叉树。
通过采用不断划分训练集的方式,将数据集划
分成越来越小的子集,使数据更容易分类。
基本原理如下:
1.首先从根结点开始,从训练集中选择一个最优特征,使用该特征将
训练集分割成不同的子集。
2.递归地从每个子结点出发,按照CART算法,每次选择最优特征将
其分割成不同的子结点。
3.当到达叶子结点时,从所有的叶子结点中选出一个最优的结点,比
如分类误差最小的结点,作为最终的结果。
###CART算法的执行流程
CART算法的执行流程如下:
1.首先,从训练集中获取每个特征的可能取值。
cart算法题目
cart算法题目Cart算法,也称为分类和回归树(Classification and Regression Tree),是一种常用的决策树学习方法。
下面是一些关于Cart算法的题目,用于练习和检验自己对Cart算法的理解:1. 基本概念•解释什么是决策树,并给出其优缺点。
◦解释什么是Cart算法,它在哪些场景中应用?2. 构建决策树•使用Cart算法,给出如何根据数据集构建决策树的步骤。
◦当在某个节点上划分不成功时,如何处理?3. 特征选择•解释如何使用Gini指数或基尼不纯度进行特征选择。
◦解释如何使用信息增益或增益率进行特征选择。
4. 剪枝•为什么要对决策树进行剪枝?◦给出决策树剪枝的几种常见方法。
5. 应用场景•Cart算法可以用于分类问题,还可以用于回归问题。
给出一些应用场景。
6. 与其他算法比较•与其他分类算法(如K近邻、支持向量机、朴素贝叶斯)相比,Cart算法的优点和缺点是什么?7. 实战问题•给出一个数据集,使用Cart算法构建决策树,并解释结果。
◦对于一个分类问题,如何使用Cart算法进行预测?8. 优缺点•列出Cart算法的优缺点,并给出改进的方法。
9. 过拟合与欠拟合•Cart算法也可能遇到过拟合和欠拟合问题,解释这两种问题并给出解决方法。
10. 其他注意事项•在使用Cart算法时,还需要注意哪些问题?例如参数选择、特征选择等。
这些题目涵盖了Cart算法的基本概念、构建、应用和一些注意事项。
通过回答这些问题,可以帮助你深入理解Cart算法,并为实际应用打下基础。
分类与回归树 决策树
4.3 决策树/分类树(Decision or Classification Trees)
决策树是一个多阶段决策过程,它不是一次用样本的所有特征进
行决策,而是逐次地用各个特征分量进行决策。
例如,一个6维向量x
=
(x 1, x 2, x 3, x 4, x 5, x 6)T ,决策树如图4.5所示。
决策树的构造一般有下列3个步骤:
(1) 为每一个内部节点(Internal Node)选择划分规则。
(2) 确定终节点(Terminal Nodes)。
(3) 给终节点分配类别标签(Class Labels)。
例如,根据图 4.6a 所示的二维数据分布情况,可以画出图 4.6b 所示的决策树。
x 6<2
x 5<5
x 4<1 x 1<2
ω1 ω2
ω1
ω3 ω2 Yes No
Yes Yes
Yes No
No
No
图4.5 一个决策树示意图
我们可以利用决策树的原理来解决多类别问题,例如,用一个线性分类器(例如Fisher 分类器)解决多类别问题。
图4.6a 一个二维空间样本分布示例
图4.6b 对应的决策树
x k >b 2
x k <b 1
x i <a 2 x k >b 3 ω8
ω9 ω6
ω4
Yes No
Yes Yes
Yes
No
No No x i >a 1
ω10
ω1 Yes
No。
分类和回归树算法
分类和回归树算法分类和回归树(CART)是一种常用的决策树算法,用于解决分类和回归问题。
它可以根据给定的特征将数据集划分为不同的区域,并在每个区域内预测目标变量的取值。
在本文中,我将详细介绍CART算法的原理、构建过程和优缺点。
一、CART算法原理CART算法是一种基于特征划分的贪心算法,它通过递归地划分数据集来构建决策树。
算法的核心思想是选择一个最优特征和最优切分点,使得划分后的子集尽可能纯净。
具体来说,CART算法构建决策树的过程如下:1.选择最优特征和最优切分点:遍历所有特征和所有可能的切分点,计算每个切分点的基尼指数(用于分类)或均方差(用于回归),选择使得切分后子集纯度最大或方差最小的特征和切分点。
2.划分数据集:将数据集根据选定特征和切分点划分为两个子集,一个子集包含特征值小于等于切分点的样本,另一个子集包含特征值大于切分点的样本。
3.递归构建子树:对于每个子集,重复上述步骤,直到满足停止条件。
停止条件可以是:达到最大深度、子集中样本数量小于一些阈值、子集中样本类别完全相同等。
4.构建决策树:重复上述步骤,不断构建子树,将所有子树连接起来形成一棵完整的决策树。
5.剪枝:在构建完整的决策树后,通过剪枝来减小过拟合。
剪枝是通过判断在进行划分后树的整体性能是否有所提升,如果没有提升,则将该子树转化为叶节点。
二、CART算法构建过程下面以分类问题为例,详细描述CART算法的构建过程。
1. 输入:训练集D = {(x1, y1), (x2, y2), ..., (xn, yn)},特征集A = {a1, a2, ..., am}。
2.输出:决策树T。
3.若D中所有样本都属于同一类别C,则将T设为单节点树,并标记为C类,返回T。
4.若A为空集,即无法再选择特征进行划分,则将T设为单节点树,并将D中样本数量最多的类别标记为C类,返回T。
5. 选择最优特征a*和最优切分点v*:遍历特征集A中的每个特征ai和每个可能的切分点vi,计算切分后子集的基尼指数或均方差,选择使得基尼指数或均方差最小的特征和切分点a*和v*。
CART分类与回归树方法介绍
1.软件下载与安装
1.软件下载与安装
该软件可从官方网站下载并安装。下载安装过程十分简单,只需根据提示完 成即可。
2.界面介绍
2.界面介绍
该软件采用图形用户界面(GUI),界面简洁明了,操作方便易用。主界面包 括菜单栏、工具栏、数据区和结果区等部分。
3.数据导入与清洗
3.数据导入与清洗
(1)点击菜单栏中的“文件”->“打开”,选择实验数据文件导入。支持多 种文件格式,如CSV、Excel等。
谢谢观看
CART分类
3、递归分割:将生成的两个子节点分别递归执行步骤1和2,直到满足停止条 件,生成最终的决策树。
CART分类
4、决策规则生成:根据生成的决策树,生成相应的决策规则,用于对新数据 进行分类。
回归树方法
回归树方法
回归树方法是CART方法的一种变种,主要用于预测连续型目标变量。回归树 通过构建决策树,实现对目标变量的预测。回归树方法的具体步骤如下:
5.结果输出与保存
5.结果输出与保存
(1)结果展示:在结果区展示拟合的回归模型参数、相关系数等结果。 (2)保存结果:点击“文件”->“保存”,将计算结果保存到本地电脑或云 端存储设备。
三、案例分析
三、案例分析
为了更好地说明毒力回归计算方法的应用和软件使用的效果,我们结合一个 实际案例进行阐述。某研究团队在研究某种生物毒素对水生生物的毒害作用时, 通过实验观测获得了毒素浓度与水生生物死亡率的数据。利用毒力回归计算软件, 我们对该数据进行毒力回归计算,并建立相应的回归模型。
案例分析
1、数据预处理:首先对用户购买行为的数据进行清洗和处理,包括去除异常 值、填补缺失值等。
案例分析
2、特征提取:然后对数据进行分析,选择出与购买行为相关的特征,如年龄、 性别、购买频率、购买金额等。
cart分类和回归树算法
主讲人: 贾娜
摘
要
一递归划分自变量空间
二用验证数据进行剪枝 三总结 四遗留问题
分类与回归树 (Classification And RegressionTrees,CART) 是一种产生二叉决策树的技术. 分类树与回归树下面有两个重要的思想: 第一个:递归地划分自变量空间的想法; 第二个:用验证数据进行剪枝的想法.
一递归划分自变量空间
递归划分
用Y表示因变量(分类变量); 用X1,X2,…,XP表示自变量. 通过递归的方式把关于X的P维空间划分为 不重叠的矩形.
划分步骤: 首先: 一个自变量被选择,例如Xi和Xi的一个 值Si,若选择Si把P维空间分为两部分:一部 分包含的点都满足Xi<=Si;另一部分包含的 点满足Xi>Si. 其次: 再把上步中得到的两部分中的一个部 分,通过选择一个变量和该变量的划分值以 相似的方式再划分. 重复上述步骤,直至把整个X空间划分成的 每个小矩形都尽可能的是同构的.
例示递归划分的过程 例1(Johnson和Wichern) 乘式割草机制造商意欲发现一个把城市 中的家庭分成那些愿意购买乘式割草机和 不愿意购买的两类的方法。在这个城市的 家庭中随机抽取12个拥有者和12个非拥有 者的家庭作为样本。这些数据如表1所示。 这里的自变量是收入(X1)和草地面积 (X2)。类别变量Y有两个类别:拥有者 和非拥有者。表1
剪枝方法: 当我们从0增加α到某一值时,我们首 先会遇到一个情形,对一些树T1通过在决 策点剪掉子树得到的,和额外增加误分 (由于有更少的叶子)而导致的成本与导 致的惩罚成本的节约相平衡。我们剪掉在 这个节点的子树来修剪整个树,并重新设 计这个节点为叶节点。把这时的树称为T1。 我们现在对T1重复先前用于整个树的过程, 通过进一步增加α的值。持续这种方式,我 们产生一些连续的带有节点数目减少的树 直到只有一个节点的树。
大数据经典算法CART讲解
大数据经典算法CART讲解CART(分类与回归树)是一种经典的机器学习算法,用于解决分类和回归问题。
它是由Leo Breiman等人在1984年提出的,是决策树算法的一种改进和扩展。
CART算法的核心思想是通过将输入空间划分为多个区域来构建一棵二叉树,每个区域用于表示一个决策规则。
CART算法的整个过程可以分为两个部分:生成和剪枝。
在生成阶段,CART算法通过递归地将数据集切分为两个子集,直到满足一些停止条件。
在剪枝阶段,CART算法通过剪枝策略对生成的树进行剪枝,以防止过拟合。
生成阶段中,CART算法的切分准则是基于Gini系数的。
Gini系数衡量了将数据集切分为两个子集后的不纯度,即数据集中样本不属于同一类别的程度。
CART算法通过选择Gini系数最小的切分点来进行切分,使得切分后的两个子集的纯度最高。
剪枝阶段中,CART算法通过损失函数来评估子树的贡献。
损失函数考虑了子树的拟合程度和子树的复杂度,以平衡模型的拟合能力和泛化能力。
剪枝阶段的目标是找到一个最优的剪枝点,使得剪枝后的子树的整体损失最小。
CART算法具有许多优点。
首先,CART算法可以处理多类别问题,不需要进行额外的转换。
其次,CART算法能够处理混合类型的数据,比如同时具有连续型和离散型特征的数据。
此外,CART算法能够处理缺失数据,并能够自动选择缺失数据的处理方法。
最后,CART算法生成的模型具有很好的可解释性,可以直观地理解决策过程。
然而,CART算法也存在一些不足之处。
首先,CART算法是一种贪心算法,通过局部最优来构建模型,不能保证全局最优。
其次,CART算法对输入特征的顺序敏感,不同的特征顺序可能会导致不同的模型结果。
此外,CART算法对噪声和异常值很敏感,可能会导致过拟合。
在实际应用中,CART算法广泛应用于分类和回归问题。
在分类问题中,CART算法可以用于构建决策树分类器,对样本进行分类预测。
在回归问题中,CART算法可以用于构建决策树回归器,根据输入特征预测输出值。
cart算法
cart算法
cart算法,全称Classification and Regression Trees,即分类与回归树算法,是一种基于决策树的机器学习算法。
cart算法可以用于分类问题和回归问题。
在分类问题中,cart算法根据特征值将数据集划分为多个子集,并通过选择一个最佳划分特征和划分阈值来构建决策树。
在回归问题中,cart算法根据特征值将数据集划分为多个子集,并通过选择一个最佳划分特征和划分阈值来构建回归树。
cart算法的核心思想是通过递归地选择最佳划分特征和划分阈值来构建决策树。
在每个节点上,通过计算基于当前特征和划分阈值的Gini指数(用于分类问题)或平方误差(用于回归问题)来评估划分的好坏,选择最小的Gini指数或平方误差对应的特征和划分阈值进行划分。
划分后的子集继续递归地进行划分,直到满足停止条件(如节点中的样本数小于预设阈值或达到最大深度为止),然后生成叶子节点并赋予相应的类别标签或回归值。
cart算法具有较好的拟合能力和可解释性,可以处理混合类型的特征和缺失值。
然而,cart算法容易过拟合,需要采取剪枝操作或加入正则化项来降低模型复杂度。
可以通过使用不同的评估标准和剪枝策略来改进cart算法,如基于信息增益、基尼系数、均方差等评估标准和预剪枝、后剪枝等剪枝
策略。
此外,也可以使用集成学习方法(如随机森林、梯度提升树)来进一步提高模型的性能。
大数据经典算法CART_讲解资料
大数据经典算法CART_讲解资料CART算法,即分类与回归树(Classification and Regression Tree)算法,是一种经典的应用于大数据分析的算法。
它将数据集按照特征属性进行划分,然后根据各个特征属性的分割点将数据集划分为多个子集,进而得到一个树形的划分结构。
通过分析划分特征和划分点的选择,CART算法能够高效地解决分类和回归问题。
对于分类问题,CART算法通过衡量不纯度(impurity)来选择划分特征和划分点。
常用的不纯度指标包括基尼指数(Gini index)和信息增益(information gain)。
基尼指数衡量了随机从一个样本集合中抽取两个样本,其中属于不同类别的概率;信息增益则使用熵(entropy)作为不纯度的度量标准。
CART算法会选择使得划分后的子集的纯度提升最大的特征属性和相应的划分点进行划分。
对于回归问题,CART算法通过最小化划分后的子集的方差来选择划分特征和划分点。
在每个内部节点上,CART算法选择使得划分后的子集的方差最小化的特征属性和相应的划分点进行划分。
CART算法的优点在于它能够处理高维数据和有缺失值的数据,具有较强的鲁棒性。
此外,CART算法构建的决策树具有可解释性,能够提供对数据的直观理解。
同时,CART算法还能处理不平衡类别数据和多类别问题。
然而,CART算法也存在一些不足之处。
首先,CART算法是一种局部最优算法,可能会陷入局部最优解而无法达到全局最优解。
其次,CART 算法不适用于处理连续型特征属性,需要对连续特征进行离散化处理。
此外,由于CART算法是自顶向下的贪心算法,因此容易过拟合,需要采用一些剪枝策略进行模型的修剪。
在实际应用中,为了提高CART算法的性能,可以使用集成学习方法如随机森林、梯度提升树等。
这些方法通过构建多个CART模型,并通过集成的方式来提高预测准确率和鲁棒性。
总结起来,CART算法是一种经典的大数据分析算法,适用于解决分类和回归问题。
cart算法应用场景
cart算法应用场景Cart算法(Classification and Regression Tree,分类回归树算法)是一种常用的机器学习算法,广泛应用于数据挖掘和预测分析的场景中。
它通过构建决策树模型,对输入数据进行分类或回归预测。
本文将介绍Cart算法的应用场景和具体案例,以及其优势和局限性。
一、电商推荐系统电商平台为了提高用户购物体验和销售额,经常会使用推荐系统向用户推荐感兴趣的商品。
Cart算法可以用于构建推荐系统中的商品推荐模型。
通过分析用户的历史购买记录、浏览行为、评价等数据,建立一个决策树模型,根据用户的个人偏好和行为模式,预测用户可能喜欢的商品,并进行推荐。
二、金融风控在金融行业中,风控是非常重要的一环。
Cart算法可以应用于信用评分和欺诈检测等场景。
通过分析客户的个人信息、财务状况、历史交易记录等数据,构建一个决策树模型,预测客户的信用等级,用于判断客户是否有还款能力。
同时,通过对比客户的实际交易行为与预测结果,可以检测出潜在的欺诈行为。
三、医疗诊断在医疗领域中,Cart算法可以应用于疾病诊断和预测。
通过分析患者的病历数据、体检结果、基因信息等,构建一个决策树模型,根据患者的特征预测患者是否患有某种疾病,并给出相应的治疗建议。
例如,在肿瘤诊断中,可以根据肿瘤的大小、位置、形状等特征,预测肿瘤的恶性程度,为医生提供辅助诊断的依据。
四、社交媒体情感分析社交媒体上有大量的用户评论和情感信息,Cart算法可以用于情感分析和用户情感预测。
通过对用户在社交媒体上的发言、评论等进行分析,构建一个决策树模型,预测用户对某个话题或产品的态度和情感倾向。
这对于企业来说,可以了解用户对产品的喜好和不满之处,从而改进产品和服务。
五、交通流量预测交通流量预测是城市交通规划和交通管理的重要内容之一。
Cart算法可以应用于交通流量预测中,通过分析历史的交通流量数据、天气状况、节假日等因素,构建一个决策树模型,预测未来某个时间段内的交通流量。
3.4分类回归树建模与应用.pdf
主要内容1.决策树算法概述●从学习角度看,决策树属有指导(监督)学习算法●目标:用于分类和回归2.C5.0(ID3,C4.5)算法及应用3.分类回归树及应用4.模型的对比分析5.决策树应用分类回归树●分类回归树(Classification And Regression Tree ,CART ,Breiman,1984)●特点:(对比C5.0)●既可建立分类树也可建立回归树(O :分类型/数值型)●只能建立2叉树●以Gini 系数和方差作为建树依据●依据测试样本集进行剪枝C5.0CART输出分类型分类型/数值型分支多分枝二分支建树依据信息熵(信息增益率)Gini 系数和方差修剪依据训练集测试集赫希曼根据洛伦茨曲线提出的判断分配平等程度的指标。
设实际收入分配曲线和收入分配绝对平等曲线之间的面积为A,实际收入分配曲线右下方的面积为B。
并以A除以(A+B)的商表示不平等程度。
这个数值被称为基尼系数或称洛伦茨系数。
低于0.2收入绝对平均0.2-0.3收入比较平均0.3-0.4收入相对合理0.4-0.5收入差距较大CART :生长算法●选择当前最佳分组变量●数值型输入变量和分类型输入变量,计算策略不同●分类树●数值型输入变量:分成两组(2叉树)●依次以相邻数值的中间值为组限分组●计算两组样本输出变量值的异质性●分组应尽量使两组的异质性总和较小,使两组异质性随着分组而快速下降怎样判断异质性大小呢?分类型?数值型?CART :生长算法(分类树)●异质性指标:Gini 系数●p (j |t )是节点t 中样本输出变量取第j 类的归一化概率●节点只有一个类别时,异质性最小时,Gini 系数为0;●节点各类样本相同时,异质性最大时,Gini 系数为1-1/k●异质性下降指标:●使异质性下降达到最大的组限应为当前最佳分割点∑=−=k j t j p t G 12)|(1)(∑≠i j )()()()(l l r r t G N N t G N N t G t G −−=∆pp jj ,tt =NN jj ,tt NN jj pp jj tt =pp (jj ,tt )∑jj pp (jj ,tt )●分类型输入变量:形成2个超类(2叉树)●多分类型输入变量:合并为超类●同数值型变量,应使两组的异质性总和达到最小,异质性下降最快●Twoing 策略:找到使两个超类差异足够大的合并点s ●Ordered 策略:适用于定序型输入变量,只有两个连续的别类才可合并成超类2|)|()|(|),( −=Φ∑j r l r l t j p t j p p p t s⏹异质性指标:方差⏹异质性下降指标:∑=−−=N i i t y t y N t R 12))()((11)()()()()(l l r r t R N N t R N N t R t R −−=∆节点t 的样本量CART:生长算法•如何分组变量的众多取值中找到最佳分割点?•已经在找分割变量的同时完成!CART:剪枝算法●预修剪策略●决策树最大深度●父节点和子节点所包含的最少样本量或比例●树节点中输出变量的最小异质性减少量●后修剪策略●根据一定的规则,剪去决策树中的那些不具有一般代表性的叶节点或子树●CART依次给出所有可能子树,从中挑选一棵●如何得到这些子树?挑选标准是什么?CART :剪枝算法●最小代价复杂性剪枝法(Minimal Cost Complexity Pruning ,MCCP )●目标:得到恰当的树,具有一定的预测精度,且复杂程度恰当●代价(误差)和复杂度之间的权衡是必要的●α●基于最小代价复杂性原则●α等于0时怎样?α很大时怎样?|~|)()(T T R T R αα+=●复杂决策树对训练集精度高,对测试集或新样本则不一定!(过拟合)●理解和应用复杂决策树比较复杂!不考虑复杂度一个节点1.{t}的代价复杂度2.{t}的子树Tt 的代价复杂度•例:判断能否剪掉一个中间节点{t}下的子树Ttαα+=)(})({t R t R |~|)()(t t t T T R T R αα+=)(})({t T R t R αα>保留子树,此时:1|~|)()(−−<t t T T R t R α1|~|)()(−−=tt T T R t R α1|~)()(−−>t t T T R t R α剪掉子树剪掉子树越小且小于α确定可算,关键3.判断是否剪枝CART :剪枝算法(*)⏹α是一个不断调整过程⏹α从0到α’的过程中:⏹此时应剪掉子树T t)(})({t T R t R αα>)(})({t T R t R αα<=αα+=)(})({t R t R |~|)()(t t t T T R T R αα+=⏹剪枝过程:产生子树序列T 1,T 2,T 3,…,T k 。
回归树和分类树例子
回归树和分类树例子
回归树和分类树是两种不同类型的决策树,它们在数据挖掘中有着广泛的应用。
回归树主要用于预测连续的目标变量,例如预测房价、股票价格等。
以预测房价为例,我们可以使用回归树来建立一个模型,通过输入房屋的各个特征(如面积、卧室数量、所在区域等),模型可以预测出房屋的售价。
在回归树中,每个叶节点表示一个连续的目标变量的值,而非叶节点表示一个特征和该特征的阈值,用于将数据集分成更小的子集。
分类树主要用于预测离散的目标变量,例如预测疾病类型、用户分类等。
以预测用户是否会购买某产品为例,我们可以使用分类树来建立一个模型,通过输入用户的各个特征(如年龄、性别、收入等),模型可以预测出用户是否会购买该产品。
在分类树中,每个叶节点表示一个离散的目标变量的类别,而非叶节点表示一个特征和该特征的阈值,用于将数据集分成更小的子集。
总之,回归树和分类树都是通过建立决策树来对数据进行分类或回归预测,但它们所处理的目标变量类型不同。
C A R T 分 类 与 回 归 树
【机器学习】十、分类和回归树CART原理一文详解,分类和回归树算法背后原理。
码字不易,喜欢请点赞,谢谢!!!一、前言分类和回归树(Classification And Regression Trees),简称CART,是1984年提出来的既可用于分类,又可用于回归的树。
CART被称为数据挖掘领域内里程碑式的算法。
上一节介绍了决策树的ID3和C4.5算法,后面说到了C4.5算法存在几点不足,主要为,生成多叉树;容易过拟合;只能用于分类;特征选择采用熵模型计算量大。
而CART针对C4.5算法的这几点不足都提出了改进。
本文将会一一介绍。
二、CART特征选择方法CART算法包括分类树和回归树,其中分类树和回归树的特征选择采用的是不同的方法,这里依次介绍。
CART分类树特征选择在ID3中,采用信息增益来选择特征;在C4.5中,采用信息增益率来选择特征;而在CART的分类树中,则是采用基尼系数来选择特征。
这是因为,信息论中的熵模型,存在大量的对数运算,而基尼系数在简化熵模型的计算的同时保留了熵模型的优点。
基尼系数基尼系数代表模型的纯度,基尼系数越大,模型越不纯;基尼系数越小,模型越纯。
因此在特征选择时,选择基尼系数小的来构建决策树,这和信息增益(率)是相反的。
基尼系数表达式:式中KKK表示分类问题有KKK个类别,第kkk个类别的概率为pkp_kpk?。
如果是二分类,公式将更简单,假设第一类的概率为ppp,则基尼系数表达式为:对于个给定的样本DDD,假设有KKK个类别, 第kkk个类别的数量为CkC_kCk?,则样本DDD的基尼系数表达式为:特别的,对于样本DDD,如果根据特征AAA的某个值aaa,把DDD分成D1D1D1和D2D2D2两部分,则在特征AAA的条件下,DDD的基尼系数表达式为:从熵模型到基尼系数到这里你可能还不明白为什么可以使用基尼系数来替代熵,推导如下:从上面推导可以得知,通过泰勒展开,可以将基尼系数近似的等价于熵模型。
数据分析中的回归树分类算法介绍
数据分析中的回归树分类算法介绍数据分析是现代社会中不可或缺的一项技术,而回归树分类算法则是其中一种重要的方法。
本文将介绍回归树分类算法的原理、应用场景以及优缺点。
一、回归树分类算法的原理回归树分类算法是一种基于决策树的机器学习方法,它通过对数据集进行递归的二分划分,将数据集划分为多个子集,每个子集对应一个叶子节点。
在每个节点上,通过选择最优的划分变量和划分点,使得划分后的子集中目标变量的方差最小化。
这样,通过不断划分数据集,最终构建出一棵回归树。
回归树分类算法的核心思想是将数据集分割成多个小的、相对简单的子集,每个子集内的数据具有较高的相似性。
这样,对于新的数据样本,可以根据其特征值递归地在回归树中进行判断,最终确定其分类。
二、回归树分类算法的应用场景回归树分类算法在实际应用中具有广泛的应用场景。
以下是几个典型的应用案例:1. 金融领域:回归树分类算法可以用于信用评分模型的构建。
通过分析客户的个人信息、财务状况等特征,可以预测客户的信用等级,从而为银行、保险公司等金融机构提供参考依据。
2. 医疗领域:回归树分类算法可以用于疾病预测。
通过分析患者的病史、体检数据等特征,可以预测患者是否患有某种疾病,从而为医生提供辅助诊断的依据。
3. 市场营销:回归树分类算法可以用于客户细分。
通过分析客户的购买行为、偏好等特征,可以将客户划分为不同的细分市场,从而为企业制定个性化的营销策略。
三、回归树分类算法的优缺点回归树分类算法具有以下几个优点:1. 解释性强:回归树分类算法生成的模型具有较好的可解释性,可以清晰地展示特征的重要性和影响因素。
2. 对异常值不敏感:回归树分类算法对于异常值的存在具有一定的鲁棒性,不会对整个模型产生较大的影响。
3. 可处理混合特征:回归树分类算法可以处理包含连续型和离散型特征的数据集,不需要对特征进行特殊的处理。
然而,回归树分类算法也存在一些缺点:1. 容易过拟合:回归树分类算法在处理复杂的数据集时,容易产生过拟合的问题。
分类回归树(CART)
分类回归树(CART)概要本部分介绍 CART,是⼀种⾮常重要的机器学习算法。
基本原理CART 全称为 Classification And Regression Trees,即分类回归树。
顾名思义,该算法既可以⽤于分类还可以⽤于回归。
克服了 ID3 算法只能处理离散型数据的缺点,CART 可以使⽤⼆元切分来处理连续型变量。
⼆元切分法,即每次把数据集切分成两份,具体地处理⽅法是:如果特征值⼤于给定值就⾛左⼦树,否则就⾛右⼦树。
对 CART 稍作修改就可以处理回归问题。
先前我们使⽤⾹农熵来度量集合的⽆组织程度,如果选⽤其它⽅法来代替⾹农熵,就可以使⽤树构建算法来完成回归。
本部分将构建两种树,第⼀种是回归树,其每个叶节点包含单个值;第⼆种是模型树,其每个叶节点包含⼀个线性⽅程。
回归树要对树据的复杂关系建模,我们已经决定⽤树结构来帮助切分数据,那么如何实现数据的切分呢?怎么才能知道是否已经充分切分呢?这些问题的答案取决于叶节点的建模⽅式。
回归树假设叶节点是常数值,需要度量出数据的⼀致性,在这⾥我们选择使⽤平⽅误差的总值来达到这⼀⽬的。
选择特征的伪代码如下:对每个特征:对每个特征值:将数据切分成两份(⼆元切分)计算切分的误差(平⽅误差)如果当前误差⼩于当前最⼩误差,那么将当前切分设定为最佳切分并更新最⼩误差返回最佳切分的特征和阈值与 ID3 或 C4.5 唯⼀不同的是度量数据的⼀致性不同,前两者分别是信息增益和信息增益率,⽽这个是⽤平⽅误差的总值,有⼀点聚类的感觉。
⽐如这样的数据集:程序创建的树结构就是:{'spInd': 0, 'spVal': 0.48813000000000001, 'left': 1.0180967672413792, 'right': -0.044650285714285719}在分类树中最常⽤的是基尼指数:在分类问题中,假设有K个类,样本点属于第k类的概率为p k,则概率分布的基尼指数定义为Gini(p)=K∑k=1p k(1−p k)=1−K∑k=1p2k基尼系数与熵的特性类似,也是不确定性的⼀种度量。
分类和回归树CART教学课件
CART算法的计算复杂度相对较低,对于大规模数据的处理速度较快 。
缺点
容易过拟合
CART算法倾向于构建完全准 确的决策树,这可能导致在训 练数据上的性能很好,但在测 试数据上的性能较差,即过拟 合。
对异常值敏感
CART算法对异常值比较敏感 ,异常值可能会对树的生成产 生较大影响。
可能产生泛化能力较差的 模型
树的评估
要点一
总结词
树的评估是通过使用测试数据集来评估模型的表现,以避 免过拟合和欠拟合问题。
要点二
详细描述
在CART算法中,树的评估是在训练过程中使用测试数据集 来评估模型的表现。通过比较测试数据集上的预测结果和 真实结果,可以评估模型的准确率、精度、召回率等指标 。此外,还可以使用交叉验证等技术来评估模型的泛化能 力。评估结果可以用于调整模型参数、改进特征选择和剪 枝策略等,以提高模型的表现。
高维特征的处理
随着数据维度的增加,如何有效地处理高维特征 ,避免维度诅咒,是CART算法面临的一个重要 问题。
深度学习与CART算法的融合
探索如何将深度学习的思想与CART算法相结合 ,以实现更强大的特征学习和模型表达能力。
未来可能的应用前景
金融风险评估
利用CART算法构建风险评估模型,帮助金融机构识 别和预防潜在的风险。
树的剪枝
总结词
树的剪枝是为了解决过拟合问题,通过去除 部分分支来简化模型。
详细描述
在CART算法中,树的剪枝是通过去除部分 分支来简化模型的过程。剪枝的目的是提高 模型的泛化能力,减少过拟合的风险。剪枝 可以通过后剪枝和预剪枝两种方式进行。后 剪枝是在生成完整的决策树后进行剪枝,而 预剪枝是在生成决策树的过程中提前停止树 的生长。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1.1. 分类回归树分类回归树(Classification and regression trees,CART)是决策树的一种,它是基于吉尼(Gini)指标(并且是最简化的吉尼指标)的方法。
在OpenCV 下函数icvCreateCARTStageClassifier 实现层强分类器的构建,而它又调用了icvCreateCARTHaarClassifier 、icvInitCARTHaarClassifier 、icvEvalCARTHaarClassifier 实现了弱检测器的分类回归树的初始化、构建、赋值。
以下是简化了的算法描述:其中C 代表当前样本集,当前候选属性集用T 表示。
(1)新建一个根节点root(2)为root 分配类别(有人脸还是没有)(3)如果T 都属于同一类别(都是正样本或者反样本)或者C 中只剩下一个样本则返回root 为叶节点,为其分配属性。
(4)对任何一个T 中属性执行该属性上的划分,计算此划分的分类不纯度 (吉尼不纯度)(5)root 的测试属性是T 中最小GINI 系数的属性(6)划分C 得到C1 C2子集(7)对于节点C1重复(1)-(6)(8)对于节点C2重复(1)-(6)至于CART 的修剪、评估等算法就不给出了。
CART 的修剪的算法是分类错误算法。
如果想深入了解CART 树,则阅读上节给出的参考书目。
1.1.2. 弱分类器方法弱分类器的种类很多,但OpenCV 使用的是效果最好的决策树分类器。
关于分类器的介绍在第一章已经讨论过了,如果要有更深入理解可以看一些数据挖掘的图书后,再看看OpenCV 下的cvhaartraining.cpp 文件。
这里特别提下弱分类器的阈值的寻找方法。
阈值寻找算法定义在icvFindStumpThreshold_##suffix 函数里面,它是通过一个宏被定义的。
至于为什么通过这种方式定义,可以参考文献。
[i]函数icvFindStumpThreshold_##suffix输入参数介绍:wk 是第k 个样本的权重,yk 是第k 个样本是正样本还是反样本,如果是正样本则为+1,反样本则为-1,lerror 、rerror 是要求的最低误差,lerror=rerror=3.402823466e+38F(超大的数值),left 、right 是输出的误差。
threshold 是阈值,found 为是否找到阈值,初始是0。
For i=1:num(对每个排序后的样本)(1)∑==i k k wwl 1,∑+==num i k k w wr 1 (2)k i k k y wwyl *1∑== , k numi k k y w wyr *1∑+==(3)curleft=wyl/wl , curright=wyr/wr(4)如果curlerror+currerror<lerror+rerror则lerror=curlerrorrerror=curerrorthreshold 等于当前样本和前一个样本权重的均值left=curleftright=currightfound=1End返回found的值虽然lerror、rerror初始都是很大的值,但保证了程序一开始就可以进入(4),使它们改为当前的误差值(默认一定会找到阈值),不断循环下,它们就可以取得最小的误差值。
1.1.3.DAB的权重调整算法在OpenCV下函数icvBoostNextWeakClassifierDAB用于DAB的样本权重调整。
它实现了以最佳弱分类器进行一次样本权重的调整,并返回这次调整后的错误分类百分比。
流程如下:(1)初始化err=sumw=0;y向量是实际正反样本,f向量是样本在弱分类器下结果,都是1为真,-1为假。
w向量是样本的权重。
(2)调整部分(a)计算误检率。
对应了图中errm=Ew[1(y!=fm(x))]for i=0 to N-1如果y(i)不等于f(i)(表示未被正确分类),则err=err+w(i);如果相等,err不变;累加样本权重放到sumw中end;err=err/sumw;//计算了错误的比例,0<err<1/2err= - log(err/(1 - err));(b)更新权重for i=0 to N-1如果y(i)不等于f(i),则w(i)=w(i)*exp(err);否则w(i)不变累加新的权重放在sumw中end(c)归一化权重for i=0 to N-1w(i)=w(i)/sumw;end(3)返回err的值1.1.4.GAB的权重调整算法OpenCV下使用icvBoostNextWeakClassifierGAB函数调整GAB方法的权重,这个函数返回的alpha值恒为1,这点可以从输出分类器的算法(错误!未找到引用源。
节)中看到,它c项的。
是没有m(1)初始化sumw=0;(2)调整部分(a)更新权重for i=0 to N-1w(i)=w(i)*exp(-y(i)*f(i));//注意这里的f(i)数值不是-1和+1了。
累加权重放入sumw中end(b)权重归一for i=0 to N-1w(i)=w(i)/sumw;end(3)返回1.01.2. OpenCV下训练代码框架解读前几节使用了OpenCV进行了训练,而前几章人脸检测算法讲解比较分散,现在给出一个整体的算法流程,以弄清楚刚才的训练过程是怎么进行的。
首先要介绍下training_data的结构是CvHaarTrainingData,它是整个程序中最重要的数据。
先令N=posnum + negnum,即正反样本数量typedef struct CvHaarTrainingData{CvSize winsize; /* 图像大小*/int maxnum; /* 样本最大数量*/CvMat sum; /* 竖直积分图像,每个积分图像占据一行,N * (W+1)×(H+1)*/CvMat tilted; /* 旋转45度的积分图像,每个积分图像占据一行,N* (W+1)×(H+1) */CvMat normfactor; /* 一维向量, 1 * N*/CvMat cls; /* 所属类一维向量, 1 *N。
1表示有物体,0表示背景*/CvMat weights; /* 权重一维向量, 1 *N*/CvMat* valcache; /* 特征值*/CvMat* idxcache; /* 特征值标号*/} CvHaarTrainigData;函数cvCreateTreeCascadeClassifier的主体流程:(1)icvLoadTreeCascadeClassifier、icvFindDeepestLeaves、icvPrintTreeCascade读入已经训练好的数据,如果是第一次则不运行。
(2)icvCreateIntHaarFeatures//负责创建所有的Haar特征,并保存。
(3)icvCreateHaarTrainingData//给sum、tilted、normfactor、cls、weight分配内存空间(4)icvInitBackgroundReaders//初始化反样本图片的读入(具体实现又调用icvCreateBackgroundData、icvCreateBackgroundReader)(5)进入总循环//构造多层强分类器(A)再进入次循环循环//构造一层强分类器(a)icvSetLeafNode//从root找到路径到leaf(b)icvGetHaarTrainingDataFromVec//从.vec文件读入训练数据,经过计算得到的数据放到training_data下的sum、tilted、normfactor中(c)icvGetHaarTrainingDataFromBG//读入背景图片数据(d)判断是否达到required_leaf_fa_rate和nstages的要求,达到则程序结束。
否则继续(e)icvSetNumSamples//设置training_data中的行列都为总样本个数(f)根据equalweights初始化正反样本权重.如果它是真,则都设为1/num,否则posweight=1/2/poscount;negweight=1/2/negcount;(g)icvSetWeightsAndClasses//根据刚才的数据对training_data结构中的向量指针weights,cls分别赋值。
真样本在前反样本在后。
(h)icvPrecalculate//计算numprecalculated个haar特征(具体又通过icvGetTrainingDataCallback计算),保存到training_data->valcache下(i)icvCreateTreeCascadeNode//初始化,分配空间(j)icvCreateCARTStageClassifier//建立一层强分类器(k)icvNumSplits//返回这次强分类器一共使用的特征数量(l)开始聚类(clustering)操作,调用cvKMeans2函数等,这里最大不超过3类。
从2个类别开始进行聚类,每次聚类重新读入数据构造层CART树,找到最佳的类别数。
(B)次循环结束(6)开始寻找哪些节点应该被分裂,找到后添加新的节点。
并依次保存已经建好的节点,直到这棵树完全被存储。
(7)满足误差率或者层数则结束总循环,否则跳到(5)。
对照上面的步骤就可以很好的解释刚才训练过程。
需要注意的是,每一层训练时,正反样本数据都要重新载入,这个原因谈到过,是因为内存不够。
所以它每次处理后失去了原始的样本数据。
至于为什么最后程序无法停止,目前没有人给出解释。
1.3.对xml文件的解读在OpenCV进行长时间的训练后,我们能够得到一个.xml文件,这种文件是专门用于存储数据的,并且是跨平台的。
我们只是研究物体检测产生的.xml文件,只对它的结果进行解读,如果想深入了解.xml的编程可以参考相关书籍。
下面列出haarcascade_frontalface_alt2.xml文件中的一些内容:(/**/中文字是注释)<size>20 20</size>/*这行告诉我们这个分类器是使用20*20的图像训练出来的,因此他可以检测任何大于20*20的人脸图像。
*/<!-- stage 0-->/*代表第0层强分类器*/-<trees><!-- tree 0-->/*代表此层分类器下第0棵二叉树*/<!-- root node-->/*根节点*/-<feature>-<rects>/*矩形*/<_>2 7 16 4 -1.</_>/*前面四个数据表示矩形左上角坐标和矩形的长、宽,最后一个表示比重*/<_>2 9 16 2 2.</_>/*这个矩形比重是正的,可以画图发现是Haar_y2特征*/</rects><tilted>0</tilted>/*这个标志是不是旋转的特征,0表示不是*/</feature><threshold>4.3272329494357109e-003</threshold>/*表示这棵树的阈值*/<left_val>0.0383819006383419</left_val>/*小于阈值去左树枝*/<right_node>1</right_node>/*大于等于阈值取右树枝,这个节点有分裂了,继续往下找*/之后就可以找到这个节点,结构和刚才分析的是一样的。