机器学习(九)决策树,随机森林
机器学习(九)决策树,随机森林
文章目录
- 机器学习(九)决策树,随机森林
- 一.决策树
- 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))
关于这部分,详细见这个文章:决策树,随机森林补充(二)第四部分
机器学习(九)决策树,随机森林相关推荐
- 金融风控机器学习第三十一天---拜师课堂 机器学习算法--决策树 随机森林
ID3 c4.5的核心是熵 ID3 c4.5 cart 过拟合解决一般 用 剪枝 或者 随机森林 随机森林代码: #!/usr/bin/python # -*- coding:utf-8 -*-imp ...
- 机器学习——决策树+随机森林
目录 决策树 认识决策树 决策树的生成 信息的单位--比特 信息熵 决策树的划分依据之一--信息增益 例题--银行贷款分析 决策树的其他分类依据 案例--泰坦尼克号乘客生存分类 决策树的结构.本地保存 ...
- 机器学习实战之分类算法(K-近邻/朴素贝叶斯/决策树/随机森林)
机器学习分类算法 1. 机器学习算法简介 1.1 按照学习方式分类 1.2 区别 1.3 关于监督学习中的分类与回归区别 1.4 机器学习开发流程 2. 数据集介绍与划分 2.1 sklearn数据集 ...
- 机器学习-Sklearn-02(随机森林)
机器学习-Sklearn-02(随机森林) 学习2 随机森林在sklearn中的实现 1 概述 1.1 集成算法概述 集成学习(ensemble learning)是时下非常流行的机器学习算法,它本身 ...
- 决策树随机森林GBDTXGBoost学习笔记以及代码实现
文章目录 1. 引入 1.1 决策树 1.2 随机森林 1.3 GBDT(Gradient Boosting Decision Tree)梯度提升决策树 1.4 XGBoost(eXtreme Gra ...
- 【机器学习】P25 随机森林算法(2) 实现 “波士顿房价” 预测
随机森林算法 Random Forest Algorithm 随机森林算法 随机森林算法实现波士顿房价预测 随机森林算法 随机森林(Random Forest)算法 是一种 集成学习(Ensemble ...
- python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码
原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...
- 机器学习sklearn实战-----随机森林调参乳腺癌分类预测
机器学习sklearn随机森林乳腺癌分类预测 机器学习中调参的基本思想: 1)非常正确的调参思路和方法 2)对模型评估指标有深入理解 3)对数据的感觉和经验 文章目录 机器学习sklearn随机森林乳 ...
- 机器学习算法:随机森林
在经典机器学习中,随机森林一直是一种灵丹妙药类型的模型. 该模型很棒有几个原因: 与许多其他算法相比,需要较少的数据预处理,因此易于设置 充当分类或回归模型 不太容易过度拟合 可以轻松计算特征重要性 ...
- 机器学习系列|基于随机森林的生存分析模型-R实战
机器学习系列|基于随机森林的生存分析模型-R实战 随机生存森林 随机生存森林通过训练大量生存树,以表决的形式,从个体树之中加权选举出最终的预测结果. 构建随机生存森林的一般流程为: Ⅰ. 模型通过&q ...
最新文章
- com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
- [第11天]mySQL简单介绍
- RJ-45接口连接线、MDI/MDIX接口
- C++中的虚继承 重载隐藏覆盖的讨论
- what does packaging mean in pom.xml
- 大根堆的删除c语言,大根堆和小根堆的C语言实现
- python fortran混编 ctypes_关于python调用fortran编译的dll的问题
- python两个等号和一个等号_Python-一个变量等于另一个变量
- [Angularjs]视图和路由(一)
- 网络安全之***手法计中计
- Amadeus Pro for Mac(多轨音频编辑器)
- 如何在html中写json格式数据类型,html中如何美化展示json格式数据
- [Ubuntu]安装微信/QQ/TIM的简便方法
- 《机器学习实战:基于Scikit--Learn、Keras和TensorFlow(第2版)》学习笔记——前言
- 计算机基础知识图谱,基于深度学习的大学计算机基础知识图谱构建方法与流程...
- OpenWRT软路由系统安装与优化
- 2022最受欢迎开源免费CMS建站系统排行榜
- MATLAB 2016b--神经网络工具箱中BP网络的实现
- Windows常用操作—热键(快捷键)
- cmd脚本win10使用schtasks命令实现定时任务