本文探究一些关于随机森林细节的东西

一:随机森林效果比单个决策树要好的原因是?
百家言胜过一言堂

在bagging中,多个分类器的随机森林为什么要比单个基本分类器要好呢?

我们从数学的角度来简单分析下:
假设我们有单独的一棵树,其正确率是80%(错误率是ε=0.2),我们现在要建立一片森林,假如要建立25棵树,一般在bagging下,表决的结果是根据多棵树的平均(回归问题)或者多数(分类问题)来决定的。

分类问题,根据多数原则来。
那么在随机森林下一个样本倍分错的概率是:

其值约等于0.000369因此,在随机森林的情况下,这个样本倍分错的概率小多了啊。
代码计算如下:

import numpy as np
from scipy.special import combres = np.array([(comb(25, i)) * (0.2 ** i) * ((1-0.2) ** (25-i)) for i in range(13, 26)]).sum()
print(res)

二:random_state的使用
上文我们学习了n_estimators的使用。本文我们学习random_state的使用
在决策树中,自带随机属性,为了防止过拟合,碰运气式的尝试,节点特征分裂的时候,会随机选择某个特征进行分裂,因此造成决策树的随机性,是由random_state来控制的。
一个random_state值控制一棵树。

在随机森林中,也是带有类似的随机性,用法和决策树类似,但是随机森林中,random_state值控制的是生成森林的模式,不是森林中所有的树都是一个样子,每棵树的模式可能是不同的。
看看下面的实例代码就可以知道。

1:第一步,加载数据
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split, cross_val_score
import matplotlib.pyplot as plt# 分类问题举例,加载自带的红酒数据集
wine = load_wine()  # 178个数据,13个属性,三个分类种类。
print(wine.data.shape)
print(wine.target.shape)
print(wine.target_names)  # 所有类别标签地名称
print(wine.feature_names)  # 所有特征属性的名称# 把红酒数据进行切分,切分成训练集和测试集合,切分比例一般是7:3
data_train, data_test, target_train, target_test = train_test_split(wine.data, wine.target, test_size=0.3)
print(data_train.shape)
print(target_train.shape)
print(data_test.shape)
print(target_test.shape)

2:第二步,在相同的数据集的情况下多次运行某个具有random_state的随机森林

scores_clf = []
scores_rfc = []
for i in range(1, 11):clf = DecisionTreeClassifier(criterion='gini', random_state=20)score_clf = cross_val_score(clf, wine.data, wine.target, cv=10).mean()scores_clf.append(score_clf)rfc = RandomForestClassifier(criterion='gini', n_estimators=10, random_state=20)score_tfc = cross_val_score(rfc, wine.data, wine.target, cv=10).mean()scores_rfc.append(score_tfc)# 画图画出来展示下
plt.plot(range(1, 11), scores_clf, label="DecisionTree")
plt.plot(range(1, 11), scores_rfc, label="RandomForest")
plt.legend()  # 显示图例
plt.show()

图像如下:

发现在十次循环中(指定了random_state后),决策树和随机森林的值在相同的数据集情况下表现分数都是固定的,不再跟上一篇博文(没有指定random_state后)那样具有很大随机性了。

你可能会问,整个森林中,每棵树到底是不是一样的呢?答案是不一样的。
为了进一步探索,我们看看一颗随机数的一些细节。在指定random_state的情况下。

# 先实例化一个随机森林
rfc = RandomForestClassifier(criterion='gini', random_state=10, n_estimators=10)
rfc = rfc.fit(data_train, target_train)
score = rfc.score(data_test, target_test)
print('Random Forest Score:{}'.format(score))  # 一般性情况下,会比决策树大一些,或者相等.
print(rfc.estimators_)  # 打印所有的DecisionTreeClassifier的实例
for i in range(len(rfc.estimators_)):print("第{}颗树的random_state是{}.".format(i+1, rfc.estimators_[i].random_state))

打印如下:

从这里我们可以发现哈,每个树自己的random_state都是不一样的,其他参数都是一样的。
所以造成了每个树自身的结构是不一样的。

且上述代码反复执行,每棵基分类器也是不变的,可是去掉random_state指定后,就会发生随机地改变。

也就是指定了某个random_state值固定后,森林中每个树的random_state也就是定了,也就是整个森林的模式就是定了的,但是每棵树是不一致的。

用袋装法进行集成时,基分类器应当是相互独立的,是不相同的。且随机性越强,袋装法的效果也是越来越好。

三:bootstarp & oob_score
除了上述的随机性控制参数外, 还有其他可以学习的参数。

要让基分类器进来不一样,首先想到的就是使用不同的训练集来进行训练,袋装法是通过有放回的抽样来形成不同的训练数据。bootstarp参数就是用来控制抽样技术的参数。具体的细节我们再学习随机森林的时候学习过了,这里不展开。

Bootstarp参数就是指的是,有放回的抽样的随机抽样,这个参数不会被我们设置为FALSE。

OOB就是out of bag的意思,袋外的样本,就是在随机抽样过程中会有计算出来大概37%的概率会被遗漏,这部分数据就可以拿来被用作测试集。
如果发生了一些情况下,所有的样本都是被抽到过,没有掉落在袋外的,那么久没有测试集了,这时候需要继续使用袋外的样本做测试集,那么需要实例化时候,就将oob_score这个参数调整为TRUE,训练完毕后,我们可以通过随机森林的另外个属性 oob_score_来查看袋外样本的测试结果。

# 先实例化一个随机森林
rfc = RandomForestClassifier(criterion='gini', n_estimators=10, oob_score=True, bootstrap=True)
rfc = rfc.fit(data_train, target_train)  # 直接使用原始的训练借口测试,
print('Random Forest OOB Score:{}'.format(rfc.oob_score_))  # oob_score=True表示使用袋外数据做测试,这里可以直接查看袋外数据的测试结果

四:重要的属性和接口
rfc.estimators_:可以查看所有的基分类器的形式。
oob_socre:利用袋外数据直接做测试结果的分析。
除此之外呢,feature_importances_,查看特征的重要性。还有一些常用的接口。

# 先实例化一个随机森林
rfc = RandomForestClassifier(criterion='gini', n_estimators=10, bootstrap=True)
rfc = rfc.fit(data_train, target_train)  # 直接使用原始的训练借口测试,
score = rfc.score(data_test, target_test)
print('Random Forest OOB Score:{}'.format(score))  # 测试集的测试结果
print(*zip(wine.feature_names, rfc.feature_importances_))  # 特征的重要度res = rfc.apply(data_test)
print(res)  # 返回每个样本第几个基分类器的第几个节点编号
res = rfc.predict(data_test)
print(res)  # 返回每个样本第几个基分类器的预测结果
res = rfc.predict_proba(data_test)
print(res)  # 返回每个样本在每个分类类别上的预测概率

《scikit-learn》随机森林之深入学习相关推荐

  1. 脑电信号(EEG)处理中的机器学习方法总结——回归模型,SVM、K近邻、人工神经网络、朴素贝叶斯、决策树和随机森林、集成学习、模糊逻辑、LDA线性判别分析、K-means聚类、强化学习、迁移学习

    本文归纳总结了机器学习在脑电分析中的应用,并详细介绍回归模型,SVM.K近邻.人工神经网络.朴素贝叶斯.决策树和随机森林.集成学习.模糊逻辑.LDA线性判别分析.K-means聚类.强化学习.迁移学习 ...

  2. 机器学习分类算法之随机森林(集成学习算法)

    目录 什么是集成学习? 随机森林 随机森林的生成算法 随机森林的随机性

  3. 随机森林的简单学习记录

    随机森林小记 这里采用的随机森林的库选择sklearn库 1.首先是导入数据: path = "D:/Epileptic Seizure Classification.csv" # ...

  4. 机器学习与Scikit Learn学习库

    摘要: 本文介绍机器学习相关的学习库Scikit Learn,包含其安装及具体识别手写体数字案例,适合机器学习初学者入门Scikit Learn. 在我科研的时候,机器学习(ML)是计算机科学领域中最 ...

  5. 机器学习:集成学习(ensemble),bootstrap,Bagging,随机森林,Boosting

    文章目录 集成学习的朴素思想 Bootstrap理论 Bagging 随机森林 Boosting 集成学习的朴素思想 集成学习基于这样的思想:对于比较复杂的任务,综合许多人的意见来进行决策会比&quo ...

  6. 监督学习 | 集成学习 之Bagging、随机森林及Sklearn实现

    文章目录 集成学习 1. 投票分类器 1.1 硬投票法 1.2 软投票法 2. Bagging & Pasting 2.1 包外评估 2.2 Random Patches 和 随机子空间 3. ...

  7. 集成学习—随机森林原理(理解与论文研读)

    如果只想大致理解下随机森林的原理请看第一部分,第二部分是对原论文的研读(灰色引用标记的为证明或自己的理解),这部分可能需要花的时间比较长,不需要的可以忽略. 此外,文末列出来的参考视频,如果读论文还是 ...

  8. 随机森林算法学习(RandomForest)

    随机森林算法学习 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个算法的原理. 要学随机森林, ...

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

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

最新文章

  1. 构建静态服务器_为静态网站构建无服务器联系表
  2. 广域网设备:远程路由器/交换机/服务器—Vecloud
  3. AI理论知识基础(19)-线性变换(1)
  4. 【Linux】一步一步学Linux——file命令(37)
  5. String、String Buffer、StringBuilder区别与比较
  6. laravel CURD
  7. Unity中制作小地图
  8. Navicat for Oracle中如何使用外键
  9. fmri 分析数据 fsl spm 两大平台比对
  10. 前后端分离之JWT(JSON Web Token)的使用
  11. python3.9安装numpy+mky_各种转码(bytes、string、base64、numpy array、io、BufferedReader )...
  12. 图像处理之_导数微分
  13. 高通linux平台(mdm9x07,sdx12)连接qact
  14. List of devices attached解决方案
  15. using-fastcgi-to-host-php-applications-on-iis7
  16. 教你如何申请软件著作权(超级详细)--小白教学
  17. vue框架目录结构(全)
  18. Haorizi Support
  19. 计算机二级2021年3月全国计算机等级考试时间安排(江西)
  20. dpdk-16.04 igb_uio 模块分析

热门文章

  1. 解决 maps to localhost, but this does not map back to the address
  2. LZW数据压缩算法的原理分析
  3. JavaScript 内存机制(前端同学进阶必备)
  4. Centos7 安装配置 tomcat 并设置自动启动
  5. 面试官系统精讲Java源码及大厂真题 - 24 举一反三:队列在 Java 其它源码中的应用
  6. 分布式数据库中间件 MyCat 安装及使用
  7. Spring Security 示例UserDetailsS​​ervice
  8. JavaScript自学笔记(1)---表单验证,let和const,JSON文件
  9. webpack vue router import() 打包后单个js文件名称自定义
  10. 【Java】利用for循环打印心型