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

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

在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. 老外谈设计: 2015年WEB设计趋势
  2. 读书方法(如果努力有用的话,那还要天才干什么!)
  3. 【五】搜索推荐技术在电商导购领域的应用——截图小王子
  4. python可以代替plc吗_PLC可以代替安全控制器吗?电气工程师告诉你
  5. 三、处理机调度与死锁
  6. java url工具_UrlTool官方版|UrlTool (java Url转换工具)下载v1.1-乐游网软件下载
  7. Docker-创建和分享应用(3)
  8. bugscan泄露代码解密
  9. python基础语法手册-python语法手册
  10. linux 注册并配置
  11. 【NLP开发】Python实现聊天机器人(微软小冰)
  12. 2. 测度论-分布与分布函数
  13. 计算机上显示找不到无线网络连接失败,笔记本找不到无线网络,教您笔记本电脑搜索不到无线网络怎么办...
  14. Windows Server 2008 R2 安装及配置
  15. Python分析《武林外传》 -----转载
  16. 记我的 15 款 MacBook Pro 13.3 寸维修(开不了机)+换屏的经历
  17. 微信公众号运营实用小技巧分享
  18. AutoML- NNI
  19. 基于单目和低成本GPS的车道定位方法
  20. Emacs 从入门到精通

热门文章

  1. USACO 简易题解(蒟蒻的题解)
  2. Linux-DNS服务-BIND配置
  3. Category 中属性的使用
  4. “strcpy” 模拟的实现
  5. 在windows下python,pip,numpy,scipy,matplotlib的安装
  6. iscroll上拉加载、下拉刷新
  7. eclipse中JS文件乱码
  8. 好记性不如烂笔杆-android学习笔记十一 Service的应用
  9. 请wince驱动调试助手的作者sunrain_hjb以及wince开发者进来看看
  10. 十分钟教会你原生JS压缩图片,极其精简版