SparkMLlib分类算法之决策树学习

(一) 决策树的基本概念

    决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。通过信息增益来筛选出属性的优先性。

缺点:参考网址:http://www.ppvke.com/Blog/archives/25042

1)对连续性的字段比较难预测。
2)对有时间顺序的数据,需要很多预处理的工作。
3)当类别太多时,错误可能就会增加的比较快。
4)一般的算法分类的时候,只是根据一个字段来分类。
(二) SparkMLlib对决策树应用
1,数据集的准备:参考:http://www.cnblogs.com/ksWorld/p/6882398.html
2,数据预处理及获取训练集和测试集
val orig_file=sc.textFile("train_nohead.tsv")//println(orig_file.first())val data_file=orig_file.map(_.split("\t")).map{r =>val trimmed =r.map(_.replace("\"",""))val lable=trimmed(r.length-1).toDoubleval feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0else d.toDouble)LabeledPoint(lable,Vectors.dense(feature))}/*特征标准化优化,似乎对决策数没啥影响*/val vectors=data_file.map(x =>x.features)val rows=new RowMatrix(vectors)println(rows.computeColumnSummaryStatistics().variance)//每列的方差val scaler=new StandardScaler(withMean=true,withStd=true).fit(vectors)//标准化val scaled_data=data_file.map(point => LabeledPoint(point.label,scaler.transform(point.features))).randomSplit(Array(0.7,0.3),11L)//固定seed为11L,确保每次每次实验能得到相同的结果val data_train=scaled_data(0)val data_test=scaled_data(1)

3,构建模型及模型评价

/*训练决策树模型*/val model_DT=DecisionTree.train(data_train,Algo.Classification,Entropy,maxTreeDepth)/*决策树的精确度*/val predectionAndLabeledDT=data_test.map { point =>val predectLabeled = if (model_DT.predict(point.features) > 0.5) 1.0 else 0.0(predectLabeled,point.label)}val metricsDT=new MulticlassMetrics(predectionAndLabeledDT)println(metricsDT.accuracy)//0.6273062730627307
/*决策树的PR曲线和AOC曲线*/val dtMetrics = Seq(model_DT).map{ model =>val scoreAndLabels = data_test.map { point =>val score = model.predict(point.features)(if (score > 0.5) 1.0 else 0.0, point.label)}val metrics = new BinaryClassificationMetrics(scoreAndLabels)(model.getClass.getSimpleName, metrics.areaUnderPR, metrics.areaUnderROC)}val allMetrics = dtMetricsallMetrics.foreach{ case (m, pr, roc) =>println(f"$m, Area under PR: ${pr * 100.0}%2.4f%%, Area under ROC: ${roc * 100.0}%2.4f%%")}
/*
DecisionTreeModel, Area under PR: 74.2335%, Area under ROC: 62.4326%
*/

4,模型参数调优(可以调解长度和纯度两方面考虑)

4.1 构建调参函数

/*调参函数*/def trainDTWithParams(input: RDD[LabeledPoint], maxDepth: Int,impurity: Impurity) = {DecisionTree.train(input, Algo.Classification, impurity, maxDepth)}

4.2  调解树的深度评估函数  (提高树的深度可以得到更精确的模型(这和预期一致,因为模型在更大的树深度下会变得更加复杂)。然而树的深度越大,模型对训练数据过拟合程度越严重)

 /*改变深度*/val dtResultsEntropy = Seq(1, 2, 3, 4, 5, 10, 20).map { param =>val model = trainDTWithParams(data_train, param, Entropy)val scoreAndLabels = data_test.map { point =>val score = model.predict(point.features)(if (score > 0.5) 1.0 else 0.0, point.label)}val metrics = new BinaryClassificationMetrics(scoreAndLabels)(s"$param tree depth", metrics.areaUnderROC)}dtResultsEntropy.foreach { case (param, auc) => println(f"$param, " +f"AUC = ${auc * 100}%2.2f%%") }
/*
1 tree depth, AUC = 58.57%
2 tree depth, AUC = 60.69%
3 tree depth, AUC = 61.40%
4 tree depth, AUC = 61.30%
5 tree depth, AUC = 62.43%
10 tree depth, AUC = 62.26%
20 tree depth, AUC = 60.59%
*/

2,调解纯度参数 (差异不是很明显。。)

 /*改变纯度*/val dtResultsEntropy = Seq(Gini,Entropy).map { param =>val model = trainDTWithParams(data_train, 5, param)val scoreAndLabels = data_test.map { point =>val score = model.predict(point.features)(if (score > 0.5) 1.0 else 0.0, point.label)}val metrics = new BinaryClassificationMetrics(scoreAndLabels)(s"$param tree depth", metrics.areaUnderROC)}dtResultsEntropy.foreach { case (param, auc) => println(f"$param, " +f"AUC = ${auc * 100}%2.2f%%") }
/*
org.apache.spark.mllib.tree.impurity.Gini$@32d8e58d tree depth, AUC = 62.37%
org.apache.spark.mllib.tree.impurity.Entropy$@1ddba7a0 tree depth, AUC = 62.43%
*/

(三) 交叉验证

1,数据集分类

创建三个数据集:训练集

评估集(类似上述测试集用于模型参数的调优,比如 lambda 和步长)

测试集(不用于模型的训练和参数调优,只用于估计模型在新数据中性能)

2,交叉验证的常用方法

一个流行的方法是 K- 折叠交叉验证,其中数据集被分成 K 个不重叠的部分。用数据中的 K-1 份训练模型,剩下一部分测试模型。而只分训练集和测试集可以看做是 2- 折叠交叉验证。

还有“留一交叉验证”和“随机采样”。更多资料详见 http://en.wikipedia.org/wiki/Cross-validation_(statistics) 。

转载于:https://www.cnblogs.com/ksWorld/p/6884313.html

SparkMLlib分类算法之决策树学习相关推荐

  1. cart算法_决策树学习笔记(三):CART算法,决策树总结

    点击上方"Python数据科学",选择"星标公众号" 关键时刻,第一时间送达! 作者:xiaoyu 介绍:一个半路转行的数据挖掘工程师 推荐导读:本篇为树模型系 ...

  2. 算法杂货铺——分类算法之决策树(Decision tree)

    算法杂货铺--分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 88978 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别 ...

  3. SparkMLlib回归算法之决策树

    SparkMLlib回归算法之决策树 (一),决策树概念 1,决策树算法(ID3,C4.5 ,CART)之间的比较: 1,ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准.信 ...

  4. 分类算法之决策树介绍

    实习了一段时间,接触了一些数据挖掘.机器学习的算法,先记录下来方便以后的复习回顾: 一:决策树概念 决策树可以看做一个树状预测模型,它是由节点和有向边组成的层次结构.树中包含3中节点:根节点.内部节点 ...

  5. Netflix工程总监眼中的分类算法:深度学习优先级最低

    原文:http://blog.jobbole.com/87148/ 编者按]针对Quora上的一个老问题:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain近日给出新 ...

  6. R语言分类算法之集成学习(Bootstrap Aggregating)

    1.集成学习(Bootstrap Aggregating)原理分析: Bagging是Bootstrap Aggregating的缩写,简单来说,就是通过使用boostrap抽样得到若干不同的训练集, ...

  7. 决策树分类算法(1) - 决策树简介及ID3/CS4.5算法

    1. 引言 在现实生活中,我们会遇到各种选择,不论是相亲,还是挑选水果,都是基于以往的经验来做判断.如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是我们今天要讲的决策树. 2 ...

  8. 《数据分析实战》总结二之分类算法:决策树,朴素贝叶斯,SVM,KNN,Adaboost

    1 决策树 1.1 工作原理 把以前的经验总结出来,最后得到结果 比如打篮球,一般会根据"天气"."温度"."湿度"."刮风&qu ...

  9. 算法杂货铺——分类算法之决策树(Decision tree) - T2噬菌体

    3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算 ...

最新文章

  1. 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步
  2. 学了近一个月的java web 感想
  3. JavaScript学习(四十五)—练习题
  4. 从功能测试到接口测试,原来的技能可以通用
  5. android so导致启动慢,谈谈Android NDK中动态链接库(.so文件)的优化
  6. 具体数学-第2课(成套方法求解递归式)
  7. Maven如何手动添加jar包到本地Maven仓库
  8. 通过sql脚本可以从数据库中查到数据,但是通过jdbc却获取不到
  9. 记事本java代码_Java记事本源代码(完整).doc
  10. 数据结构——二叉链表创建二叉树(C语言版)
  11. 程序员的数学基础课:编程中的数学思维
  12. 全球三大计算机病毒爆发事件,全球爆发勒索病毒 十大恐怖电脑病毒排行榜(3)...
  13. linux安装硬盘超过2t,linux 硬盘超过2T问题
  14. phalcon 自动加载_Phalcon自动加载(PHP自动加载),phalcon加载php_PHP教程
  15. OSChina 周日乱弹 ——颜值和代码水平是正比
  16. 邓应海:下周黄金走势分析,警惕直接跳高
  17. 单片机双字节数乘法运算实验_单片机入门——单片机的基本构成及工作原理(1)...
  18. SNIP的升级版SNIPER(效果比Mosaic更佳)
  19. fio模拟mysql写入速度_fio 测试工具
  20. Pytorch深度学习笔记(四)梯度向下算法

热门文章

  1. uniapp 乘法结果保留了很多小数_苏教版五年级数学上册5.9循环小数和商的近似值微课视频 | 练习...
  2. java 连接eureka_在同一应用程序中的配置服务器和eureka服务器:尝试连接到localhost:8761...
  3. rmi 反序列化漏洞_写一个rmi反序列化工具
  4. React Router V6 新特性
  5. docker php镜像推荐,Docker 常用镜像整理
  6. Vue组件自定义事件
  7. RPG 学习 一 基本
  8. 20191013:快速排序1.1
  9. android学生管理实例,学生管理系统-基于SQLite数据库的Android应用
  10. java 鼠标动眼睛动_js动画_看着鼠标移动的眼球_眼睛_跟着随鼠标移动