SparkMLlib回归算法之决策树
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回归算法之决策树相关推荐
- SparkMLlib分类算法之决策树学习
SparkMLlib分类算法之决策树学习 (一) 决策树的基本概念 决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风 ...
- 【数据挖掘算法分享】机器学习平台——回归算法之随机森林
随机森林回归算法是决策树回归的组合算法,将许多回归决策树组合到一起,以降低过拟合的风险.随机森林可以处理名词型特征,不需要进行特征缩放处理.随机森林并行训练许多决策树模型,对每个决策树的预测结果进行合 ...
- 统计学习方法第五章作业:ID3/C4.5算法分类决策树、平方误差二叉回归树代码实现
ID3/C4.5算法分类决策树 import numpy as np import math class Node:def __init__(self,feature_index=None,value ...
- r语言 C4.5 剪枝是用什么算法_决策树,逻辑回归,PCA算法面经
目录 决策树 简述决策树原理? 为什么要对决策树进行减枝?如何进行减枝? 简述决策树的生成策略 PCA 简述主成分分析PCA工作原理,以及PCA的优缺点? PCA中有第一主成分.第二主成分,它们分别是 ...
- 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)
文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...
- python 决策树回归参数_使用 Python 和 scikit-learn 学习回归算法
本教程已纳入面向开发者的机器学习这一学习路径. 简介 在本教程中,我们将介绍解决基于回归的机器学习问题的基础知识,并对当前最流行的一些算法进行比较研究. 设置 注册或登录. 从 Try IBM Wat ...
- Machine Learning | (10) 回归算法-岭回归
Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...
- Machine Learning | (9) 回归算法-线性回归
Machine Learning | 机器学习简介 Machine Learning | (1) Scikit-learn与特征工程 Machine Learning | (2) sklearn数据集 ...
- 第七课.Logistic回归算法
Logistic 回归,又名逻辑回归,它从线性回归发展而来,是一种广义的线性回归模型:该模型预测输出的是样本类别的条件概率分布,因而可以取概率值最大的类别作为分类结果,实质上是一个分类模型. 目录 算 ...
最新文章
- 你还在使用 try-catch-finally 关闭资源?
- 浅述Oracle分布式事务概念
- 某pl/sql培训练习题
- 计算机应用节能环保,计算机应用的节能环保问题研究
- windows10开启Webdav文件服务
- 夜弦网页游戏专用浏览器(支持最小化隐藏后台多开挂机)
- mybatis常用标签
- ch341a编程器写操作超时失败
- 2021-03-13 大数据课程笔记 day52
- 【微信小程序开发】缓存Storage的存入与获取
- c语言循环卖n西瓜 几天卖完,C++循环结构23道题含答案.docx
- 2022-2028全球COB摄影灯行业调研及趋势分析报告
- 微店新品!微店首款《疯狂野蛮人》横版动作游戏来啦!
- 全极化SAR图像freeman分解
- 关于MAX3232ESE+T的过热问题
- 项目管理经理人如何提高向上管理的指数
- 谷歌adwords教程_如何将Google Analytics(分析)与AdWords关联
- Ogre 天龙八部 GridInfo文件格式说明(正确版)
- java计算机毕业设计三坑购物平台演示录像2020源代码+数据库+系统+lw文档
- 【移动终端应用开发】实验1:SharedPreferences的应用