机器学习之决策树详解与实践

决策树是用于分类和预测的一种树结构,决策树方法常用于类别属性的数据集的分类和预测,对于数值属性的数据集,可以经过数据预处理后使用。

决策树的建立是基于样本的递归的学习过程,每个样本都是具有确定的属性的数据,决策树就是基于样本的各属性建立起来的。决策树分为根节点、内部节点和叶节点。从根节点出发,自顶向下,构建分支和内部节点,在内部节点进行属性值的比较,并根据属性的不同取值确定从该节点向下的分支,最终在叶节点给出类别。整棵树就是一个规则集,任意样本都可以从根节点出发,根据样本各属性的取值,找到对应的树中的分支(规则),从而得到样本的类别。

具体方法是:选择一个属性置于根节点,根据这个属性的不同取值将测试样本集划分成多个子集,一个子集对应一个属性取值,然后在每个分支上递归的重复这个过程,直到在一个节点上的所有样本具有相同的类别,即到达叶子结点。

在上述构建方法中,关键的问题在于如何选择在根节点、中间节点进行划分的属性。一个基本的原则是构建较小的决策树,使得上述递归的过程尽早停止,即尽早完成分类。要达到上述目的,需要度量每个节点对应的样本子集的纯度,即样本子集中类别分布的情况,类别数越少,各类别分布越不均匀,纯度越高。信息熵(entropy)是度量集合纯度的最常用的一种指标,定义如下:

在选择划分属性时,分别计算上一级节点对应的样本子集的信息熵和选择各属性划分后该样本子集的信息熵,二者差值(信息增益)最大划分的对应的属性即为划分属性。

温度(T)

起风(W)

下雨(R)

湿度)(H

出去玩(O)

Gain(o,t)=0.918-0.809=0.109

Gain(o,w)=0.918-0.459=0.459(root)

Gain(o,r)=0.918-0.602=0.316

Gain(o,h)=0.918-0.874=0.044

起风(W)=1,信息增益最大的是温度(T)

温度(T)

下雨(R)

湿度(H)

出去玩(O)

起风(W)=0,,信息增益最大的是下雨(R)

温度(T)

下雨(R)

湿度(H)

出去玩(O)

ID3算法的核心就是信息增益的计算,Gain(P1,P2)=E(P1)-E(P2),ID3算法属于贪心算法,用来构建树

 

 

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.tree.DecisionTree
import org.apache.spark.mllib.tree.configuration.Algo
import org.apache.spark.mllib.tree.impurity.Entropy
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by changyaobin.
  */

object DecisionTreeTest {
 
def main(args: Array[String]): Unit = {
   
val conf = new SparkConf().setAppName("DesionTrain").setMaster("local[2]")
   
val sc = new SparkContext(conf)
   
//    加载数据
   
val data = sc.textFile("f://physicalCheck.csv").map(lines => {
     
val fields = lines.split(",")
     
val lable = fields(fields.length - 1).toDouble
     
val features = fields.slice(1, fields.length - 1).map(x => x.toDouble)
      LabeledPoint(lable, Vectors.dense(features))
    })
   
val labe = data.map(_.label)
   
//    了解决策树的参数
   
val model = DecisionTree.train(data, Algo.Classification, Entropy, 5, 9)


   
val predictionAndLabel = data.map { point =>
     
val score = model.predict(point.features)
      (score)
    }
    println(predictionAndLabel.collect().toBuffer)
   
val acc = labe.zip(predictionAndLabel).filter(x => {
      x._1.equals(x._2)
    }).count() / labe.count().toDouble
    println(
"DT预测患者在医院花费的准确率是")
    println(acc)
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值