机器学习

机器学习之决策树
本周我主要学习了机器学习中的决策树算法,下面是我的一些心得,有错误希望大家能及时指正。

机器学习简介
机器学习 (Machine Learning) 是近 20 多年兴起的一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。简而言之,机器学习是通过学习老知识(训练样本),得出自己的认知(模型),去预测未知的结果。

学习方式
监督学习
从给定的训练数据集中学习出一个函数,当新的数据到来时,可以根据此函数预测结果。训练数据集中的目标由人标注的。常见的算法有回归分析和统计分类
非监督学习
与监督式学习相比,训练集没有人为标注的结果,常见的算法有聚类
半监督学习
训练集部分被标识,部分没有被标识。常见的算法有SVM
强化学习
输入数据作为模型的反馈,模型对此作出调整。常见的算法有时间差学习

机器学习算法分类
判别模型:感知机,k近邻法,决策树,逻辑斯谛回归与最大熵模型,支持向量机,提升方法,条件随机场
生成模型:朴素贝叶斯法,隐马尔可夫模型

决策树
学习步骤:
①特征选择――信息增益,信息增益比
②决策树的生成――ID3算法(用信息增益最大的特征作为结点的特征,可能出现过拟合),C4.5算法(用信息增益比来选择特征)
③决策树的修剪

决策树算法以树状结构表示数据分类的结果。
叶子节点:代表分类后所获得的分类标记。
非叶子节点(决策点):特征属性,及其对应输出,按照输出选择分支
决策过程:从根节点出发,根据数据的各个属性,计算结果,选择对应的输出分支,直到到达叶子节点,得到结果
构建决策树

分裂属性的选择算法
信息增益(Information gain)
信息增益比(Information gain
ratio)、基尼指数(Gini index)

信息增益(Information Gain)
表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
典型算法:ID3
数据集D中,有m个类别,pipi表示D中属于类别i的概率,此数据集的信息熵定义为:
Info(D)=−∑_i=1mp_ilog_2(p_i)
Info(D)=−∑_i=1mp_ilog⁡_2(p_i)
以属性R作为分裂属性,R有k个不同的取值,将数据D划分成k组,按R分裂后的数据集的信息熵为:
Info_R(D)=∑_j=1k|D_j||D|×Info(D_j)
Info_R(D)=∑_j=1k|D_j||D|×Info(D_j)
信息增益,即为划分前后,信息熵之差:
Gain®=Info(D)−InfoR(D)
Gain®=Info(D)−InfoR(D)
在每层分裂时,选择使得Gain®最大的属性作为分裂属性
缺点:此公式偏向数据量多的属性,如果样本分布不均,则会导致过拟合。假如上述例子中包括人名属性,每个人名均不同,显然以此属性作为划分,信息增益最高,但是,很明显,以此属性作为划分毫无意义
信息增益比(Information gain ratio)
针对上述方法问题,此方法引入分裂信息
SplitInfo_R(D)=−∑_j=1k|D_j|D×log_2(|D_j|D))
SplitInfo_R(D)=−∑_j=1k|D_j|D×log⁡_2(|D_j|D))

典型算法:C4.5
信息增益比率定义为:
GainRatio®=Gain®SplitInfo_R(D)
GainRatio®=Gain®SplitInfo_R(D)
缺点:SplitInfoR(D)SplitInfoR(D)可能取值为0,此时无意义;当期趋于0时,GainRatio也不可信,改进措施是在分母加一个平滑,这里加所有分裂信息的平均值GainRatio®=Gain®SplitInfo(D)¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯+SplitInfoR(D)GainRatio®=Gain®SplitInfo(D)¯+SplitInfoR(D)
基尼指数(Gini index)
另外一种数据不纯度的度量方法,定义为:
Gini(D)=1−∑_i=1mp_i2
Gini(D)=1−∑_i=1mp_i2

其中,m为数据集D中类别的个数,pipi表示D中属于类别i的概率,如果所有记录都属于同一个类中,则P1=1,Gini(D)=0。
典型算法:CART
以属性R作为分裂属性,R有k个不同的取值,将数据D划分成k组,按R分裂后的数据集的基尼指数为:
Gini_R(D)=∑_i=1k|D_i||D|Gini(D_i)
Gini_R(D)=∑_i=1k|D_i||D|Gini(D_i)
计算划分前后基尼指数之差
△Gini®=Gini(D)−Gini_R(D)
△Gini®=Gini(D)−Gini_R(D)
计算Gini®增量最大的属性作为最佳分裂属性。
spark中实现

具体代码参考spark源码包下的org.apache.spark.examples.mllib.DecisionTreeClassificationExample,DecisionTree.trainClassifier的实现步骤,核心代码在RandomForest.run()方法

根据输入数据,构建RDD[LabeledPoint],保存label和features
根据数据,构建metaData,包括feature个数、样本数据条数、分类个数等
val metadata =
DecisionTreeMetadata.buildMetadata(retaggedInput, strategy, numTrees, featureSubsetStrategy)
计算每个feature的可能划分点split1、split2。。。split(n-1)划分成n个bin
val splits = findSplits(retaggedInput, metadata, seed)
连续值:取样数据,根据不同值个数和步长进行划分
离散:
unorder:特征种类为binsNum(分类个数不大,且为多分类)
order:回归、二分类、多分类且数量很大,都使用二分类
根据feature的split,计算每条数据在每个feature下所在的bin,生成新的RDD[TreePoint(Label, featuresBin[])]
val treeInput = TreePoint.convertToTreeRDD(retaggedInput, splits, metadata)
bagging取样(示例中,不需要取样,因为只生成一个tree)
val baggedInput = BaggedPoint
.convertToBaggedRDD(treeInput, strategy.subsamplingRate, numTrees, withReplacement, seed)
.persist(StorageLevel.MEMORY_AND_DISK)
新建树根root,放到queue中,循环直到队列为空
选择多个训练树节点,同时进行训练,根据指定的maxMemoryUsage进行个数计算
val (nodesForGroup, treeToNodeToIndexInfo) =
RandomForest.selectNodesToSplit(nodeQueue, maxMemoryUsage, metadata, rng)
按照Gini系数,找到当前树节点中,最佳的feature分裂点和最佳bin分割点
RandomForest.findBestSplits(baggedInput, metadata, topNodes, nodesForGroup,
treeToNodeToIndexInfo, splits, nodeQueue, timer, nodeIdCache)
遍历数据,mapPartition,每个树节点LearnNode维护一个DTStatsAggregator(存放,每个feature的每个bin的数据个数)
进行DTStatsAggregator的聚合merge
按照Gini系数,找到最佳的feature下的最佳split
参数设置

可以通过设置一些参数,调整算法或调优,详细参考spark官网介绍

算法设置
algo:决策树类型,分类或回归,Classification or Regression
numClasses: 分类问题设置分类个数
categoricalFeaturesInfo:指定哪些feature是离散值,并指定离散值的个数
停止条件设置
maxDepth:树最大深度
minInstancesPerNode:每个树节点最小的训练数据个数,如果小于此值,则不进行分裂
minInfoGain:最小信息增益,决定当前树节点是否进行分裂
调优参数
maxBins:用于连续特征值的分散化,最多划分类个数
maxMemoryInMB:增大,可以提高同时训练的树节点的个数,从而减少训练时间,但是,每次训练会增大数据的传输量
subsamplingRate:训练森林时使用,每次采样的比例
impurity:纯度度量函数,必须和算法algo相匹配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值