SparkMLlib回归算法之决策树

(一),决策树概念

1,决策树算法(ID3,C4.5 ,CART)之间的比较:

  1,ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准。信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息。

  2 ID3算法只能对描述属性为离散型属性的数据集构造决策树,其余两种算法对离散和连续都可以处理

2,C4.5算法实例介绍(参考网址:http://m.blog.csdn.net/article/details?id=44726921)

  

c4.5后剪枝策略:以悲观剪枝为主参考网址:http://www.cnblogs.com/zhangchaoyang/articles/2842490.html

(二) SparkMLlib决策树回归的应用

1,数据集来源及描述:参考http://www.cnblogs.com/ksWorld/p/6891664.html

2,代码实现:

  2.1 构建输入数据格式:

val file_bike = "hour_nohead.csv"val file_tree=sc.textFile(file_bike).map(_.split(",")).map{x =>val feature=x.slice(2,x.length-3).map(_.toDouble)val label=x(x.length-1).toDoubleLabeledPoint(label,Vectors.dense(feature))}println(file_tree.first())val categoricalFeaturesInfo = Map[Int,Int]()val model_DT=DecisionTree.trainRegressor(file_tree,categoricalFeaturesInfo,"variance",5,32)

  2.2 模型评判标准(mse,mae,rmsle)

val predict_vs_train = file_tree.map {point => (model_DT.predict(point.features),point.label)/* point => (math.exp(model_DT.predict(point.features)), math.exp(point.label))*/}predict_vs_train.take(5).foreach(println(_))/*MSE是均方误差*/val mse = predict_vs_train.map(x => math.pow(x._1 - x._2, 2)).mean()/* 平均绝对误差(MAE)*/val mae = predict_vs_train.map(x => math.abs(x._1 - x._2)).mean()/*均方根对数误差(RMSLE)*/val rmsle = math.sqrt(predict_vs_train.map(x => math.pow(math.log(x._1 + 1) - math.log(x._2 + 1), 2)).mean())println(s"mse is $mse and mae is $mae and rmsle is $rmsle")
/*
mse is 11611.485999495755 and mae is 71.15018786490428 and rmsle is 0.6251152586960916
*/

(三) 改进模型性能和参数调优

1,改变目标量 (对目标值求根号),修改下面语句

LabeledPoint(math.log(label),Vectors.dense(feature))
和val predict_vs_train = file_tree.map {/*point => (model_DT.predict(point.features),point.label)*/point => (math.exp(model_DT.predict(point.features)), math.exp(point.label))}
/*结果
mse is 14781.575988339053 and mae is 76.41310991122032 and rmsle is 0.6405996100717035
*/

决策树在变换后的性能有所下降

2,模型参数调优

  1,构建训练集和测试集

 val file_tree=sc.textFile(file_bike).map(_.split(",")).map{x =>val feature=x.slice(2,x.length-3).map(_.toDouble)val label=x(x.length-1).toDoubleLabeledPoint(label,Vectors.dense(feature))/*LabeledPoint(math.log(label),Vectors.dense(feature))*/}val tree_orgin=file_tree.randomSplit(Array(0.8,0.2),11L)val tree_train=tree_orgin(0)val tree_test=tree_orgin(1)

  2,调节树的深度参数

val categoricalFeaturesInfo = Map[Int,Int]()val model_DT=DecisionTree.trainRegressor(file_tree,categoricalFeaturesInfo,"variance",5,32)/*调节树深度次数*/val Deep_Results = Seq(1, 2, 3, 4, 5, 10, 20).map { param =>val model = DecisionTree.trainRegressor(tree_train, categoricalFeaturesInfo,"variance",param,32)val scoreAndLabels = tree_test.map { point =>(model.predict(point.features), point.label)}val rmsle = math.sqrt(scoreAndLabels.map(x => math.pow(math.log(x._1) - math.log(x._2), 2)).mean)(s"$param lambda", rmsle)}
/*深度的结果输出*/Deep_Results.foreach { case (param, rmsl) => println(f"$param, rmsle = ${rmsl}")}
/*
1 lambda, rmsle = 1.0763369409492645
2 lambda, rmsle = 0.9735820606349874
3 lambda, rmsle = 0.8786984993014815
4 lambda, rmsle = 0.8052113493915528
5 lambda, rmsle = 0.7014036913077335
10 lambda, rmsle = 0.44747906135994925
20 lambda, rmsle = 0.4769214752638845
*/

  深度较大的决策树出现过拟合,从结果来看这个数据集最优的树深度大概在10左右

  3,调节划分数

/*调节划分数*/val ClassNum_Results = Seq(2, 4, 8, 16, 32, 64, 100).map { param =>val model = DecisionTree.trainRegressor(tree_train, categoricalFeaturesInfo,"variance",10,param)val scoreAndLabels = tree_test.map { point =>(model.predict(point.features), point.label)}val rmsle = math.sqrt(scoreAndLabels.map(x => math.pow(math.log(x._1) - math.log(x._2), 2)).mean)(s"$param lambda", rmsle)}/*划分数的结果输出*/ClassNum_Results.foreach { case (param, rmsl) => println(f"$param, rmsle = ${rmsl}")}
/*
2 lambda, rmsle = 1.2995002615220668
4 lambda, rmsle = 0.7682777577495858
8 lambda, rmsle = 0.6615110909041817
16 lambda, rmsle = 0.4981237727958235
32 lambda, rmsle = 0.44747906135994925
64 lambda, rmsle = 0.4487531073836407
100 lambda, rmsle = 0.4487531073836407
*/

  更多的划分数会使模型变复杂,并且有助于提升特征维度较大的模型性能。划分数到一定程度之后,对性能的提升帮助不大。实际上,由于过拟合的原因会导致测试集的性能变差。可见分类数应在32左右。。

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

SparkMLlib回归算法之决策树相关推荐

  1. SparkMLlib分类算法之决策树学习

    SparkMLlib分类算法之决策树学习 (一) 决策树的基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风 ...

  2. 【数据挖掘算法分享】机器学习平台——回归算法之随机森林

    随机森林回归算法是决策树回归的组合算法,将许多回归决策树组合到一起,以降低过拟合的风险.随机森林可以处理名词型特征,不需要进行特征缩放处理.随机森林并行训练许多决策树模型,对每个决策树的预测结果进行合 ...

  3. 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现

    ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...

  4. r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经

    目录 决策树 简述决策树原理? 为什么要对决策树进行减枝?如何进行减枝? 简述决策树的生成策略 PCA 简述主成分分析PCA工作原理,以及PCA的优缺点? PCA中有第一主成分.第二主成分,它们分别是 ...

  5. 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)

    文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...

  6. python 决策树回归参数_使用 Python 和 scikit-learn 学习回归算法

    本教程已纳入面向开发者的机器学习这一学习路径. 简介 在本教程中,我们将介绍解决基于回归的机器学习问题的基础知识,并对当前最流行的一些算法进行比较研究. 设置 注册或登录. 从 Try IBM Wat ...

  7. Machine Learning | (10) 回归算法-岭回归

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  8. Machine Learning | (9) 回归算法-线性回归

    Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...

  9. 第七课.Logistic回归算法

    Logistic 回归,又名逻辑回归,它从线性回归发展而来,是一种广义的线性回归模型:该模型预测输出的是样本类别的条件概率分布,因而可以取概率值最大的类别作为分类结果,实质上是一个分类模型. 目录 算 ...

最新文章

  1. 你还在使用 try-catch-finally 关闭资源?
  2. 浅述Oracle分布式事务概念
  3. 某pl/sql培训练习题
  4. 计算机应用节能环保,计算机应用的节能环保问题研究
  5. windows10开启Webdav文件服务
  6. 夜弦网页游戏专用浏览器(支持最小化隐藏后台多开挂机)
  7. mybatis常用标签
  8. ch341a编程器写操作超时失败
  9. 2021-03-13 大数据课程笔记 day52
  10. 【微信小程序开发】缓存Storage的存入与获取
  11. c语言循环卖n西瓜 几天卖完,C++循环结构23道题含答案.docx
  12. 2022-2028全球COB摄影灯行业调研及趋势分析报告
  13. 微店新品!微店首款《疯狂野蛮人》横版动作游戏来啦!
  14. 全极化SAR图像freeman分解
  15. 关于MAX3232ESE+T的过热问题
  16. 项目管理经理人如何提高向上管理的指数
  17. 谷歌adwords教程_如何将Google Analytics(分析)与AdWords关联
  18. Ogre 天龙八部 GridInfo文件格式说明(正确版)
  19. java计算机毕业设计三坑购物平台演示录像2020源代码+数据库+系统+lw文档
  20. 【移动终端应用开发】实验1:SharedPreferences的应用

热门文章

  1. Gazebo仿真平台
  2. caffe学习路的起点
  3. 如何掌握所有的程序设计语言?
  4. 阿里腾讯前端一面小结
  5. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
  6. [转]汇编语言的准备知识--给初次接触汇编者 3
  7. the future of real-time rendering hardware
  8. 使用MEF方便的扩展
  9. Javascript 构造endwith方法
  10. 全球金融中心最新排位:深圳重回前十,大连杭州飙升