聊聊基于Alink库的决策树模型算法实现

聊聊,基于,alink,决策树,模型,算法,实现 · 浏览次数 : 5

小编点评

**示例代码** ```java // 基于C45决策树算法进行模型训练,并输出模型 static void c_2_5() throws Exception { // 设置C45决策树模型参数 MemSourceBatchOp source = new MemSourceBatchOp( //特征列 Row.of("Outlook", 85.0, 85.0, false, "no"), // 离散特征列 Row.of("Outlook", 80.0, 90.0, true, "no"), //标签列 Row.of("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(); } ``` **相关内容** * **Alink权威指南(Java版)** * **C45决策树训练**

正文

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

概述

决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。
如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。

特征分类

特征(Feature)是对事物某种特性的描述,是建立在原始数据之上的特定表示,它是一个可识别的属性。日常生活中的很多事物我们都可以用二维表格来表示(这就是为什么Excel这么通用的原因),我们收集到的数据同样也可以用二维表格表示,那么通常特征就对应这种表示中的某一列。对于一个通用的二维数据集,每个观测值由一行表示,每个特征由一列表示,对于每一个观测具有一个特定的值。下面就是用户基本属性表,其中每一列就是一个特征,其中年龄、身高、体重是数值的,是数值特征,数值特征也叫做连续特征,而性别是用文本描述的,并且只有男女两种取值,是离散特征。

连续特征

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

离散数据

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

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

决策树分类与算法

常见决策树算法

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

  • 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();
}

最终生成一个决策树图
weather_tree_model.png

算子函数

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库的决策树模型算法实现相似的内容:

聊聊基于Alink库的决策树模型算法实现

示例代码及相关内容来源于《Alink权威指南(Java版)》 概述 决策树模型再现了人们做决策的过程,该过程由一系列的判断构成,后面的判断基于前面的判断结果,不断缩小范围,最终推出结果。 如下,基于决策树模型预测天气,是最常见的示例。天气的整个预测过程,就是不断地判断推测的过程。 特征分类 特征数据

聊聊基于Alink库的随机森林模型

概述 随机森林(Random Forest)是一种集成学习(Ensemble Learning)方法,通过构建多个决策树并汇总其预测结果来完成分类或回归任务。每棵决策树的构建过程中都引入了随机性,包括数据采样和特征选择的随机性。 随机森林的基本原理可以概括如下: 随机抽样训练集:随机森林通过有放回抽

聊聊基于Alink库的主成分分析(PCA)

概述 主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量,这些新变量称为主成分,它们按照方差递减的顺序排列,以保留尽可能多的原始数据信息。 主

聊聊基于Alink库的推荐系统

概述 Alink提供了一系列与推荐相关的组件,从组件使用得角度来看,需要重点关注如下三个方面: 算法选择 推荐领域有很多算法,常用的有基于物品/用户的协同过滤、ALS、FM算法等。对于不同的数据场景,算法也会在计算方式上有很大的变化。 推荐方式 输入信息可以有多种选择,输入结果也有多种情况。 同时输

C#如何创建一个可快速重复使用的项目模板

写在前面 其实很多公司或者资深的开发都有自己快速创建项目的脚手架的,有的是魔改代码生成器实现,有的直接基于T4,RazorEngine等模板引擎打造;但无论如何,其最终目的其实就是搭建一个自定义项目模板(脚手架)。 今天我们聊聊:如何基于官方的cli donet new 命令创建自己的项目模板。 什

聊聊日志聚类算法及其应用场景

阅读《[基于 Flink ML 搭建的智能运维算法服务及应用](https://mp.weixin.qq.com/s/yhXiQtUSR4hxp9XWrkiiew "基于 Flink ML 搭建的智能运维算法服务及应用")》一文后,对其中日志聚类算法有了些思考。 ### 概述 日志聚类,简而言之是对

聊聊Transformer和GPT模型

本文基于《生成式人工智能》一书阅读摘要。感兴趣的可以去看看原文。 可以说,Transformer已经成为深度学习和深度神经网络技术进步的最亮眼成果之一。Transformer能够催生出像ChatGPT这样的最新人工智能应用成果。 ## 序列到序列(seq2seq) Transformer能实现的核心

聊聊我认为的分布式、集群实现关键点

基于常见的中间件(Mysql、ElasticSearch、Zookeeper、Kafka、Redis)等分布式集群设计的机制,自己总结了在在集群设计过程中需要考虑的通用问题。 ### 节点通信机制 主节点的增加、删除、通信机制。 ### 路由算法 即数据路由到哪个节点的策略机制。在集群内有多个节点,

聊聊Spring Cloud Gateway

Spring Cloud Gateway是基于Spring Boot 2.0、Spring WebFlux和Project Reactor等技术开发的网关,它不仅提供了统一的路由请求的方式,还基于过滤链的方式提供了网关最基本的功能;解决了Spring Cloud Zuul的性能问题。

聊聊神经网络的基础知识

来自《深度学习入门:基于Python的理论与实现》 张量 Numpy、TensorFlow、Pytorch等框架主要是为了计算张量或是基于张量计算。 标量:0阶张量;12,4,3, 向量:一阶张量;[12,4,3] 矩阵:二阶张量;[ [12,4,3], [11,2,3] ] 多阶张量:多维数组;