关于机器学习的学习笔记(二):决策树算法
2014-10-28 00:00
791 查看
摘要: 一、 什么是决策树算法
二、 如何使用决策树算法生成一个决策树
三、 如何使用决策树进行营销
按照上一篇笔记的说法,如果我们现在已经有了训练数据,明确了特征和输出变量,我们就可以用机器学习的算法自动生成一个规则,有了这个规则,有新的数据来的时候,我们就能够通过特征值自动求取输出变量。(如果我已经吃过了10000个芒果,并且记得每个芒果的大小、颜色、硬度、产地等等,也记得每个芒果甜不甜,理论上再给我一个芒果,只要知道它的大小、颜色、硬度、产地,就算不吃我也能知道它甜不甜)。但是具体的规则是如何生成的呢?今天就先学习一下如何使用决策树算法根据训练数据来生成一个规则。
为什么是决策树?因为据说决策树是最容易理解的机器学习算法了,如果决策树我都学不会,后面的就不用学了。
一、 什么是决策树算法
还是先百度百科:“决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。”
简单来说,决策树就是一系列的if-then-else语句,而决策树算法就是利用训练数据自动生成这些语句的方法。下面我们来看一棵典型的决策树(经常有人问我买什么相机好,顺便一起回答了)。
二、 如何使用决策树算法生成一个决策树
还是那个芒果的例子,假如我们有四个特征:大小、颜色、硬度、产地,每个特征都有一系列的取值,比如大小(大、中、小),颜色(深黄、浅黄、绿色),硬度(硬、软),产地(广东、海南、泰国)。两个输出变量:甜、不甜。有10000条数据如下:
如果我们要生成一颗决策树,面临的第一个问题就是,我使用那一个特征作为判断的叶子节点?按照决策树算法的理论:对结果(甜、不甜)影响最大的那一个特征应该作为叶子节点。那么问题来了:如何判断一个特征对结果的影响是大还是小?在信息论中,引入了信息增益和熵的概念来对此进行评价。
信息增益(Information Gain)是用来衡量给定的特征区分训练样例的能力,信息增益高的属性对结果的影响就大。
熵(entropy)是信息增益的一个度量标准,它刻画了指定训练样例集的纯度(purity)。
如果样例的目标属性只有正反两个值,那么指定样例S的熵可以通过以下公式计算:
如果样例的目标属性有c个不同的值,那么样例S相对于c个状态的分类的熵可以计算为:
一个特征A相对样例集合S的信息增益Gain(S,A)的公式为:
简单来说,熵表示一个数据集的无序程度,如果一个数据集,我越难判断其中的数据的目标属性,那么熵值就越高,反之熵值就越低。
而信息增益代表了熵值的降低程度,如果通过一个特征把一个数据集能够分成两个(或者多个)数据集,这两个子数据集的熵的和下降越大,则我们说这个特征在这个数据集上的信息增益越高。
如果一堆芒果我不知道甜不甜,那么这堆芒果的熵值就比较高,但是我分成硬芒果和软芒果之后,如果更容易判断甜不甜,那么硬度这个特征对于芒果的信息增益就很高。
如果还是看不懂上面的公式,也没有关系,我们只需要知道,有一些很厉害的人,发明了一个很厉害的公式,有了这个公式,我就可以知道:使用上面那10000条芒果的数据,我可以利用公式算出来哪一个特征对结果的影响最大。
假如,通过公式计算,我发现,其实产地对芒果甜不甜的影响最大,那我就把产地作为这颗决策树的根节点。然后,我就能够把这10000条数据根据产地分为三份,分别是广东芒果、海南芒果和泰国芒果。然后我继续针对广东芒果,看看剩下的那一个特征对广东芒果甜不甜的影响最大,如果我发现大小对广东芒果甜不甜的影响最大,我再把数据分成大广东芒果、中广东芒果和小广东芒果,如此重复,最终我们就能得到一颗根据芒果的各种特征判断芒果甜不甜的决策树。
何时停止决策树的增长呢?如果在一个子节点下,剩余的任何一个特征对整体熵值下降的影响都很小时,我们认为决策树在这个子节点下就不需要继续增长了。
三、 如何使用决策树进行营销
先重复一下在市场营销的时候,我们会遇到的两个问题:
1、 给定一个用户,我向他营销什么?
2、 给定一个产品,我要向哪些用户进行营销?
针对问题1、给定一个用户,我向他营销什么?假设我有5个可供选择的产品,我倾向于取所有订购了这5个产品的全量用户作为训练数据进行训练,无论这些用户是否被营销了。
假设5个产品分别为A、B、C、D、E,5个产品的全部订购用户有20万人,我挑选了20个标签作为特征。就可以有一个20万行的数据集,这个数据集的前20列是标签的取值,第21列是5个产品中的一个。
使用决策树的算法,我可以计算哪一个标签对用户选择产品的影响最大,并将其作为根节点,然后对根节点的每一个子节点进行重复计算,直至生成一棵决策树。甚至不需要用到全部20个标签,也许算到第5层就能达到一定的决策精度。使用这颗决策树,任意给定一个用户,我如果知道20个标签的取值,我就应该知道应该推荐ABCDE5个产品中的哪一个。
针对问题2、 给定一个产品A,我要向哪些用户进行营销?我倾向于取所有对选定产品A进行过营销的用户数据作为训练数据进行训练,无论是否营销成功。
假设我已经针对A选择了20万客户进行营销,有了营销的结果数据,并且挑选了20个标签作为特征,同样我可以得到一个20万行的数据集,前20列是每一个标签的值,第21列是营销结果,成功还是失败。
采用同样的决策树算法,我们可以找到对营销结果影响最大的那个特征作为根节点,并且生成一棵完整的决策树,后续再挑选用户进行营销的时候,我可以根据这棵决策树决定是否进行营销。
是不是很容易?
等等,我们还有几个问题需要解决?
1、 挑选哪20个标签作为训练数据?这不是机器学习能够解答的问题,但是却是最重要的问题。业务知识和经验在这儿要发挥关键作用。
2、 决策树基本算法的特征取值必须是离散的,我可以把芒果的大小用“大、中、小”来表示,但是多大算大,多大算小?要么先用聚类的算法算一算,要么还是得依靠业务知识和经验先将连续的属性值(例如:ARPU、DOU)分解成离散的值。
3、 决策树不支持增量计算,每加入一行样本数据,都需要对整棵决策树重新生成,这不太利于营销政策的稳定性。
4、 所有的机器学习都需要在市场环境和营销内容相对稳定的情况下发挥作用,否则,市场环境变了(例如:对手降价了),还用之前的数据生成的规则进行营销,就会有问题。同样,如果今天营销A、明天营销B,除非建立A与B之间的关联关系,否则无法使用A的样本数据来生成B的营销规则。
5、 样本数据的稳定性,用户订购了A是因为他确实想要A,还是因为A有KPI在营业厅被强推的,或者是被某一个没有在机器学习系统中体现的规则(如果想要订B,一定要先订A)。当然随着营销的规范化,我觉得样本数据的质量应该会越来越好。
如果我们解决了上述的问题,我相信决策树算法在营销中还是能够有很好的应用的。关键是:干!
上期回顾:机器学习概念
下期预告:Knn近邻算法。
二、 如何使用决策树算法生成一个决策树
三、 如何使用决策树进行营销
按照上一篇笔记的说法,如果我们现在已经有了训练数据,明确了特征和输出变量,我们就可以用机器学习的算法自动生成一个规则,有了这个规则,有新的数据来的时候,我们就能够通过特征值自动求取输出变量。(如果我已经吃过了10000个芒果,并且记得每个芒果的大小、颜色、硬度、产地等等,也记得每个芒果甜不甜,理论上再给我一个芒果,只要知道它的大小、颜色、硬度、产地,就算不吃我也能知道它甜不甜)。但是具体的规则是如何生成的呢?今天就先学习一下如何使用决策树算法根据训练数据来生成一个规则。
为什么是决策树?因为据说决策树是最容易理解的机器学习算法了,如果决策树我都学不会,后面的就不用学了。
一、 什么是决策树算法
还是先百度百科:“决策树算法是一种逼近离散函数值的方法。它是一种典型的分类方法,首先对数据进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。”
简单来说,决策树就是一系列的if-then-else语句,而决策树算法就是利用训练数据自动生成这些语句的方法。下面我们来看一棵典型的决策树(经常有人问我买什么相机好,顺便一起回答了)。
二、 如何使用决策树算法生成一个决策树
还是那个芒果的例子,假如我们有四个特征:大小、颜色、硬度、产地,每个特征都有一系列的取值,比如大小(大、中、小),颜色(深黄、浅黄、绿色),硬度(硬、软),产地(广东、海南、泰国)。两个输出变量:甜、不甜。有10000条数据如下:
序号 | 大小 | 颜色 | 硬度 | 产地 | 结果 |
1 | 大 | 深黄 | 软 | 广东 | 不甜 |
2 | 中 | 深黄 | 硬 | 广东 | 不甜 |
3 | 中 | 绿色 | 硬 | 泰国 | 甜 |
4 | 小 | 浅黄 | 硬 | 海南 | 甜 |
5 | 大 | 浅黄 | 软 | 广东 | 不甜 |
。。。 | 。。。 | 。。。 | 。。。 | 。。。 | 。。。 |
10000 | 小 | 浅黄 | 硬 | 海南 | 甜 |
信息增益(Information Gain)是用来衡量给定的特征区分训练样例的能力,信息增益高的属性对结果的影响就大。
熵(entropy)是信息增益的一个度量标准,它刻画了指定训练样例集的纯度(purity)。
如果样例的目标属性只有正反两个值,那么指定样例S的熵可以通过以下公式计算:
如果样例的目标属性有c个不同的值,那么样例S相对于c个状态的分类的熵可以计算为:
一个特征A相对样例集合S的信息增益Gain(S,A)的公式为:
简单来说,熵表示一个数据集的无序程度,如果一个数据集,我越难判断其中的数据的目标属性,那么熵值就越高,反之熵值就越低。
而信息增益代表了熵值的降低程度,如果通过一个特征把一个数据集能够分成两个(或者多个)数据集,这两个子数据集的熵的和下降越大,则我们说这个特征在这个数据集上的信息增益越高。
如果一堆芒果我不知道甜不甜,那么这堆芒果的熵值就比较高,但是我分成硬芒果和软芒果之后,如果更容易判断甜不甜,那么硬度这个特征对于芒果的信息增益就很高。
如果还是看不懂上面的公式,也没有关系,我们只需要知道,有一些很厉害的人,发明了一个很厉害的公式,有了这个公式,我就可以知道:使用上面那10000条芒果的数据,我可以利用公式算出来哪一个特征对结果的影响最大。
假如,通过公式计算,我发现,其实产地对芒果甜不甜的影响最大,那我就把产地作为这颗决策树的根节点。然后,我就能够把这10000条数据根据产地分为三份,分别是广东芒果、海南芒果和泰国芒果。然后我继续针对广东芒果,看看剩下的那一个特征对广东芒果甜不甜的影响最大,如果我发现大小对广东芒果甜不甜的影响最大,我再把数据分成大广东芒果、中广东芒果和小广东芒果,如此重复,最终我们就能得到一颗根据芒果的各种特征判断芒果甜不甜的决策树。
何时停止决策树的增长呢?如果在一个子节点下,剩余的任何一个特征对整体熵值下降的影响都很小时,我们认为决策树在这个子节点下就不需要继续增长了。
三、 如何使用决策树进行营销
先重复一下在市场营销的时候,我们会遇到的两个问题:
1、 给定一个用户,我向他营销什么?
2、 给定一个产品,我要向哪些用户进行营销?
针对问题1、给定一个用户,我向他营销什么?假设我有5个可供选择的产品,我倾向于取所有订购了这5个产品的全量用户作为训练数据进行训练,无论这些用户是否被营销了。
假设5个产品分别为A、B、C、D、E,5个产品的全部订购用户有20万人,我挑选了20个标签作为特征。就可以有一个20万行的数据集,这个数据集的前20列是标签的取值,第21列是5个产品中的一个。
使用决策树的算法,我可以计算哪一个标签对用户选择产品的影响最大,并将其作为根节点,然后对根节点的每一个子节点进行重复计算,直至生成一棵决策树。甚至不需要用到全部20个标签,也许算到第5层就能达到一定的决策精度。使用这颗决策树,任意给定一个用户,我如果知道20个标签的取值,我就应该知道应该推荐ABCDE5个产品中的哪一个。
针对问题2、 给定一个产品A,我要向哪些用户进行营销?我倾向于取所有对选定产品A进行过营销的用户数据作为训练数据进行训练,无论是否营销成功。
假设我已经针对A选择了20万客户进行营销,有了营销的结果数据,并且挑选了20个标签作为特征,同样我可以得到一个20万行的数据集,前20列是每一个标签的值,第21列是营销结果,成功还是失败。
采用同样的决策树算法,我们可以找到对营销结果影响最大的那个特征作为根节点,并且生成一棵完整的决策树,后续再挑选用户进行营销的时候,我可以根据这棵决策树决定是否进行营销。
是不是很容易?
等等,我们还有几个问题需要解决?
1、 挑选哪20个标签作为训练数据?这不是机器学习能够解答的问题,但是却是最重要的问题。业务知识和经验在这儿要发挥关键作用。
2、 决策树基本算法的特征取值必须是离散的,我可以把芒果的大小用“大、中、小”来表示,但是多大算大,多大算小?要么先用聚类的算法算一算,要么还是得依靠业务知识和经验先将连续的属性值(例如:ARPU、DOU)分解成离散的值。
3、 决策树不支持增量计算,每加入一行样本数据,都需要对整棵决策树重新生成,这不太利于营销政策的稳定性。
4、 所有的机器学习都需要在市场环境和营销内容相对稳定的情况下发挥作用,否则,市场环境变了(例如:对手降价了),还用之前的数据生成的规则进行营销,就会有问题。同样,如果今天营销A、明天营销B,除非建立A与B之间的关联关系,否则无法使用A的样本数据来生成B的营销规则。
5、 样本数据的稳定性,用户订购了A是因为他确实想要A,还是因为A有KPI在营业厅被强推的,或者是被某一个没有在机器学习系统中体现的规则(如果想要订B,一定要先订A)。当然随着营销的规范化,我觉得样本数据的质量应该会越来越好。
如果我们解决了上述的问题,我相信决策树算法在营销中还是能够有很好的应用的。关键是:干!
上期回顾:机器学习概念
下期预告:Knn近邻算法。
相关文章推荐
- 关于机器学习在线预测的任务学习笔记
- 关于机器学习的学习笔记(一):机器学习概念
- 关于机器学习的学习笔记(三):k近邻算法
- 机器学习入门学习笔记:(3.1)决策树算法
- 关于机器学习的学习笔记(四):朴素贝叶斯算法
- 学习笔记:关于" No ResultSet was produced"
- 计算机学习笔记2:关于微程序的一点己见
- 软件测试学习笔记--(关于排错)
- java学习笔记,关于java的一些基础知识,适用于初学者,第一节
- Spring学习笔记:关于Interceptor
- 关于SQL的学习笔记
- 学习笔记 关于refactorying
- 关于C++标准库泛型算法merge的学习笔记
- 关于朴素贝叶斯分类的学习笔记
- 关于c++的学习情况,不再更新了,因为找到了更好的笔记记录工具
- 关于用jsp实现http认证安全登陆的学习笔记。(正在原创ing)
- 摘抄笔记 关于学习
- 关于ccna的一些学习笔记
- 关于JDBC学习笔记(一)
- C++ Primer 学习笔记关于练习题6.12