sparkmllib分类算法之决策树学习

SparkDr SparkDr     2022-09-01     299

关键词:

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).toDouble
        val feature=trimmed.slice(4,r.length-1).map(d => if(d=="?")0.0
        else 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 = dtMetrics
    allMetrics.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) 。

 

 

sparkmllib回归算法之决策树

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

ml之监督学习算法之分类算法一————决策树算法

一、概述  决策树的一个重要任务是为了数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,在这些机器根据数据创建规则时,就是机器学习的过程。二、决策树的构造  决策树:... 查看详情

sparkmllib学习分类算法之逻辑回归算法

SparkMLlib学习分类算法之逻辑回归算法(一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693836)    逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族... 查看详情

分类算法之决策树

分类问题,主要介绍决策树算法、朴素贝叶斯、支持向量机、BP神经网络、懒惰学习算法、随机森林与自适应增强算法、分类模型选择和结果评价。一、分类基本介绍  物以类聚,人以群分,分类问题只古以来就出现我们的生... 查看详情

机器学习笔记之三cart分类与回归树

本文结构:CART算法有两步回归树的生成分类树的生成剪枝CART-ClassificationandRegressionTrees分类与回归树,是二叉树,可以用于分类,也可以用于回归问题,最先由Breiman等提出。分类树的输出是样本的类别,回归树的输出是一个实... 查看详情

决策树算法之鸢尾花特征分类可视化详解机器学习(代码片段)

@[toc]一.前言1.1本文原理鸢尾花特征分类决策树算法可视化效果图如下:决策树是一种常用的机器学习方法,它可以帮助我们解决分类和回归问题。该模型具有高度的可解释性。该模型符合人类的思维方式,是一种经典的树形结... 查看详情

361机器学习常见算法

...机器学习实战教程(五):朴素贝叶斯实战篇之新浪新闻分类参考:朴素贝叶斯分类器的应用 ——阮一峰参考:算法杂货铺——分类算法之朴素贝叶斯分类(NaiveBayesianclassification)参考:《机器学习实战》第4章 ... 查看详情

统计学习笔记之决策树

1.CART分类树的特征选择分类问题中,假设有K个类,样本点属于第k类的概率为,则概率分布的基尼指数定义为:   如果,集合D根据特征A是否取某一可能值a被分割成和,在特征A的条件下,集合D的基尼指数定义为:  基尼指数代... 查看详情

机器学习算法学习02:决策树的学习以及应用决策树解决cora数据集论文分类问题(代码片段)

...02:决策树的学习以及应用决策树解决Cora数据集论文分类问题文章目录机器学习算法学习02:决策树的学习以及应用决策树解决Cora数据集论文分类问题1.前言2.算法分析2.1算法概述2.2算法优化3.算法代码3.1决策属性优先级... 查看详情

机器学习--决策树分类算法及应用

1.决策树分类算法原理1.1概述决策树(decisiontree)——是一种被广泛使用的分类算法。相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置在实际应用中,对于探测式的知识发现,决策树更加适用1.2算法... 查看详情

机器学习算法之决策树(上)

信息熵决策树决策树优化剪枝决策树可视化决策树直观理解比特化(Bits) 查看详情

机器学习实战之第三章决策树(decisiontree)

...cript>决策树概述决策树(DecisionTree)算法主要用来处理分类问题,是最经常使用的数据挖掘算法之一。决策树场景一个叫做"二十个问题"的游戏,游戏的 查看详情

机器学习决策树理论第二卷

...大家多多指教!本卷的大纲为1CART算法1.1CART回归树1.2CART分类树2CART剪枝3总结1CART算法CART分类与回归树(classificationandregressiontree,CART)模型室友Breiman等人1984年提出,是应用广泛的决策 查看详情

机器学习决策树

...策树简介1.1决策树概述决策树算法是一种基于树形结构的分类算法,它能从给定的无序的训练样本中,提炼出树型的分类模型,树形中包含判断模块和终止模块。它是一种典型的分类算法,首先对数据进行处理,利用归纳算法生... 查看详情

ai机器学习-决策树算法-概念和学习过程

1.概念决策树是通过一系列规则对数据进行分类的过程,它提供一种在什么条件下会得到什么值的类似规则的方法。决策树分为分类树和回归树两种,分类树对离散变量做决策树,回归树对连续变量做决策树。分类决策树模型是... 查看详情

机器学习算法决策树-6prism

目录PRISM决策规则算法如何使用分类树来进行分类预测:分类树与分类规则间的关系PRISM决策规则的产生方式我的主页:晴天qt01的博客_CSDN博客-数据分析师领域博主目前进度:第四部分【机器学习算法】PRISM决策规则... 查看详情

统计学习方法五决策树分类

决策树分类1,概念        2,决策树算法2.1,特征选择:  熵:值越大,不确定性因素越大;条件熵:条件对结果的影响不确定性;信息增益;信息增益比                        2.2... 查看详情

spark机器学习:决策树算法

1.决策树基本知识决策树就是通过一系列规则对数据进行分类的一种算法,可以分为分类树和回归树两类,分类树处理离散变量的,回归树是处理连续变量。样本一般都有很多个特征,有的特征对分类起很大的作用,有的特征对... 查看详情