目录

三 随机森林RandomForest
  1 RamdomForestRegressor的实现
  2 随机森林回归器的参数
   2.1 弱分类器结构
   2.2 弱分类器数量
   2.3 弱分类器训练的数据
   2.4 其他参数
四 增量学习:随机森林处理巨量数据
  1 普通学习vs增量学习
  2 增量学习在Kaggle数据上的应用
五 原理进阶:Bagging方法6大面试热点问题
六 随机森林的参数空间与自动优化

三 随机森林RandomForest

随机森林是机器学习领域最常用的算法之一,其算法构筑过程非常简单:从提供的数据中随机抽样出不同的子集,用于建立多棵不同的决策树,并按照Bagging的规则对单棵决策树的结果进行集成(回归则平均,分类则少数服从多数)。只要你充分掌握了决策树的各项属性和参数,随机森林的大部分内容都相当容易理解。

虽然原理上很简单,但随机森林的学习能力异常强大、算法复杂度高、又具备一定的抗过拟合能力,是从根本上来说比单棵决策树更优越的算法。即便在深入了解机器学习的各种技巧之后,它依然是我们能够使用的最强大的算法之一。原理如此简单、还如此强大的算法在机器学习的世界中是不常见的。在机器学习竞赛当中,随机森林往往是我们在中小型数据上会尝试的第一个算法

在sklearn中,随机森林可以实现回归也可以实现分类。随机森林回归器由类sklearn.ensemble.RandomForestRegressor实现,随机森林分类器则有类sklearn.ensemble.RandomForestClassifier实现。我们可以像调用逻辑回归、决策树等其他sklearn中的算法一样,使用“实例化、fit、predict/score”三部曲来使用随机森林,同时我们也可以使用sklearn中的交叉验证方法来实现随机森林。其中回归森林的默认评估指标为R2,分类森林的默认评估指标为准确率。

class sklearn.ensemble.RandomForestRegressor(n_estimators=100, *, criterion='squared_error', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)

class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)

不难发现,随机森林回归器和分类器的参数高度一致,因此我们只需要讲解其中一个类即可。任意集成算法在发源时都是回归类算法,因此我们的重点将会放在回归类算法上。随机森林有大量的参数,幸运的是,随机森林中所有参数都有默认值,因此即便我们不学习任何参数,也可以调用随机森林算法。我们先来建一片森林看看吧:

1 RandomForestRegressor的实现

import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.model_selection import cross_validate, KFold
#这里我们不再使用cross_val_score,转而使用能够输出训练集分数的cross_validate
#决策树本身就是非常容易过拟合的算法,而集成模型的参数量/复杂度很难支持大规模网格搜索
#因此对于随机森林来说,一定要关注算法的过拟合情况data = pd.read_csv('/Users/zhucan/Desktop/train_encode.csv',index_col=0)
data.head()

结果:

data.shape
#(1460, 81)X = data.iloc[:,:-1]
y = data.iloc[:,-1]y #注意,y的类型是整数型,并且y的均值很大,可想而知整体的MSE一定会很大
#0       208500
#1       181500
#2       223500
#3       140000
#4       250000
#         ...
#1455    175000
#1456    210000
#1457    266500
#1458    142125
#1459    147500
#Name: SalePrice, Length: 1460, dtype: int64y.mean()
#180921.19589041095X.shape
#(1460, 80)X.columns.tolist()
#['Id',
# '住宅类型',
# '住宅区域',
# '街道接触面积(英尺)',
# '住宅面积',
# '街道路面状况',
# '巷子路面状况',...]

与sklearn中其他回归算法一样,随机森林的默认评估指标是R2,但在机器学习竞赛、甚至实际使用时,我们很少使用损失以外的指标对回归类算法进行评估。对回归类算法而言,最常见的损失就是MSE。

reg_f = RFR() #实例化随机森林
reg_t = DTR() #实例化决策树
cv = KFold(n_splits=5,shuffle=True,random_state=1412) #实例化交叉验证方式result_t = cross_validate(reg_t #要进行交叉验证的评估器,X,y #数据,cv=cv #交叉验证模式,scoring="neg_mean_squared_error" #评估指标,sklearn中默认为负,负的程度越深模型越糟糕,return_train_score=True #是否返回训练分数,verbose=True #是否打印进程,n_jobs=-1 #线程数)
#[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
#[Parallel(n_jobs=-1)]: Done   2 out of   5 | elapsed:    1.1s remaining:    1.6s
#[Parallel(n_jobs=-1)]: Done   5 out of   5 | elapsed:    1.1s finished
result_f = cross_validate(reg_f,X,y,cv=cv,scoring="neg_mean_squared_error",return_train_score=True,verbose=True,n_jobs=-1)
#[Parallel(n_jobs=-1)]: Using backend LokyBackend with 8 concurrent workers.
#[Parallel(n_jobs=-1)]: Done   2 out of   5 | elapsed:    1.4s remaining:    2.1s
#[Parallel(n_jobs=-1)]: Done   5 out of   5 | elapsed:    2.1s finished
'''建立了100颗树,但由于树是并行增长的,所以建立只会比决策树慢一点,随着数据量增长,
随机森林会越来越慢'''result_t #超级过拟合
# {'fit_time': array([0.03513908, 0.02617216, 0.02826715, 0.03085804, 0.03072166]),
#  'score_time': array([0.00184107, 0.00152969, 0.00140595, 0.00212121, 0.00243092]),
#  'test_score': array([-1.32676659e+09, -3.30251909e+09, -1.57903793e+09, -1.50256213e+09,
#         -1.57774956e+09]),
#  'train_score': array([-0., -0., -0., -0., -0.])}result_f #训练集和测试在交叉验证上的分数差异更小,因此森林的过拟合程度没有决策树高
# {'fit_time': array([1.30783272, 1.37094092, 1.34987903, 1.40098619, 1.32293487]),
#  'score_time': array([0.00880313, 0.00958204, 0.00925899, 0.00892091, 0.00915027]),
#  'test_score': array([-7.78513095e+08, -2.03928947e+09, -7.46760247e+08, -4.73092198e+08,
#         -8.86053174e+08]),
#  'train_score': array([-1.22052661e+08, -1.04873049e+08, -1.37851525e+08, -1.30651561e+08,
#         -1.26205314e+08])}

在集成学习中,我们衡量回归类算法的指标一般是RMSE(根均方误差),也就是MSE开根号后的结果。现实数据的标签往往数字巨大、数据量庞杂,MSE作为平方结果会放大现实数据上的误差(例如随机森林结果中得到的,7∗1087∗108等结果),因此我们会对平房结果开根号,让回归类算法的评估指标在数值上不要过于夸张。同样的,方差作为平方结果,在现实数据上也会太大,因此如果可以,我们使用标准差进行模型稳定性的衡量。

trainRMSE_f = abs(result_f["train_score"])**0.5
testRMSE_f = abs(result_f["test_score"])**0.5
trainRMSE_t = abs(result_t["train_score"])**0.5
testRMSE_t = abs(result_t["test_score"])**0.5trainRMSE_f.mean()
#10949.819569879735
testRMSE_f.mean()
#30452.218280217272
trainRMSE_f.std() #方差数额太大,使用标准差
#373.26874603409686#默认值下随机森林的RMSE与标准差std
xaxis = range(1,6)
plt.figure(figsize=(8,6),dpi=80)
#RMSE
plt.plot(xaxis,trainRMSE_f,color="green",label = "RandomForestTrain")
plt.plot(xaxis,testRMSE_f,color="green",linestyle="--",label = "RandomForestTest")
plt.plot(xaxis,trainRMSE_t,color="orange",label = "DecisionTreeTrain")
plt.plot(xaxis,testRMSE_t,color="orange",linestyle="--",label = "DecisionTreeTest")
plt.xticks([1,2,3,4,5])
plt.xlabel("CVcounts",fontsize=16)
plt.ylabel("RMSE",fontsize=16)
plt.legend()
plt.show()

结果:

  • 横坐标:交叉验证次数
  • 纵坐标:RMSE数值

从图像来看,森林与决策树都处于过拟合状态,不过森林的过拟合程度较轻,决策树的过拟合程度较强。两个算法在训练集上的结果都比较优秀,决策树的可以完美学习训练集上的内容,达到RMSE=0的程度,而随机森林在训练集上的RMSE大约在1w上下徘徊,测试集上的结果则是随机森林更占优。可见,与填写的参数无关,随机森林天生就是比决策树更不容易过拟合、泛化能力更强的

2 随机森林回归器的参数

当填写参数之后,随机森林可以变得更强大。比起经典机器学习算法逻辑回归、岭回归等,随机森林回归器的参数数量较多,因此我们可以将随机森林类的参数分为如下4大类别,其中标注为绿色的是我们从未学过的、只与集成算法相关的参数:

2.1 弱分类器结构

在集成算法当中,控制单个弱评估器的结构是一个重要的课题,因为单个弱评估器的复杂度/结果都会影响全局,其中单棵决策树的结构越复杂,集成算法的整体复杂度会更高,计算会更加缓慢、模型也会更加容易过拟合,因此集成算法中的弱评估器也需要被剪枝。随机森林回归器的弱评估器是回归树,因此集成评估器中有大量的参数都与弱评估器回归树中的参数重合:

这些参数在随机森林中的用法与默认值与决策树类DecisionTreeRegressor中完全一致,专门用于对决策树进行剪枝、控制单个弱评估器的结构,考虑到大家在决策树中已经充分掌握这些参数,我们不再对这些参数一一进行详细说明了。在这里,我们重点复习一下以下两部分参数:

  • 分枝标准与特征重要性

criterion与feature_importances_

与分类树中的信息熵/基尼系数不同,回归树中的criterion可以选择"squared_error"(平方误差),"absolute_error"(绝对误差)以及"poisson"(泊松偏差)。对任意样本

LESSON 9.1 随机森林回归器的实现相关推荐

  1. Lesson 9.2 随机森林回归器的参数

    文章目录 一.弱分类器的结构 1. 分枝标准与特征重要性 2. 调节树结构来控制过拟合 二.弱分类器的数量 三.弱分类器训练的数据 1. 样本的随机抽样 2. 特征的随机抽样 3. 随机抽样的模式 四 ...

  2. sklearn机器学习:随机森林回归器RandomForestRegressor

    sklearn随机森林回归器类的格式 sklearn.ensemble.RandomForestRegressor (n_estimators='warn', criterion='mse', max ...

  3. sklearn的系统学习——随机森林分类器与随机森林回归器(含有python完整代码及案例)

    目录 集成算法 sklearn中的随机森林 随机森林分类器 随机性参数 属性 案例代码 随机森林回归器 案例代码 在前面的内容中,已经对决策树解决分类回归问题分别做了阐述,今天走进随机森林的世界. 什 ...

  4. Python实现贝叶斯优化器(Bayes_opt)优化随机森林回归模型(RandomForestRegressor算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 贝叶斯优化器 (BayesianOptimization) 是一 ...

  5. 多元随机森林回归(Multivariate Random Forest Regreesor)经验总结

    多元随机森林回归(Multivariate Random Forest Regreesor)经验总结 随机森林 多元回归问题 是否需要分析自变量相关性 最近在使用随机森林解决多元回归问题,本文涉及一些 ...

  6. sklearn线性回归,支持向量机SVR回归,随机森林回归,神经网络回归参数解释及示例

    1.sklearn线性回归 线性回归,其中目标值 y 是输入变量 x 的线性组合. 在数学概念中,如果  是预测值. 在整个模块中,我们定义向量  作为 coef_ ,定义  作为 intercept ...

  7. 随机森林 html5,利用随机森林回归算法预测总有机碳含量

    受美国"页岩气革命"的影响,页岩气勘探受到了大量的关注( 现有利用测井曲线预测TOC的方法有4类:①利用单曲线或多曲线建立回归关系的预测方法,如利用密度曲线(DEN)预测TOC.利 ...

  8. Lesson 9.4 随机森林在巨量数据上的增量学习和 Bagging 方法 6 大面试热点问题

    文章目录 一.随机森林在巨量数据上的增量学习 1. 普通学习 vs 增量学习 1.1 普通学习 2. 增量学习 2. 增量学习在 Kaggle 数据上的应用 2.1 实际应用 二.Bagging 方法 ...

  9. Python实现Stacking回归模型(随机森林回归、极端随机树回归、AdaBoost回归、GBDT回归、决策树回归)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 Stacking通常考虑的是异质弱学习器(不同的学习算法被组合在 ...

最新文章

  1. 使用ADO.NET直接连接Geodatabase
  2. Python os.makedirs详细介绍
  3. 【Lucene4.8教程之五】Luke
  4. 【Canvas】如何用Canvas绘制折线图
  5. JavaFX UI控件教程(四)之Button
  6. idea无法忍受_不要成为无法忍受的软件开发人员
  7. android+微信一键关注,一键关注微信公众平台JS代码有哪些?
  8. 复合辛普森求积公式原理_辛普森法则:公式及其原理
  9. python交通调查数据处理_python 小型交通调查后的数据处理(数车)
  10. fetch与XHR的区别与优势
  11. Linux内核分析——进程的描述和进程的创建
  12. ios view 切上部分圆角_唯一可行的 iOS 架构
  13. Latente Wärme
  14. 《3D数学基础》1.9 向量空间
  15. 看书学习感悟系列(二)
  16. crypto661-rabin(网鼎杯2022-未完成)
  17. 计算机xp怎么做备份,怎么备份电脑系统?XP环境使用Ghost备份操作系统的步骤
  18. 全面了解信贷业务流程
  19. 【问题】2.Bind for 0.0.0.0:8887 failed: port is already allocated错误
  20. java多线程------锁

热门文章

  1. python程序设计与应用教程鄂大伟_鄂大伟-从零进阶的Python教学与开发之路.pdf
  2. html网页语言是什么,HTML是什么?
  3. 计算器界面分析及界面程序实现
  4. php去除html标签_用PHP操作DOM (一)
  5. python百度关键词自动提交订单_Python小工具-根据输入关键字自动打开百度搜索结果的第一页...
  6. 重置npm设置_密码重置用户流程4部曲
  7. php中使用json做api,JSONAPI在PHP中的应用
  8. sql导航函数 NTH_VALUE
  9. 阿里云 刷新缓存 java_【从入门到放弃-Java】并发编程-NIO-Buffer
  10. SSH框架联合开发(Annotation精简Spring的配置文件)