决策树

要使决策树完整而有效,它必须包含所有的可能性。事件序列也必须提供,并且是互斥的,这意味着如果一个事件发生,另一个就不能发生。

决策树是监督机器学习的一种形式,因为我们必须解释输入和输出应该是什么。有决策节点和叶子。叶子是决策,不管是否是最终决策,节点是决策分裂发生的地方。

虽然有很多算法可供我们使用,但我们将使用迭代二分法(ID3)算法。

在每个递归步骤中,根据一个标准(信息增益、增益比等)选择对我们正在处理的输入集进行最佳分类的属性。

这里必须指出的是,无论我们使用什么算法,都不能保证生成尽可能小的树。因为这直接影响到算法的性能。

请记住,对于决策树,学习仅仅基于启发式,而不是真正的优化标准。让我们用一个例子来进一步解释这一点。

下面的示例来自http://jmlr.csail.mit.edu/papers/volume8/esmeir07a/esmeir07a.pdf,它演示了XOR学习概念,我们所有的开发人员都(或应该)熟悉这个概念。稍后的例子中也会出现这种情况,但现在a3和a4与我们要解决的问题完全无关。它们对我们的答案没有影响。也就是说,ID3算法将选择其中一个构建树,事实上,它将使用a4作为根节点!记住,这是算法的启发式学习,而不是优化结果:

希望这张图能让大家更容易理解刚刚所说的内容。我们的目标并不是深入研究决策树机制和理论。而是如何使用它,尽管存在很多问题,但决策树仍然是许多算法的基础,尤其是那些需要对结果进行人工描述的算法。这也是我们前面试试人脸检测算法的基础。

决策节点

决策树的一个节点。每个节点可能有关联的子节点,也可能没有关联的子节点

决策的变量

此对象定义树和节点可以处理的每个决策变量的性质。值可以是范围,连续的,也可以是离散的。

决策分支节点的集合

此集合包含将一个或多个决策节点组,以及关于决策变量的附加信息,以便进行比较。

下面是一个用于确定金融风险的决策树示例。我们只需要在节点之间导航,就可以很容易地跟随它,决定要走哪条路,直到得到最终的答案。在这种情况下,当有人正在申请贷款,而我们需要对他们的信用价值做出决定。这时决策树就是解决这个问题的一个很好的方法:

我应该接受这份工作吗?

你刚刚得到一份新工作,你需要决定是否接受它。有一些重要的事情需要考虑,所以我们将它们作为输入变量或特性,用于决策树。

对你来说最重要的是:薪水、福利、公司文化,当然还有,我能在家工作吗?

我们将创建一个内存数据库并以这种方式添加特性,而不是从磁盘存储中加载数据。我们将创建DataTable并创建列,如下图所示:

在这之后,我们将加载几行数据,每一行都有一组不同的特性,最后一列应该是Yes或No,作为我们的最终决定:

一旦所有的数据都创建好并放入表中,我们就需要将之前的特性转换成计算机能够理解的表示形式。

由于数字更简单,我们将通过一个称为编码的过程将我们的特性(类别)转换为一本代码本。该代码本有效地将每个值转换为整数。

注意,我们将传递我们的数据类别作为输入:

接下来,我们需要为决策树创建要使用的决策变量。

这棵树会帮助我们决定是否接受新的工作邀请。对于这个决策,将有几类输入,我们将在决策变量数组中指定它们,以及两个可能的决策,是或者否。

DecisionVariable数组将保存每个类别的名称以及该类别可能的属性的总数。例如,薪水类别有三个可能的值,高、平均或低。我们指定类别名和数字3。然后,除了最后一个类别(即我们的决定)之外,我们对所有其他类别都重复这个步骤:

现在我们已经创建了决策树,我们必须教它如何解决我们要解决的问题。为了做到这一点,我们必须为这棵树创建一个学习算法。由于我们只有这个示例的分类值,所以ID3算法是最简单的选择。

一旦学习算法被运行,它就会被训练并可供使用。我们简单地为算法提供一个样本数据集,这样它就可以给我们一个答案。在这种情况下,薪水不错,公司文化不错,福利也不错,我可以在家工作。如果正确地训练决策树,答案将会是是:

Numl

numl是一个非常著名的开源机器学习工具包。与大多数机器学习框架一样,它的许多示例也使用Iris数据集,包括我们将用于决策树的那个。

下面是我们的numl输出的一个例子:

让我们看一下这个例子背后的代码:

        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var description = Descriptor.Create<Iris>();
            Console.WriteLine(description);
            var generator = new DecisionTreeGenerator();
            var data = Iris.Load();
            var model = generator.Generate(description, data);
            Console.WriteLine("生成的模型:");
            Console.WriteLine(model);
            Console.ReadKey();
        }

这个方法并不复杂,对吧?这就是在应用程序中使用numl的好处;它非常容易使用和集成。

上述代码创建描述符和DecisionTreeGenerator,加载Iris数据集,然后生成模型。这里只是正在加载的数据的一个示例:

        public static Iris[] Load()
        {
            return new Iris[]
            {
                new Iris { SepalLength = 5.1m, SepalWidth = 3.5m, PetalLength = 1.4m, PetalWidth = 0.2m, Class = "Iris-setosa" },
                new Iris { SepalLength = 4.9m, SepalWidth = 3m, PetalLength = 1.4m, PetalWidth = 0.2m, Class = "Iris-setosa" },
                new Iris { SepalLength = 4.7m, SepalWidth = 3.2m, PetalLength = 1.3m, PetalWidth = 0.2m, Class = "Iris-setosa" },
                new Iris { SepalLength = 4.6m, SepalWidth = 3.1m, PetalLength = 1.5m, PetalWidth = 0.2m, Class = "Iris-setosa" },
                new Iris { SepalLength = 5m, SepalWidth = 3.6m, PetalLength = 1.4m, PetalWidth = 0.2m, Class = "Iris-setosa" },
                new Iris { SepalLength = 5.4m, SepalWidth = 3.9m, PetalLength = 1.7m, PetalWidth = 0.4m, Class = "Iris-setosa" }
            };
        }

Accord.NET 决策树

Accord.NET framework也有自己的决策树例子。它采用了一种不同的、更图形化的方法来处理决策树,但是您可以通过调用来决定您喜欢哪个决策树,并且最习惯使用哪个决策树。

一旦数据被加载,您就可以创建决策树并为学习做好准备。您将看到与这里类似的数据图,使用了X和Y两个类别:

下一个选项卡将让您看到树节点、叶子和决策。右边还有一个自顶向下的树的图形视图。最有用的信息在左边的树形视图中,你可以看到节点,它们的值,以及做出的决策:

最后,最后一个选项卡将允许您执行模型测试:

代码

下面是学习代码

            // 指定输入变量
            DecisionVariable[] variables =
            {
                new DecisionVariable("x", DecisionVariableKind.Continuous),
                new DecisionVariable("y", DecisionVariableKind.Continuous),
            };
            // 创建C4.5学习算法
            var c45 = new C45Learning(variables);

            // 使用C4.5学习决策树
            tree = c45.Learn(inputs, outputs);

            // 在视图中显示学习树
            decisionTreeView1.TreeSource = tree;

            // 获取每个变量(X和Y)的范围
            DoubleRange[] ranges = table.GetRange();

            // 生成一个笛卡尔坐标系
            ], , ranges[], );

            // 对笛卡尔坐标系中的每个点进行分类
            double[,] surface = map.ToMatrix().InsertColumn(tree.Decide(map));
CreateScatterplot(zedGraphControl2, surface);
            //测试
            // 从整个源数据表创建一个矩阵
            double[][] table = (dgvLearningSource.DataSource as DataTable).ToJagged(out columnNames);

            //只获取输入向量值(前两列)
            , );

            // 获取预期的输出标签(最后一列)
            ).ToInt32();

            // 计算实际的树输出
            int[] actual = tree.Decide(inputs);

            // 使用混淆矩阵来计算一些统计数据。
            ConfusionMatrix confusionMatrix = , );
            dgvPerformance.DataSource = new[] { confusionMatrix };

            CreateResultScatterplot(zedGraphControl1, inputs, expected.ToDouble(), actual.ToDouble());

然后他的值被输入一个混淆矩阵。对于不熟悉这一点的同学,让我简单解释一下.

混淆矩阵

混淆矩阵是用来描述分类模型性能的表。它在已知真值的测试数据集上运行。这就是我们如何得出如下结论的。

真-阳性

在这个例子中,我们预测是,这是事实。

真-阴性

在这种情况下,我们预测否,这是事实。

假-阳性

在这种情况下,我们预测是,但事实并非如此。有时您可能会看到这被称为type 1错误。

假-阴性

在这种情况下,我们预测“否”,但事实是“是”。有时您可能会看到这被type 2类错误。

现在,说了这么多,我们需要谈谈另外两个重要的术语,精确度和回忆。

让我们这样来描述它们。在过去的一个星期里,每天都下雨。这是7天中的7天。很简单。一周后,你被问到上周多久下一次雨?

回忆

它是你正确回忆下雨的天数与正确事件总数的比值。如果你说下了7天雨,那就是100%。如果你说下了四天雨,那么57%的人记得。在这种情况下,它的意思是你的回忆不是那么精确,所以我们有精确度来识别。

精确度

它是你正确回忆将要下雨的次数与那一周总天数的比值。

对我们来说,如果我们的机器学习算法擅长回忆,并不一定意味着它擅长精确。有道理吗?这就涉及到其他的事情,比如F1的分数,我们会留到以后再讲。

可视化错误类型

以下是一些可能会有帮助的可视化:

识别真阳性和假阴性:

使用混淆矩阵计算统计量后,创建散点图,识别出所有内容:

总结

在这一章中,我们花了很多时间来研究决策树;它们是什么,我们如何使用它们,以及它们如何使我们在应用程序中受益。在下一章中,我们将进入深度信念网络(DBNs)的世界,它们是什么,以及我们如何使用它们。

我们甚至会谈论一下计算机的梦,当它做梦的时候!

基于C#的机器学习--我应该接受这份工作吗-使用决策树的更多相关文章

  1. 基于C#的机器学习--目录

    转载请注明出处:https://www.cnblogs.com/wangzhenyao1994/p/10223666.html 文章发表的另一个地址:https://blog.csdn.net/wyz ...

  2. 基于Python的机器学习实战:KNN

    1.KNN原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应 ...

  3. 基于python的机器学习开发环境安装(最简单的初步开发环境)

    一.安装Python 1.下载安装python3.6 https://www.python.org/getit/ 2.配置环境变量(2个) 略...... 二.安装Python算法库 安装顺序:Num ...

  4. 基于Apache Spark机器学习的客户流失预测

    流失预测是个重要的业务,通过预测哪些客户可能取消对服务的订阅来最大限度地减少客户流失.虽然最初在电信行业使用,但它已经成为银行,互联网服务提供商,保险公司和其他垂直行业的通用业务. 预测过程是大规模数 ...

  5. 基于C#的机器学习--惩罚与奖励-强化学习

    强化学习概况 正如在前面所提到的,强化学习是指一种计算机以“试错”的方式进行学习,通过与环境进行交互获得的奖赏指导行为,目标是使程序获得最大的奖赏,强化学习不同于连督学习,区别主要表现在强化信号上,强 ...

  6. 基于C#的机器学习--贝叶斯定理-执行数据分析解决肇事逃逸之谜

    贝叶斯定理-执行数据分析解决肇事逃逸之谜 ​ 在这一章中,我们将: 应用著名的贝叶斯定理来解决计算机科学中的一个非常著名的问题. 向您展示如何使用贝叶斯定理和朴素贝叶斯来绘制数据,从真值表中发现异常值 ...

  7. 基于C#的机器学习--面部和动态检测-图像过滤器

    在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...

  8. 基于C#的机器学习--机器学习的基本知识

    机器学习的基本知识 ,…用n个观测值测量.但我们不再对Y的预测感兴趣,因为我们不再有Y了,我们唯一感兴趣的是在已有的特征上发现数据模式: ​ 在前面的图中,我们可以看到这样的数据本身更适合于非线性方法 ...

  9. scikit-learn 和pandas 基于windows单机机器学习环境的搭建

    很多朋友想学习机器学习,却苦于环境的搭建,这里给出windows上scikit-learn研究开发环境的搭建步骤. Step 1. Python的安装 python有2.x和3.x的版本之分,但是很多 ...

  10. 基于Python的机器学习实战:Apriori

    目录: 1.关联分析 2. Apriori 原理 3. 使用 Apriori 算法来发现频繁集 4.从频繁集中挖掘关联规则 5. 总结 1.关联分析  返回目录 关联分析是一种在大规模数据集中寻找有趣 ...

随机推荐

  1. [转]nopCommerce Widgets and How to Create One

    本文转自:https://dzone.com/articles/what-are-nopcommerce-widgets-and-how-to-create-one A widget is a sta ...

  2. My first makefile to compile multiple C files

    I have three files to compile: main.c, func.c,  func.h The steps: 1   main.c   to   main.o 2   func. ...

  3. 基于ZigBee的家居控制系统的设计与应用

    基于ZigBee的家居控制系统的设计与应用 PPT简介:http://pan.baidu.com/s/1i38PC6D 摘  要 智能家居是未来家居的发展方向,其利用先进的网络技术.计算机技术和无线通 ...

  4. c#如何使用正则表达式ZZ

    什么是正则表达式      正则表达式是用来检验和操作字符串的强大工具.简单的理解正则表达式可以认为是一种特殊的验证字符串.正则表达式常见运用是验证用户输入信息格式,比如上面的那组"\w{1 ...

  5. TI CC2541 BLE协议栈蓝牙MAC 地址

    在Flash中有一块只读区域,从地址0x780E开始,蓝牙的MAC以小端方式存放在里面. 在TI的Peripheral例程里面,添加一个特征值,只读属性,6字节长度(蓝牙MAC长度为48-bit,6字 ...

  6. [运维-服务器 – 2A] – nginx下绑定域名

    这个篇文章今天(2016-01-21)才有幸写了,因为自己对nginx部署以前没玩过,还得感谢下我们数字化的总经理.在这里记录下自己成长的经验,与遇到的问题. 因为自己的域名是在万网上买的,解析无法直 ...

  7. Group by与having理解

    注意:select 后的字段,必须要么包含在group by中,要么包含在having 后的聚合函数里. 1. GROUP BY 是分组查询, 一般 GROUP BY 是和聚合函数配合使用 group ...

  8. mysql 生成批量存储过程

    CREATE  PROCEDURE `BatchInsert`(IN init INT, IN loop_time INT)BEGIN DECLARE Var INT; DECLARE ID INT; ...

  9. 怒刷DP之 HDU 1029

    Ignatius and the Princess IV Time Limit:1000MS     Memory Limit:32767KB     64bit IO Format:%I64d &a ...

  10. 那天有个小孩跟我说LINQ(三)转载

    1  LINQ TO Objects续2(代码下载)      新建项目 linq_Ch3控制台程序    1.1 操作字符串        ①查找字符串中包含的大写字母,字符串是由多个char类型组 ...