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%%") }
/*
[email protected] tree depth, AUC = 62.37%
[email protected] tree depth, AUC = 62.43%
*/

(三) 交叉验证

1,数据集分类

创建三个数据集:训练集

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

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

2,交叉验证的常用方法

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

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

时间: 2024-12-25 10:30:42

SparkMLlib分类算法之决策树学习的相关文章

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

Netflix工程总监眼中的分类算法:深度学习优先级最低 摘要:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain根据奥卡姆剃刀原理依次推荐了逻辑回归.SVM.决策树集成和深度学习,并谈了他的不同认识.他并不推荐深度学习为通用的分类技术. [编者按]针对Quora上的一个老问题:不同分类算法的优势是什么?Netflix公司工程总监Xavier Amatriain近日给出新的解答,他根据奥卡姆剃刀原理依次推荐了逻辑回归.SVM.决策树集成和深度学习,并谈了他的不同

转载:算法杂货铺——分类算法之决策树(Decision tree)

作者:张洋 算法杂货铺——分类算法之决策树(Decision tree) 2010-09-19 16:30 by T2噬菌体, 44346 阅读, 29 评论, 收藏, 编辑 3.1.摘要 在前面两篇文章中,分别介绍和讨论了朴素贝叶斯分类与贝叶斯网络两种分类算法.这两种算法都以贝叶斯定理为基础,可以对分类及决策问题进行概率推断.在这一篇文章中,将讨论另一种被广泛使用的分类算法——决策树(decision tree).相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置,因此在实际

初识分类算法(2)------决策树ID3算法

例子:分类:play or not ?(是/否)             目的:根据训练样本集S构建出一个决策树,然后未知分类样本通过决策树就得出分类. 问题:怎么构建决策树,从哪个节点开始(选择划分属性的问题) 方法:ID3(信息增益),C4.5(信息增益率),它们都是用来衡量给定属性区分训练样例的能力. 1. 为了理解信息增益,先来理解熵Entropy.熵是来度量样本的均一性的,即样本的纯度.样本的熵越大,代表信息的不确定性越大,信息就越混杂. 训练样本S:     S相对与目标分类的熵为:

分类算法:决策树(C4.5)(转)

C4.5是机器学习算法中的另一个分类决策树算法,它是基于ID3算法进行改进后的一种重要算法,相比于ID3算法,改进有如下几个要点: 1)用信息增益率来选择属性.ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(entropy, 熵是一种不纯度 度量准则),也就是熵的变化值,而C4.5用的是信息增益率. 2)在决策树构造过程中进行剪枝,因为某些具有很少元素的结点可能会使构造的决策树过适应(Overfitting),如果不考虑这些结点可能会更好. 3)对非离散数据也

SparkMLlib回归算法之决策树

(一),决策树概念 1,决策树算法(ID3,C4.5 ,CART)之间的比较: 1,ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准.信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息. 2 ID3算法只能对描述属性为离散型属性的数据集构造决策树,其余两种算法对离散和连续都可以处理 2,C4.5算法实例介绍(参考网址:http://m.blog.csdn.net/article/details?id=44726921) c4.5后

用Python开始机器学习(2:决策树分类算法)

http://blog.csdn.net/lsldd/article/details/41223147 从这一章开始进入正式的算法学习. 首先我们学习经典而有效的分类算法:决策树分类算法. 1.决策树算法 决策树用树形结构对样本的属性进行分类,是最直观的分类算法,而且也可以用于回归.不过对于一些特殊的逻辑分类会有困难.典型的如异或(XOR)逻辑,决策树并不擅长解决此类问题. 决策树的构建不是唯一的,遗憾的是最优决策树的构建属于NP问题.因此如何构建一棵好的决策树是研究的重点. J. Ross Q

R语言与数据分析之三:分类算法2

上期与大家分享的传统分类算法都是建立在判别函数的基础上,通过判别函数值来确定目标样本所属的分类,这类算法有个最基本的假设:线性假设.今天继续和大家分享下比较现代的分类算法:决策树和神经网络.这两个算法都来源于人工智能和机器学习学科. 首先和小伙伴介绍下数据挖掘领域比较经典的Knn(nearest neighbor)算法(最近邻算法) 算法基本思想: Step1:计算出待测样本与学习集中所有点的距离(欧式距离或马氏距离),按距离大小排序,选择出距离最近的K个学习点: Step2:统计被筛选出来的K

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

SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693836) 逻辑回归与线性回归类似,但它不属于回归分析家族(主要为二分类),而属于分类家族,差异主要在于变量不同,因此其解法与生成曲线也不尽相同.逻辑回归是无监督学习的一个重要算法,对某些数据与事物的归属(分到哪个类别)及可能性(分到某一类别的概率)进行评估. (二),SparkMLlib逻辑回归应用

从决策树学习谈到贝叶斯分类算法、EM、HMM

从决策树学习谈到贝叶斯分类算法.EM.HMM 引言 近期在面试中,除了基础 &  算法 & 项目之外,经常被问到或被要求介绍和描写叙述下自己所知道的几种分类或聚类算法(当然,这全然不代表你将来的面试中会遇到此类问题,仅仅是由于我的简历上写了句:熟悉常见的聚类 & 分类算法而已),而我向来恨对一个东西仅仅知其皮毛而不得深入,故写一个有关数据挖掘十大算法的系列文章以作为自己备试之用,甚至以备将来经常回想思考.行文杂乱,但侥幸若能对读者起到一点帮助,则幸甚至哉. 本文借鉴和參考了两本书,