Spark Mlib- Decision Tree

Spark Mlib- Decision Tree
Q:决策树是什么?
A:决策树是模拟人类决策过程,将判断一件事情所要做的一系列决策的各种可能的集合,以数的形式展现出来,的一中树形图。
Q:决策树的结构是怎样的?
A:决策树与普通树一样,由节点和边组成。树中每一个节点都是一个属性(特征),或者说是对特征的判断。根据一个节点的判断结果,决策(预测)流程走向不同的子节点,或者直接到达叶节点,即决策(预测)结束,得到结果。
Q:决策树是怎么训练出来的?
A:典型的决策树的训练过程如下,以根据色泽、根蒂、敲声预测一个西瓜是否好瓜为例——

  1. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    1、输入一个数据集D2、生成一个节点node3、如果数据集中的样本全部属于同一类,比如西瓜样本全部是“好瓜”,那么node就是叶子节点(好瓜)4、如果样本中的数据集不属于同一类,比如西瓜中既有好瓜也有坏瓜,那就选择一个属性,把西瓜根据选好的属性分类。比如按照“纹理”属性,把西瓜分为清晰、模糊、稍糊三类。
  2. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    5、把第4步得到的几个数据子集作为输入数据,分别执行上面的第1到5步、直到不再执行第4步为止(也就是叶子节点全部构建完成,算法结束)。
    Q:整个决策树的训练算法很简洁,但是第4步的“选择一个属性,把西瓜根据选好的属性分类”,怎样来选择合适的属性呢?
    A:假设我们现在只有两种属性选择,一种是“色泽”、另一种种是“触感”。选择“色泽”,我们可以把西瓜分成三类——“浅白”全是坏瓜;“墨绿”全是好瓜;“青绿”85%是好瓜,15%是坏瓜。选择“触感”,我们可以把西瓜分为两类——“硬滑”一半是好瓜,一半是坏瓜;“软粘”40%是好瓜、60%是坏瓜。
    稍一思考,我们自然会选“色泽”作为本次的属性。因为“色泽”可以一下把很多好瓜和坏瓜区分开来,也就是说我们知道了一个西瓜的色泽后有很大几率正确判断它是好瓜还是坏瓜。而目前来说,知道“触感”却对我们的判断没什么帮助。因此,我们选择“能给我们带来更多信息”的属性,或者说能够“减少混淆程度”的属性。
    假设Pk是指当前集合中第k类样本占的比例。比如10个西瓜中纹理清晰、模糊、稍糊的各有3,3,4个,那么p1=3/10,p2=3/10,p3=4/10。于是根据信息的定义,我们有信息熵
  3. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    衡量那一个属性“能给我们带来更多信息”,我们用“信息增益”这个指标:
  4. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    信息增益越大,越能带来信息。因此每一次在上述算法第4步选择属性作为节点时,我们对待选属性都做一次信息增益的计算,选择信息增益最大的属性。
    Q:有哪些对上述决策树算法改进的方案呢?
    A:有两种思路——1、改进算法第4步中选择属性用的指标,比如用“增益率”或者“基尼系数”来代替“信息增益”。2、用“剪枝处理”,也就是去掉一些无用的分枝来降低“过拟合”的风险。
    Q:什么是增益率?什么是基尼系数?
    A:信息增益对于选项多的属性有偏好。如果我们把训练样本中每个西瓜编号,然后把编号也作为待选择属性,那么编号肯定能带来最多的信息,最大程度降低混淆程度,所以编号这个属性肯定会被选中。但是这然并卵,因为这样训练出来的算法对于新的样本根本不起作用。所以我们不会选择编号作为属性。类似的,如果有些属性的可选项特别多,比如色泽现在有浅白、白、青绿、绿、墨绿五个可选项,那么色泽被选中的几率比其他属性要大。所以可以考虑用增益率代替信息增益:
  5. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    基尼系数则是另一项可以考虑的指标:
  6. {failImgCache = [];}if(failImgCache.indexOf(src) == -1 && src.trim().length){failImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-error').removeClass('md-img-loaded'); " onload="var src = window.removeLastModifyQuery(this.getAttribute('src'));if(!src.trim()) return;if(loadedImgCache.indexOf(src) == -1 && src.trim().length){loadedImgCache.push(src);}$(this).closest('.md-image').addClass('md-img-loaded').removeClass('md-img-error');" style="box-sizing: border-box; border-width: 0px 4px 0px 2px; border-right-style: solid; border-left-style: solid; border-right-color: transparent; border-left-color: transparent; vertical-align: middle; max-width: 100%; cursor: default;">
    基尼系数表示从一堆样本中随机抽取两个样本,这 两个样本不同类的概率,也就刚是一个是好瓜一个是坏瓜的概率。这样,基尼系数越低,越意味着样本集中某一类比另一类样本多,也就是说,混淆程度越低。若选择某个属性后各个划分子集的基尼系数最低,那么就选择这个属性。
    Q:剪枝处理的过程是怎样进行的?
    A:剪枝分为预剪枝和后剪枝。预剪枝过程就是杂生成决策树时,用一些新的样本去测试刚刚训练好的节点,如果这个节点的存在并不能让决策树的泛化性能提高,也就是说分类精度或者其他衡量指标提高了,就把这个刚训练出来的节点舍弃。后剪枝过程是用一些新的样本来测试这课刚刚训练出来的决策树,从下往上开始测试,如果某个节点被换成叶节点后整一棵决策树的泛化性能提高了,,也就是说分类精度或者其他衡量指标提高了那么就直接替换掉。
    实现

import org.apache.spark.ml.Pipelineimport org.apache.spark.ml.classification.DecisionTreeClassificationModelimport org.apache.spark.ml.classification.DecisionTreeClassifierimport org.apache.spark.ml.evaluation.MulticlassClassificationEvaluatorimport org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer}​// Load the data stored in LIBSVM format as a DataFrame.val data = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")​// Index labels, adding metadata to the label column.// Fit on whole dataset to include all labels in index.val labelIndexer = new StringIndexer() .setInputCol("label") .setOutputCol("indexedLabel") .fit(data)// Automatically identify categorical features, and index them.val featureIndexer = new VectorIndexer() .setInputCol("features") .setOutputCol("indexedFeatures") .setMaxCategories(4) // features with > 4 distinct values are treated as continuous. .fit(data)​// Split the data into training and test sets (30% held out for testing).val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3))​// Train a DecisionTree model.val dt = new DecisionTreeClassifier() .setLabelCol("indexedLabel") .setFeaturesCol("indexedFeatures")​// Convert indexed labels back to original labels.val labelConverter = new IndexToString() .setInputCol("prediction") .setOutputCol("predictedLabel") .setLabels(labelIndexer.labels)​// Chain indexers and tree in a Pipeline.val pipeline = new Pipeline() .setStages(Array(labelIndexer, featureIndexer, dt, labelConverter))​// Train model. This also runs the indexers.val model = pipeline.fit(trainingData)​// Make predictions.val predictions = model.transform(testData)​// Select example rows to display.predictions.select("predictedLabel", "label", "features").show(5)​// Select (prediction, true label) and compute test error.val evaluator = new MulticlassClassificationEvaluator() .setLabelCol("indexedLabel") .setPredictionCol("prediction") .setMetricName("accuracy")val accuracy = evaluator.evaluate(predictions)println("Test Error = " + (1.0 - accuracy))​val treeModel = model.stages(2).asInstanceOf[DecisionTreeClassificationModel]println("Learned classification tree model:\n" + treeModel.toDebugString)

Q文:http://www.jianshu.com/p/d925a064a13d

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 前段时间使用了gulp+browser-sync才发现这个东西真的很好用。准备工作:(1)、安装nodejs。gu...
    Picidae阅读 273评论 0 0
  • Spark Mlib-BPQ:什么是人工神经网络?A:人工神经网络是科学及模拟人类大脑的神经神经网络建立的数学模型...
    raincoffee阅读 922评论 0 0
  • 什么是注解(Annotation):Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和...
    九尾喵的薛定谔阅读 3,073评论 0 2
  • SMVVM with RxSwift原文链接:https://medium.com/smoke-swift-eve...
    大灰很阅读 218评论 0 0
  • 16 婚后的柳平安与天云之间的关系并未向前一步。一来是天云觉得委屈,她可不想在情动之时听到平安叫错了名字。 该死的...
    有梦想的狗阅读 220评论 1 3