示例代码及相关内容来源于《Alink权威指南(Java版)》

概述

决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。

如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。

特征分类

特征数据有多种划分,比如连续特征、离散特征、时序特征。决策树对于离散特征与连续特征的处理是有些差异的。

连续特征

以用户属性数据为例,比如身高、年龄、体重等特征数据,可以看作是连续特征数据,因为其分布一般是连续且不均匀的数值数据。

离散数据

以用户属性数据为例,比如性别数据,只有两种取值,是分布均匀,分组清晰的文本数据。



决策树模型处理这两种数据的区别其实也就是需要考虑数据是否分组聚集,以及是否划分数据,如何划分数据。导致其数学形式的表述有差异。

决策树分类与算法

常见决策树算法

目前常用的决策树模型有三种,分别是

  • ID3
  • C4.5
  • CART

虽然这三种算法的区别以及实现初衷不尽相同,但其实可以都是基于三种不同类型的决策树模型来实现的。而这三种类型分别是:

  • GINI:基尼值,CART算法模型
  • INFOGAIN:信息增益,ID3算法模型
  • INFOGAINRATIO:信息增益率,C4.5算法模型

如上所示,不同的决策树算法对应着不同类型的决策树模型。

决策树分类

决策树分为两大类:回归树与分类树,其分别对应解决机器学习领域中的分类和回归问题。分类树预测分类标签值,回归树用于预测数值。

分类树在每次分枝时,会针对当前枝节点的样本,找出最优的分裂特征和分裂方式,从而得到若干新节点;继续分枝,直到所有样本都被分入类别唯一的叶节点。

回归树的建模也差不多,但分裂指标不同,回归树一般以均方差为分裂指标。

Alink实现决策树算法模型

实现概览

在Alink库中,已经封装好了决策树算法的相关细节,使得业务开发及其简单——简单的API调用即可。

实现Demo如下:

/**
* 基于C45决策树算法进行模型训练,并输出模型
* 1. 设置C45决策树模型参数
* 1.1 设置特征列
* 1.2 设置离散特征列
* 1.3 设置标签列
* 1.4 打印输出模型
* */
static void c_2_5() throws Exception {
MemSourceBatchOp source = new MemSourceBatchOp(
new Row[] {
Row.of("sunny", 85.0, 85.0, false, "no"),
Row.of("sunny", 80.0, 90.0, true, "no"),
Row.of("overcast", 83.0, 78.0, false, "yes"),
Row.of("rainy", 70.0, 96.0, false, "yes"),
Row.of("rainy", 68.0, 80.0, false, "yes"),
Row.of("rainy", 65.0, 70.0, true, "no"),
Row.of("overcast", 64.0, 65.0, true, "yes"),
Row.of("sunny", 72.0, 95.0, false, "no"),
Row.of("sunny", 69.0, 70.0, false, "yes"),
Row.of("rainy", 75.0, 80.0, false, "yes"),
Row.of("sunny", 75.0, 70.0, true, "yes"),
Row.of("overcast", 72.0, 90.0, true, "yes"),
Row.of("overcast", 81.0, 75.0, false, "yes"),
Row.of("rainy", 71.0, 80.0, true, "no")
},
new String[] {"Outlook", "Temperature", "Humidity", "Windy", "Play"}
); source.lazyPrint(-1); source
.link(
new C45TrainBatchOp()
.setFeatureCols("Outlook", "Temperature", "Humidity", "Windy") // 设置特征列
.setCategoricalCols("Outlook", "Windy") // 设置离散特征
.setLabelCol("Play") // 设置标签列
.lazyPrintModelInfo()
.lazyCollectModelInfo(new Consumer <DecisionTreeModelInfo>() {
@Override
public void accept(DecisionTreeModelInfo decisionTreeModelInfo) {
try {
decisionTreeModelInfo.saveTreeAsImage(
DATA_DIR + "weather_tree_model.png", true);
} catch (IOException e) {
e.printStackTrace();
}
}
})
); BatchOperator.execute();
}

最终生成一个决策树图

算子函数

C45TrainBatchOp

API说明

简单看看其构造函数


@NameCn("C45决策树分类训练")
@NameEn("C45 Decision Tree Training")
@EstimatorTrainerAnnotation(
estimatorName = "com.alibaba.alink.pipeline.classification.C45"
)
public class C45TrainBatchOp extends BaseRandomForestTrainBatchOp<C45TrainBatchOp> implements C45TrainParams<C45TrainBatchOp>, WithModelInfoBatchOp<DecisionTreeModelInfo, C45TrainBatchOp, C45ModelInfoBatchOp> {
private static final long serialVersionUID = -1894634246411633664L; public C45TrainBatchOp() {
this((Params)null);
} /**
* 主要是这里,构造了决策树模型的类别为INFOGAINRATIO
*/
public C45TrainBatchOp(Params parameter) {
super(parameter);
this.getParams().set(TreeUtil.TREE_TYPE, TreeType.INFOGAINRATIO);
this.getParams().set(HasNumTreesDefaltAs10.NUM_TREES, 1);
this.getParams().set(HasFeatureSubsamplingRatio.FEATURE_SUBSAMPLING_RATIO, 1.0D);
this.getParams().set(HasSubsamplingRatio.SUBSAMPLING_RATIO, 1.0D);
} public C45ModelInfoBatchOp getModelInfoBatchOp() {
return (C45ModelInfoBatchOp)(new C45ModelInfoBatchOp(this.getParams())).linkFrom(new BatchOperator[]{this});
}
}

聊聊基于Alink库的决策树模型算法实现的更多相关文章

  1. Python 实现基于信息熵的 ID3 算法决策树模型

    版本说明 Python version: 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:21:07) [MSC v.1900 32 bit (Int ...

  2. 决策树模型 ID3/C4.5/CART算法比较

    决策树模型在监督学习中非常常见,可用于分类(二分类.多分类)和回归.虽然将多棵弱决策树的Bagging.Random Forest.Boosting等tree ensembel 模型更为常见,但是“完 ...

  3. DNS通道检测 国内学术界研究情况——研究方法:基于特征或者流量,使用机器学习决策树分类算法居多

    http://xuewen.cnki.net/DownloadArticle.aspx?filename=BMKJ201104017&dbtype=CJFD<浅析基于DNS协议的隐蔽通道 ...

  4. 02-25 scikit-learn库之决策树

    目录 scikit-learn库之决策树 一.DecisionTreeClassifier 1.1 使用场景 1.2 代码 1.3 参数详解 1.4 属性 1.5 方法 二.DecisionTreeR ...

  5. Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想

    Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想 目录 Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想 0x00 摘要 0x01 Flink 是什么 ...

  6. Sklearn库例子——决策树分类

    Sklearn上关于决策树算法使用的介绍:http://scikit-learn.org/stable/modules/tree.html 1.关于决策树:决策树是一个非参数的监督式学习方法,主要用于 ...

  7. 决策树模型比较:C4.5,CART,CHAID,QUEST

    (1)C4.5算法的特点为: 输入变量(自变量):为分类型变量或连续型变量. 输出变量(目标变量):为分类型变量. 连续变量处理:N等分离散化. 树分枝类型:多分枝. 分裂指标:信息增益比率gain ...

  8. day-7 一个简单的决策树归纳算法(ID3)python编程实现

    本文介绍如何利用决策树/判定树(decision tree)中决策树归纳算法(ID3)解决机器学习中的回归问题.文中介绍基于有监督的学习方式,如何利用年龄.收入.身份.收入.信用等级等特征值来判定用户 ...

  9. Spark:聚类算法之LDA主题模型算法

    http://blog.csdn.net/pipisorry/article/details/52912179 Spark上实现LDA原理 LDA主题模型算法 [主题模型TopicModel:隐含狄利 ...

  10. 【神经网络篇】--基于数据集cifa10的经典模型实例

    一.前述 本文分享一篇基于数据集cifa10的经典模型架构和代码. 二.代码 import tensorflow as tf import numpy as np import math import ...

随机推荐

  1. WPF中小的技能点 1

    图片圆角的处理方式       采用boder里background背景设置图片并设置对应的圆角 <Border CornerRadius="20">      < ...

  2. WPF中进度条同步实现

    WPF界面的编写 滑动条的显示 //前台界面的设计 <Border Grid.Row="1" Background="Transparent" Borde ...

  3. 尚医通-day10【微信扫码登录】(内附源码)

    第01章-准备工作 1.申请微信登录 https://open.weixin.qq.com (1)注册开发者账号:准备营业执照 (2)邮箱激活 (3)完善开发者资料 (4)开发者资质认证:1-2个工作 ...

  4. 自然语言处理 Paddle NLP - 信息抽取技术及应用

    1.什么是信息抽取 即自动从无结构或半结构的文本中抽取出结构化信息的任务(病历抽取) 2.实体抽取 3.关系抽取 4.事件抽取 信息抽取和知识图谱是一个上下游的关系.抽取的结果,可以组装成知识图谱(一 ...

  5. Linux系统运维之Zookeeper集群配置

    一.简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.ZooKeeper的目标就是封装好复杂易 ...

  6. Jmeter压测实战:Jmeter二次开发之自定义函数

    1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具,具备轻量.高扩展性.分布式等特性.Jmeter已支持实现随机数.计数器.时间戳.大小写转换.属性校验等多种函数,方便使用 ...

  7. PowerDesigner反向导入表+PowerDesigner的ER图设计+PowerDesigner连接外键的线(版本16.5)

    使用PowerDesigner导入表+PowerDesigner画ER图+PowerDesigner设置外键 ps: ①ER图:就是PD中的 Physical Diagram 一.导入表,并设置备注为 ...

  8. go web学习(五)

    跟着刘旭老师学go web做的笔记 [Go Web 编程快速入门[Golang/Go语言](完结)] https://www.bilibili.com/video/BV1Xv411k7Xn/?p=27 ...

  9. PostgreSQL 10 文档: SQL 语法

    SQL 命令   这部分包含PostgreSQL支持的SQL命令的参考信息.每条命令的标准符合和兼容的信息可以在相关的参考页中找到. 目录 ABORT - 中止当前事务 ALTER AGGREGATE ...

  10. 关于vue的一些使用总结

    了解响应式原理后对代码的一点小重构 在操作一个响应式变量的时候,可能会多次去取这个响应式变量的值,这就意味着会多次执行依赖收集中的get,可以用一个局部变量缓存下来,这样只需要一次get操作. // ...