监督学习-3-决策树算法

决策树算法同样也是我们在机器学习中常用的算法之一,决策树算法是一种常用的分类算法,利用已有数据进行预测,例如我们要预测某位用户在你的应用商店中会下载那一个应用,在我们知道用户的一部分数据的情况下,我们可以根据其他用户的下载习惯,应用决策树的方法来预测用户的下载可能

在刚才的例子中决策树的具体做法是这样的,首先假设我们知道用户的类似性别,工作,爱好…之类的信息,决策树的做法是寻找其他在应用商店中拥有类似的信息的客户的下载偏好,然后将其推荐到这个用户的界面,决策树的大致做法就是这样,具体的我们向下看


在这里插入图片描述这就是上面的例子,左面是我们已经知道的数据,我们根据已经知道的数据画出决策树,然后根据决策树,如果需要进行预测的用户的职业是学生,我们会推荐他Pokemon GO,如果正在工作那么我们判断是男性或者女性,男性我们会推荐Snapchat,女性我们会推荐WhatsAPP,那么我们的任务就是找出如何让机器测量出这两个特征,并且让机器知道,让机器先用职业分类,然后用性别分类

上面我们说明了多分类的情况,下面我们再举一个决策树应用于二分类的情况下的情况,我们依然使用上一篇中的的学校录取的情况
在这里插入图片描述(其中蓝色的是已经录取,红色未录取)在我们在应用决策树预测某学生是否会被录取时,我们可以通过辨别测试分数是否大于?–若小于5平时分是否大于7?–若大于5平时分是否大于2?

通过这样的流程我们可以大致预测某位需要我们预测的同学是否会被录取,然而暂时我们建立的这个决策树只有两层,在分析复杂的实际问题的深度会很高,但是基本原理大同小异

在开始建立决策树之前,我们首先要对决策树分类的属性进行评分,比如最一开始的app下载预测,我们先对职业建立,然后对性别进行建立,使得得到了较好的效果,但是我们是如何决定哪个优先进行分类的呢?在上面的例子中如果们优先对性别分类然后再对职业分类,最终得到的效果可能就相对的差强人意,在这里要引入的是信息熵

熵值本来是热力学里面的术语,熵在信息论被引用为衡量信息的复杂度,还是应用上面app下载的例子,我们计算未使用算法分类时的熵值,这里信息的复杂程度是怎么计算的呢?

我们先浏览这个数据表,总共有六项,其中下载了Pokemon GO的有三个用户,下载了WhatsAPP的有两名用户,下载了Snapchat的有一名用户那么我们的计算共公式为
P(Pokemon GO) 3 6 \frac{3}{6} × \times P(WhatsAPP) 2 6 \frac{2}{6} P(Snapchat) × \times 1 6 \frac{1}{6} \thickapprox 0.00077160493
简单点说就是在这个整体中的每一个概率相乘就是当前熵值,如果只有一种数据就是1,如果数据很混乱数值就会很小

但是这样的计算方法有个很大的弊端,这仅仅是六条数据,数值就已经很小了,如果是几万条数据那就会是一个无比小的数字,然而大致方法就是这样,但是我们要改变我们的计算方法,新的计算方法有这几个要求,首先原理必须相同,结果能衡量信息的混乱程度,结果数字不能太小或者过大,如果可以最好能用加法来代替乘法

可能你已经想到了,对数可以很好的帮我们解决上述问题,因为我们知道
log(a × \times b) = log(a) + log(b)
由于我们基于信息理论,我们这里默认以2为底取对数
我们再看回头看我们需要解决的问

  • 结果不大
  • 原理相同
  • 是加法运算

我们来验证一下,如果使用对数来计算熵值的情况(默认以2为底)
3 6 \frac{3}{6} log( 3 6 \frac{3}{6} )+ 2 6 \frac{2}{6} log( 2 6 \frac{2}{6} )+ 1 6 \frac{1}{6} log( 1 6 \frac{1}{6} ) \thickapprox -1.46

这里还有一点小问题就是结果是负数,我们不喜欢负数所以我们对所有的值取负
- 3 6 \frac{3}{6} log( 3 6 \frac{3}{6} )- 2 6 \frac{2}{6} log( 2 6 \frac{2}{6} )- 1 6 \frac{1}{6} log( 1 6 \frac{1}{6} ) \thickapprox 1.46
要注意的一点,log(1)=0 所以这里的值越小越好

这就是计算数据信息熵的方法,我们的决策树的目的就是要是我们经过决策树分类后的数据要使得最大程度降低信息熵

利用我们现在学的内容就可以解决刚才下载app的分类的时候是先分类工作还是先分类性别的问题

假设我们先分类性别,那么我们分类后的信息熵值就是
女性:Pokemon GO WhatsAPP WhatsAPP
男性:Pokemon GO Pokemon GO Snapchat
那么我们按照性别分类后的平均信息熵就是

1 2 \frac{1}{2} [(- 1 3 \frac{1}{3} log( 1 3 \frac{1}{3} )- 2 3 \frac{2}{3} log( 2 3 \frac{2}{3} ))+(- 1 3 \frac{1}{3} log( 1 3 \frac{1}{3} )- 2 3 \frac{2}{3} log( 2 3 \frac{2}{3} ))]=0.92
平均信息熵值从1.46降到0.92那么信息熵增就是0.54

那么按照工作分的情况就是
工作:WhatsAPP WhatsAPP Snapchat
学生:Pokemon GO Pokemon GO Pokemon GO
可以看出学生组的熵值是0
就是
1 2 \frac{1}{2} [0- 1 3 \frac{1}{3} log( 1 3 \frac{1}{3} )- 2 3 \frac{2}{3} log( 2 3 \frac{2}{3} )]=0.46
平均信息熵增为1

在选择哪以项进行分类的时候,我们采用的是最大化信息熵增的方式,来进行分类

决策树的分类原理就是这样,更深的决策树也是同样的原理

但是就目前我们所说,决策树还有很大的缺点,我们举的例子是只有三个两个属性=>性别 和=>工作 当我们有很多属性的时候,我们根据每一条属性进行建立分支,那么我们很容易到最后每一个分支只有一个或者两个数据,这说明了决策树的最大的问题之一,很容易过拟合,那么我们要如何解决这些问题呢?

一般的做法,当我们的数据拥有很多的属性,我们会随机的抽取其中的几栏进行建立决策树,并且多次抽取,建立多个决策树,当一个未知数据进入算法时,做法是分别经过这些决策树,结果不尽相同,我们根据服从多数的准则选择输出最终结果

这种方法叫做随机森林
在后面的集成方法中也会提到

说到了这里,想要从头去实现这个算法可能还是一个相当复杂的过程

然而sklearn已经为我们写好了,我们只需要会调用和放置参数就可以了
惯例先放官方文档=>DecisionTreeClassifier
然后说几个常用的超参数

  • max_depth:树中的最大层级数量。
  • min_samples_leaf:叶子允许的最低样本数量。
  • min_samples_split:拆分内部节点所需的最低样本数量。
  • max_features:寻找最佳拆分方法时要考虑的特征数量。

树中的最大层级数量
决策树的层数,需要注意的是当我们有k个层时,叶子总数是 2 k 2^k

叶子允许的最低样本数量
在分裂节点时,很有可能一片叶子上有 99 个样本,而另一片叶子上只有 1 个样本。这将使我们陷入困境,并造成资源和时间的浪费。如果想避免这种问题,我们可以设置每片叶子允许的最小样本数,这个数字可以被指定为一个整数,也可以是一个浮点数。如果它是整数,它将表示这片叶子上的最小样本数。如果它是个浮点数,它将被视作每片叶子上的最小样本比例。比如,0.1 或 10% 表示如果一片叶子上的样本数量小于该节点中样本数量的 10%,这种分裂将不被允许。

拆分内部节点所需的最低样本数量
这个参数与每片叶子上的最小样本树相同,只不过是应用在节点的分裂当中

寻找最佳拆分方法时要考虑的特征数量
有时,我们会遇到特征数量过于庞大,而无法建立决策树的情况。在这种状况下,对于每一个分裂,我们都需要检查整个数据集中的每一个特征。这种过程极为繁琐。而解决方案之一是限制每个分裂中查找的特征数。如果这个数字足够庞大,我们很有可能在查找的特征中找到良好特征(尽管也许并不是完美特征)。然而,如果这个数字小于特征数,这将极大加快我们的计算速度。

最后举一个实际应用的例子

# 导入决策树
from sklearn.tree import DecisionTreeClassifier
# 导入评分
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# 读取数据
data = np.asarray(pd.read_csv('data.csv', header=None))
# 拆分数据
X = data[:,0:2]
y = data[:,2]

# 建立一个模型,其中最大深度为9,叶子允许的最低样本数量为4
model = DecisionTreeClassifier(max_depth=9,min_samples_leaf=4)

# 训练模型
model.fit(X,y)

# 进行预测
y_pred = model.predict(X)

# 对模型评分
acc = accuracy_score(y_pred,y)

猜你喜欢

转载自blog.csdn.net/qq_41249913/article/details/82831371