随机森林算法梳理

1. 集成学习概念

顾名思义,集成学习(ensemble learning)指的是将多个学习器进行有效地结合,组建一个学习系统,其中每个学习器是这个系统的组成单元,每个学习器的学习本领,以及在系统中所占的权重根据训练可能会有不同,但其泛化性能要能优于其中任何一个学习器

2. 个体学习器概念

如图所示,所谓的个体学习器可以说是集成学习的基本组成单元
在这里插入图片描述

3. boosting bagging

  • boosting:
    Boosting是一种串行的工作机制,即个体学习器的训练存在依赖关系,必须一步一步序列化进行。其基本思想是:增加前一个基学习器在训练过程中预测错误样本的权重,使得后续基学习器更加关注这些打标错误的训练样本,尽可能纠正这些错误,一直向下串行直至产生需要的T个基学习器,Boosting最终对这T个学习器进行加权结合,产生学习器委员会。
    Boosting族算法最著名、使用最为广泛的就是AdaBoost,因此下面主要是对AdaBoost算法进行介绍。AdaBoost使用的是指数损失函数,因此AdaBoost的权值与样本分布的更新都是围绕着最小化指数损失函数进行的。看到这里回想一下之前的机器学习算法,不难发现机器学习的大部分带参模型只是改变了最优化目标中的损失函数:如果是Square loss,那就是最小二乘了;如果是Hinge Loss,那就是著名的SVM了;如果是log-Loss,那就是Logistic Regression了。
  • bagging
    bagging是一种并行式的集成学习方法,即基学习器的训练之间没有前后顺序,可以同时进行,Bagging使用“有放回”采样的方式选取训练集,对于包含m个样本的训练集,进行m次有放回的随机采样操作,从而得到m个样本的采样集,这样训练集中有接近36.8%的样本没有被采到。按照相同的方式重复进行,我们就可以采集到T个包含m个样本的数据集,从而训练出T个基学习器,最终对这T个基学习器的输出进行结合。

4. 结合策略(平均法,投票法,学习法)

平均法:简单平均、加权平均
适用范围:
规模大的集成,学习的权重较多,加权平均法易导致过拟合
个体学习器性能相差较大时宜使用加权平均法,相近用简单平均法。

投票法:
1.绝对多数投票法:某标记超过半数;
2.相对多数投票法:预测为得票最多的标记,若同时有多个标记的票最高,则从中随机选取一个。
3.加权投票法:提供了预测结果,与加权平均法类似。

学习法
学习法是一种更高级的结合策略,即学习出一种“投票”的学习器,Stacking是学习法的典型代表。Stacking的基本思想是:首先训练出T个基学习器,对于一个样本它们会产生T个输出,将这T个基学习器的输出与该样本的真实标记作为新的样本,m个样本就会产生一个m*T的样本集,来训练一个新的“投票”学习器。投票学习器的输入属性与学习算法对Stacking集成的泛化性能有很大的影响,书中已经提到:投票学习器采用类概率作为输入属性,选用多响应线性回归一般会产生较好的效果。

5. 随机森林思想

随机森林(Random Forest)是Bagging的一个拓展体,它的基学习器固定为决策树,多棵树也就组成了森林,而“随机”则在于选择划分属性的随机,随机森林在训练基学习器时,也采用有放回采样的方式添加样本扰动,同时它还引入了一种属性扰动,即在基决策树的训练过程中,在选择划分属性时,RF先从候选属性集中随机挑选出一个包含K个属性的子集,再从这个子集中选择最优划分属性,一般推荐K=log2(d)。
这样随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,从而进一步提升了基学习器之间的差异度。相比决策树的Bagging集成,随机森林的起始性能较差(由于属性扰动,基决策树的准确度有所下降),但随着基学习器数目的增多,随机森林往往会收敛到更低的泛化误差。同时不同于Bagging中决策树从所有属性集中选择最优划分属性,随机森林只在属性集的一个子集中选择划分属性,因此训练效率更高。

6. 随机森林的推广

随机森林(Random Forest,RF)是Bagging算法的一种,其实在介绍完Bagging算法之后,随机森林几乎是呼之欲出的,RF相对于Bagging只是对其中一些细节做了自己的规定和设计。每个树选取使用的特征时,都是从全部m个特征中随机产生的,本身已经降低了过拟合的风险和趋势。模型不会被特定的特征值或者特征组合所决定,随机性的增加,将控制模型的拟合能力不会无限提高。
与决策树不同,RF对决策树的建立做了改进。对于普通的决策树,我们会在节点上所有的m个样本特征中选择一个最优的特征来做决策树的左右子树划分。但是RF的每个树,其实选用的特征是一部分,在这些少量特征中,选择一个最优的特征来做决策树的左右子树划分,将随机性的效果扩大,进一步增强了模型的泛化能力。
假设每棵树选取msub个特征,msub越小,此时模型对于训练集的拟合程度会变差,偏倚增加,但是会泛化能力更强,模型方差减小。msub越大则相反。在实际使用中,一般会将msub的取值作为一个参数,通过开启oob验证或使用交叉验证,不断调整参数以获取一个合适的msub的值。

7. 优缺点

优点:
可以处理高维数据,不同进行特征选择(特征子集是随机选择)
模型的泛化能力较强
训练模型时速度快,成并行化方式,即树之间相互独立
模型可以处理不平衡数据,平衡误差
最终训练结果,可以对特种额排序,选择比较重要的特征
随机森林有袋外数据(OOB),因此不需要单独划分交叉验证集
对缺失值、异常值不敏感
模型训练结果准确度高
相对Bagging能够收敛于更小的泛化误差
缺点:
当数据噪声比较大时,会产生过拟合现象
对有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响
分裂的时候,偏向于选择取值较多的特征

8. sklearn参数

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None)

param n_estimators:integer,optional(default = 10) 森林里的树木数量。
param criteria:string,可选(default =“gini”)分割特征的测量方法
param max_depth:integer或None,可选(默认=无)树的最大深度
param bootstrap:boolean,optional(default = True)是否在构建树时使用自举样本。

import pandas as pd
import sklearn
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
 
 
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
 
#选取一些特征作为我们划分的依据
x = titanic[['pclass', 'age', 'sex']]
y = titanic['survived']
 
# 填充缺失值
x['age'].fillna(x['age'].mean(), inplace=True)
 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
 
dt = DictVectorizer(sparse=False)
 
print(x_train.to_dict(orient="record"))
 
# 按行,样本名字为键,列名也为键,[{"1":1,"2":2,"3":3}]
x_train = dt.fit_transform(x_train.to_dict(orient="record"))
 
x_test = dt.fit_transform(x_test.to_dict(orient="record"))
 
# 使用决策树
dtc = DecisionTreeClassifier()
 
dtc.fit(x_train, y_train)
 
dt_predict = dtc.predict(x_test)
 
print(dtc.score(x_test, y_test))
 
print(classification_report(y_test, dt_predict, target_names=["died", "survived"]))
 
# 使用随机森林
 
rfc = RandomForestClassifier()
 
rfc.fit(x_train, y_train)
 
rfc_y_predict = rfc.predict(x_test)
 
print(rfc.score(x_test, y_test))
 
print(classification_report(y_test, rfc_y_predict, target_names=["died", "survived"]))

9. 应用场景

随机森林可以使用若干个简单的若分类器的组合,使得分类的效果能够达到较好的强分类器的效果,这是集成学习的核心思想,可以应用到金融领域的风险控制中,从互联网行为、APP、运营商等途径获取特征维度,比如信贷历史记录、消费能力、社会信用等特征,在通过boosting、bagging等算法进行训练预测,可以进行预测是否存在反欺诈、违约概率大小、风险定价等问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值