机器学习(九)决策树,随机森林

文章目录

  • 机器学习(九)决策树,随机森林
    • 一.决策树
      • 1.1 如何理解决策树
      • 1.2 信息论的一些基础
      • 1.3 信息论与决策树的关系
        • 1.3.1 信息增益
      • 1.4 常见决策树的算法
      • 1.5 sklearn决策树
        • 1.5.1 使用案例
      • 1.6 决策树的优缺点和改进
    • 二.随机森林
    • 2.1 什么是随机森林
    • 2.2 如何构建每一棵树?
    • 2.3 随机森林的使用
    • 2.4 随机森林的优点
    • 2.5 什么情况下可以使用随机森林?

一.决策树

1.1 如何理解决策树

决策树,原理并不难,其实就是你根据现实情况做出最终决定的过程。我们举一个生活中通俗的例子。比如,我们都经历过各式各样的校园生活,考了无数次的试,那么,如何判断一个学生是不是好学生呢?

某个学校就有这样一些指标如下:

根据这个表格,大体就可以下面这个逻辑树:

这个逻辑树,就是决策树。

决策树的建立,往往是以目标为导向,就如上面这个例子,我们根本目的就是看一个学生是不是好学生,是有目标值的,因此,决策树属于监督学习的一种。

决策树具有如下特点:

  • 决策树的每个分支代表一个测试输出,每个叶结点代表一种类别。
  • 决策树学习是以实例为基础的归纳学习。
  • 决策树学习采用的是自顶向下的递归方法,其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类。

1.2 信息论的一些基础

为什么会扯到信息论基础呢?因为决策树,和信息论有一定的关联我们举一个球迷们很感兴趣的例子:

以上这个图是2018年俄罗斯世界杯的比赛流程图,结果我们都知道了。

如果我们把参赛的32个球队,按照1~32编号,我们假设这样一个情形:一个从来都不关心任何足球信息的人,你让他去猜是哪个球队夺得了俄罗斯世界杯的冠军。换你是哪个完全不懂球的人,如何尽快猜中呢?

学习计算机的我们,在学习数据结构的时候,肯定知道一个词:二分法。我们大可以把这32个球队一分为二。1到16号一组,17到32为一组,然后不停的缩小范围,就可以很快查到。

学习二分查找的时候,还有一个概念会引出:二分决策树。而这个树最高为logn的高度,也就是说,32支球队组成的二分查找树,高度最多也就是5。也就是说,这个完全不懂球的人,至少猜五次,就可以猜到谁是冠军。

对应到信息论当中,32个球队,只需要5比特的空间就可以存下。根据信息论的创始人香农的观点。“谁是冠军“的信息量肯定要比5bit小。

在现实当中,各个球队实力不尽相同,因此在比赛的时候,肯定有不同的获胜概率。只有在各个球队夺冠的概率都相等(都是1/32)的情况下,才会取到5。我们假设,这32个球队夺冠的概率分别是:p1, p2……p32, 那么球队夺冠的信息量为:

​ H = -(p1logp1 + p2logp2 + … + p32log32)

在信息论中,H称为”信息熵“,单位是:bit

根据这个例子,我们便可以大致推出求信息熵的公式:

当X当中的所有样本,取相同的概率时,H(X)取最大值

1.3 信息论与决策树的关系

说了这么多,那么,信息论与决策树到底有啥关联呢?

关系就在于决策树上这个判断结点的选择上。以最开始的那个判断是否为好学生的例子为例,决策树我可以按照上面那个画。但是我换个方案画,我画成如下这个呢?

当然了,这个例子当中,样本不多,两种判别方式似乎都不错。但是如果样本很多呢?你如何选择这个判断结点就需要一个指标。

这个时候,结合信息论,我们就引出了另一个概念:信息增益。

1.3.1 信息增益

在了解信息增益之前,最好先了解一下什么是条件熵:决策树、随机森林补充(二)第一部分

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:

其含义是:得知特征X的信息而使得类Y的信息的不确定性减少的程度。说白了,反映的是:重要程度。

我们再举一个例子:银行贷款,银行放贷之前,肯定要对你做背景调查,你啥都没有,那么大概率是不会给你放贷的。现在,我们得到了如下的数据

那么年龄,是否有工作,是否有房子,信誉情况,哪个比较重要?

我们套用信息增益的公式:

首先,你得先求出信息熵H(D):

则在本例子当中,我们就应该”结果为导向“,从是否放贷这个结果,来求信息熵

H(D) = -[(9/15)* log(9/15) + (6/15)*log(6/15)] = 0.971 (根据表中结果,供15个数据,9个同意放贷,6个不同意放贷)

然后,我们求条件信息熵:


值得注意的是,上面这两个式子的信息熵、条件信息熵表达式,在一些资料里面成为经验熵、经验条件信息熵。这个表达式也有一个推导过程:详见这个:决策树,随机森林补充(一)第二部分

首先,我们把A取为年龄属性。年龄分为三个:青年,中年,老年。其中青年占5/15,中年占5/15, 老年占5/15

则 H(D|A) = -[(5/15)*H(D1) + (5/15)* H(D2) + (5/15)* H(D3)],其中,D1代表青年,D2代表中年,D3代表老年

在青年群体当中,有两个样本是同意放贷的,三个不同意放贷,于是: H(D1) = -[(2/5)*log(2/5) + (3/5)*log(3/5)]

在中年群体当中,有三个样本是同意放贷的,两个不同意放贷 ,于是:H(D2) = -[(3/5)*log(3/5) + (2/5)*log(2/5)]

在老年群体当中,有四个样本是同意放贷的,1个不同意放贷,于是:H(D3) = -[(4/5)*log(4/5) + (1/5) * log(1/5)]

则信息增益:

g(D, A=“年龄”) = H(D) - H(D|A=“年龄”) = 0.971 - (0.0974 + 0.0974 + 0.0724) = 0.7038

同理,可以得出:

g(D, A=“有工作”) = 0.324;g(D, A=“有房子”) = 0.420;g(D, A=”信贷情况“) = 0.363

因此在做决策的时候,按照:(年龄>有房子>信贷情况>有工作)的顺序,来做决策,这个并不是简单的二选一,二是不论你处于什么情况,你都有概率获得银行贷款。因此,决策树,是一个比较复杂的综合考量,而不是像之前那个判断是不是好学生那个案例那么简单。

1.4 常见决策树的算法

其实,除了1.3那个方式,还有许多其他的方法。这个我们目前只知道一个大概即可,先不细究底层:

  • ID3:信息增益 最大的准则(也就是1.3所讲的内容)
  • C4.5:信息增益比 最大的准则
  • CART
    回归树: 平方误差 最小
    分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的原则

具体Gini系数,增益比是啥,见:决策树,随机森林补充(一)第三部分

1.5 sklearn决策树

在使用sklearn的时候,我们其实并不需要这么多底层的东西,sklearn给我们提供了相关的api:

class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None) #决策树分类器
"""
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
max_depth:树的深度大小
random_state:随机数种子返回值:
decision_path:返回决策树的路径
"""

1.5.1 使用案例

现在我们有一个数据,里面记录了泰坦尼克号上幸存乘客的信息,有如下字段:

row    pclass   survived   name    age    embarked    home.dest    room    ticket    boat    sex

我们只取这几个字段进行分析:存活(survived),乘坐班(pclass),年龄(age),性别(sex)。乘坐班是指电影里面说的一等舱,二等舱,三等舱(1,2,3),是社会经济阶层的代表。其中age数据存在缺失。

from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pandas as pddef decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("./titanic.txt")# 处理数据,找出特征值和目标值x = titan[['pclass', 'age', 'sex']]y = titan['survived']# 缺失值处理,将age当中缺失的数据用年龄平均值补充,并且就地将x进行改动x['age'].fillna(x['age'].mean(), inplace=True)#print(x)"""此时的x,就转变成为了只有三个字段:pclass, age, sex的一组特征值"""# 分割数据集到训练集合测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 进行处理(特征工程)特征-》类别-》one_hot编码,即:特征抽取"""特征里面,即x,y变量当中,含有pclass,age,sex等类别。这种特征值当中含有类别的情况,我们就要用到one-hot编码one-hot编码是专门用来处理离散的,非连续的数据。既然要用one-hot编码,那么久应当想到字典的特征提取。且在此之前一定要处理nan"""dict = DictVectorizer(sparse=False)# 一个表格,把一行由一个关键字作为key,剩下的作为value,转换成一个字典。然后进行特征抽取x_train = dict.fit_transform(x_train.to_dict(orient="records"))x_test = dict.transform(x_test.to_dict(orient="records"))#print(x_train)"""x_train在经过转换之后,变成了如此的样式['age','pclass = 1st','pclass = 2nd' ,'pclass=3rd','sex = female' ,'sex=male']这样的矩阵,也就是One-hot编码"""#用决策树进行预测dec = DecisionTreeClassifier()dec.fit(x_train, y_train)# 预测准确率print("预测的准确率:", dec.score(x_test, y_test))# 导出决策树的结构export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])return Noneif __name__ == "__main__":decision()

其实,通过导出的决策树,我们可以发现,真正运用的时候,决策树可能会非常庞大。这会大大影响决策效率。

可能有些东西或者指标并不是我们所需要的。这时就涉及如何给决策树剪枝的问题。(把不用的枝给减掉)

1.6 决策树的优缺点和改进

  • 优点:

    • 简单的理解和解释,树木可视化。
    • 需要很少的数据准备,其他技术通常需要数据归一化,
  • 缺点:

    • 决策树学习者可以创建不能很好地推广数据的过于复杂的树, 这被称为过拟合。
    • 决策树可能不稳定,因为数据的小变化可能会导致完全不同的树被生成
  • 改进:减枝算法、随机森林
    关于剪枝算法,可一看看这个文章:决策树,随机森林补充(二)第二部分

二.随机森林

2.1 什么是随机森林

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。例如, 如果你训练了5个树, 其中有4个树的结果是True, 1个数的结果是False, 那么最终结果会是True.

2.2 如何构建每一棵树?

上面已经说了,随机森林实质上是多个决策树,那么这几个决策树是怎么构建的?

遵循下述算法:我们假设,有N个样本,这当中有M个特征数目

  • 首先,输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
  • 从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

关于bootstrap和bagging策略,见这个文章:决策树,随机森林第三部分

Q1:为什么要随机抽样训练集?  
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的

Q2:为什么要有放回地抽样?
  如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,如此一来,说每棵树训练出来都是有很大的差异的;那么最后结果该怎么取呢?就好比说,有人犯罪了,现场的目击者对于罪犯的描述彼此差异巨大,那么你就没法准确把握罪犯的外貌了。

2.3 随机森林的使用

sklearn当中,为我们提供了随机森林的API

#随机森林分类器
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’,max_depth=None,bootstrap=True, random_state=None)"""
n_estimators:integer,optional(default = 10) 森林里的决策树数量
criteria:string,可选(default =“gini”)分割特征的测量方法
max_depth:integer或None,可选(默认=无)树的最大深度
bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
"""

举例:以上述那个泰坦尼克号的意思

from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pandas as pddef decision():"""决策树对泰坦尼克号进行预测生死:return: None"""# 获取数据titan = pd.read_csv("./titanic.txt")# 处理数据,找出特征值和目标值x = titan[['pclass', 'age', 'sex']]y = titan['survived']# 缺失值处理,将age当中缺失的数据用年龄平均值补充,并且就地将x进行改动x['age'].fillna(x['age'].mean(), inplace=True)#print(x)"""此时的x,就转变成为了只有三个字段:pclass, age, sex的一组特征值"""# 分割数据集到训练集合测试集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)# 进行处理(特征工程)特征-》类别-》one_hot编码,即:特征抽取"""特征里面,即x,y变量当中,含有pclass,age,sex等类别。这种特征值当中含有类别的情况,我们就要用到one-hot编码one-hot编码是专门用来处理离散的,非连续的数据。既然要用one-hot编码,那么久应当想到字典的特征提取。且在此之前一定要处理nan"""dict = DictVectorizer(sparse=False)# 一个表格,把一行由一个关键字作为key,剩下的作为value,转换成一个字典。然后进行特征抽取x_train = dict.fit_transform(x_train.to_dict(orient="records"))x_test = dict.transform(x_test.to_dict(orient="records"))#print(x_train)"""x_train在经过转换之后,变成了如此的样式['age','pclass = 1st','pclass = 2nd' ,'pclass=3rd','sex = female' ,'sex=male']这样的矩阵,也就是One-hot编码"""# 随机森林进行预测 (超参数调优)rf = RandomForestClassifier()param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}# 网格搜索与交叉验证gc = GridSearchCV(rf, param_grid=param, cv=2)gc.fit(x_train, y_train)print("准确率:", gc.score(x_test, y_test))print("查看选择的参数模型:", gc.best_params_)return Noneif __name__ == "__main__":decision()

2.4 随机森林的优点

随机森林有许多优点,包括:

  • 在当前所有算法中,具有极好的准确率
  • 能够有效地运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 对于缺省值问题也能够获得很好得结果

2.5 什么情况下可以使用随机森林?

除了应对决策树的过拟合问题,还可以用在如下情况:

  • 计算样本间的相似度
  • 计算特征重要程度
  • 异常检测(涉及到:孤立森林(Isolation Forest))
    关于这部分,详细见这个文章:决策树,随机森林补充(二)第四部分

机器学习(九)决策树,随机森林相关推荐

  1. 金融风控机器学习第三十一天---拜师课堂 机器学习算法--决策树 随机森林

    ID3 c4.5的核心是熵 ID3 c4.5 cart 过拟合解决一般 用 剪枝 或者 随机森林 随机森林代码: #!/usr/bin/python # -*- coding:utf-8 -*-imp ...

  2. 机器学习——决策树+随机森林

    目录 决策树 认识决策树 决策树的生成 信息的单位--比特 信息熵 决策树的划分依据之一--信息增益 例题--银行贷款分析 决策树的其他分类依据 案例--泰坦尼克号乘客生存分类 决策树的结构.本地保存 ...

  3. 机器学习实战之分类算法(K-近邻/朴素贝叶斯/决策树/随机森林)

    机器学习分类算法 1. 机器学习算法简介 1.1 按照学习方式分类 1.2 区别 1.3 关于监督学习中的分类与回归区别 1.4 机器学习开发流程 2. 数据集介绍与划分 2.1 sklearn数据集 ...

  4. 机器学习-Sklearn-02(随机森林)

    机器学习-Sklearn-02(随机森林) 学习2 随机森林在sklearn中的实现 1 概述 1.1 集成算法概述 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身 ...

  5. 决策树随机森林GBDTXGBoost学习笔记以及代码实现

    文章目录 1. 引入 1.1 决策树 1.2 随机森林 1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树 1.4 XGBoost(eXtreme Gra ...

  6. 【机器学习】P25 随机森林算法(2) 实现 “波士顿房价” 预测

    随机森林算法 Random Forest Algorithm 随机森林算法 随机森林算法实现波士顿房价预测 随机森林算法 随机森林(Random Forest)算法 是一种 集成学习(Ensemble ...

  7. python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码

    原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...

  8. 机器学习sklearn实战-----随机森林调参乳腺癌分类预测

    机器学习sklearn随机森林乳腺癌分类预测 机器学习中调参的基本思想: 1)非常正确的调参思路和方法 2)对模型评估指标有深入理解 3)对数据的感觉和经验 文章目录 机器学习sklearn随机森林乳 ...

  9. 机器学习算法:随机森林

    在经典机器学习中,随机森林一直是一种灵丹妙药类型的模型. 该模型很棒有几个原因: 与许多其他算法相比,需要较少的数据预处理,因此易于设置 充当分类或回归模型 不太容易过度拟合 可以轻松计算特征重要性 ...

  10. 机器学习系列|基于随机森林的生存分析模型-R实战

    机器学习系列|基于随机森林的生存分析模型-R实战 随机生存森林 随机生存森林通过训练大量生存树,以表决的形式,从个体树之中加权选举出最终的预测结果. 构建随机生存森林的一般流程为: Ⅰ. 模型通过&q ...

最新文章

  1. com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
  2. [第11天]mySQL简单介绍
  3. RJ-45接口连接线、MDI/MDIX接口
  4. C++中的虚继承 重载隐藏覆盖的讨论
  5. what does packaging mean in pom.xml
  6. 大根堆的删除c语言,大根堆和小根堆的C语言实现
  7. python fortran混编 ctypes_关于python调用fortran编译的dll的问题
  8. python两个等号和一个等号_Python-一个变量等于另一个变量
  9. [Angularjs]视图和路由(一)
  10. 网络安全之***手法计中计
  11. Amadeus Pro for Mac(多轨音频编辑器)
  12. 如何在html中写json格式数据类型,html中如何美化展示json格式数据
  13. [Ubuntu]安装微信/QQ/TIM的简便方法
  14. 《机器学习实战:基于Scikit--Learn、Keras和TensorFlow(第2版)》学习笔记——前言
  15. 计算机基础知识图谱,基于深度学习的大学计算机基础知识图谱构建方法与流程...
  16. OpenWRT软路由系统安装与优化
  17. 2022最受欢迎开源免费CMS建站系统排行榜
  18. MATLAB 2016b--神经网络工具箱中BP网络的实现
  19. Windows常用操作—热键(快捷键)
  20. cmd脚本win10使用schtasks命令实现定时任务

热门文章

  1. echarts(一)之地图连线动效
  2. Fedora 10安装Compiz-fusion 3D效果方法
  3. 初学JavaScript之颜色小游戏
  4. 微信小程序video默认不播放且显示视频第一帧
  5. 云桌面场景化升级新作,锐捷网络发布全新远程办公“U空间”
  6. 苹果系统手机调用java线程出错_Java线程面试题
  7. 快牙网传——轻松传文件
  8. 订阅内容解码失败(非base64码)_【每日礼包】超杀默示录 密文解码礼包大全
  9. iOS更新之DFU模式和恢复模式
  10. 《工程伦理与学术道德》之《导论》