概述
一、原理
https://blog.csdn.net/cg896406166/article/details/83796557,解释的非常生动!
1.步骤
对含有N个样本,M个特征的数据集操作。
(1).首先采样T次,每次从N个样本里有放回的选取n个样本(n=),从得到T个含有均n个样本(不相同)的数据集。再有放回的随机选取这些样本的k个特征。这就是我们第一次得到的森林:有T棵树,每棵树有k个节点(特征)。每棵树利用n个样本对k个特征训练得到模型。(疑问:每棵树的k个特征也不一样吗?)
(2).我们将剩下的1/3的样本带入(1)中的模型进行测试,求袋外误差,从而得到特征的重要性排列。选取排名靠前的特征,组成了新的森林。(疑问:每棵树的特征是从这一步挑选出的特征里随机抽取吗?每棵树的样本还需要再次抽取吗,仍然为n个?)
(3).重复第二个步骤进行迭代,不断排除影响较小的特征,得到新的森林,直至特征数减少到指定值m。完成迭代。
(4).将每次迭代得到的森林再计算套外误差(其实和(2)中的袋外误差一样,都叫oob。这里为了区分,叫做套外误差),挑选出误差最小的森林,即为所求。
2.细节解释
(1)关于有放回抽取样本:每个采样集只使用了初始训练集中约63.2%的样本【每个样本被抽到的概率是1/N,样本不被抽到概率就是1-1/N,总共抽了T次,第T次试验后样本不被抽到的概率是(1-1/N)T,当T趋近于无穷大时,(1-1/n)T=1/e,约等于36.8%】,另外抽不到的样本叫做out-of-bag(OOB) examples,这部分数据可以用于对决策树的性能进行评估,计算模型的预测错误率,称为袋外数据误差。这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计
(2)关于k的值:k一般选择(其中d为样本所有属性):
(3)关于求森林的预测值:将模型用于样本,得到各样本的预测值,对分类任务使用简单投票法(选择数量最多的结果)确定该样本最终预测值,对回归任务使用简单平均法(所有结果的平均值)确定该样本最终预测值。
(4)关于袋外误差以及特征的选取:
对1/3的测试集求预测值,得误差errOOB2。改变测试集中某个特征的值再进行预测,得到误差errOOB1。从而求得该特征对该树的重要性。(详细解释:随机对袋外数据OOB所有样本的特征X加入噪声干扰(即:随机改变样本在特征X处的值),再次计算袋外数据误差,记为errOOB1。假设森林中有N棵树,则特征X的重要性=∑errOOB1−errOOB2N∑errOOB1−errOOB2N。这个数值之所以能够说明特征的重要性是因为,如果加入随机噪声后,袋外数据准确率大幅度下降(即errOOB1上升),说明这个特征对于样本的预测结果有很大影响,进而说明重要程度比较高。)
对每棵树中的每个特征都计算一次。但这只能代表这些特征在树中的重要程度不能代表特征在整个森林中的重要程度。那我们怎么计算各特征在森林中的重要程度呢?每个特征在多棵数中出现,取这个特征值在多棵树中的重要程度的均值即为该特征在森林中的重要程度。
这样就得到了所有特征在森林中的重要程度。将所有的特征按照重要程度排序,去除森林中重要程度低的部分特征,得到新的特征集。这时相当于我们回到了原点,这算是真正意义上完成了一次迭代。
(5)关于套外误差以及森林的选取:
得到了每次迭代出的森林之后,我们需要选择出最优秀的森林(随机森林毕竟是集成学习,所以最后的森林不一定是最优的)。那么我们怎么比较这些森林的好坏呢?这时我们需要引入一个指标来评价一个森林的好坏,上面的用于评价套外样本在树中的误差率,这里的评价套外样本在森林中的误差率。(因为都是利用套外样本,所以名字都是(out-of-bag))
森林中,·每个样本总能在森林里找到几棵树不包含他。那么该样本就是这几棵树的套外样本,通过这几棵树预测这个样本的结果。预测出所有所有样本的结果之后与真实值进行比较,就可以得到这个森林的套外误差率。
选择套外误差率最小的森林作为最终的随机森林模型。
3、总结
随机森林实际上是一种特殊的bagging方法,它将决策树用作bagging中的模型。首先,用bootstrap方法生成多个训练集,然后,对于每个训练集,构造一颗决策树,在节点找特征进行分裂的时候,并不是对所有特征找到能使得指标(如信息增益)最大的,而是在特征中随机抽取一部分特征,在抽到的特征中间找到最优解,应用于节点,进行分裂。随机森林的方法由于有了bagging,也就是集成的思想在,实际上相当于对于样本和特征都进行了采样(如果把训练数据看成矩阵,就像实际中常见的那样,那么就是一个行和列都进行采样的过程),所以可以避免过拟合。
prediction阶段的方法就是bagging的策略,分类投票,回归均值。
随机森林中的基学习器多样性不仅来自样本扰动(采样的随机),还来自属性的扰动(特征的选取),这就使得最终模型的泛化性能可通过个体学习器之间的差异度增加而进一步提升
二、python代码
class sklearn.ensemble.RandomForestClassifier(
n_estimators=10, 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_split=1e-07, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False,class_weight=None)
以下用常用参数:
1)n_estimators:设置多少个基分类器(取决于数据量)
2)min_samplies_split:单独叶子节点至少要有几个样本,
3)max_features:一次抽样抽多少feature,回归问题设置为特征数,分类问题设置为sqrt(n_features)
4)max_depth:树的最大深度(5-10)
5)oob_score
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve
rf=RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=5,
min_samples_split=2, oob_score=True, n_jobs=1 )
param_grid ={"n_estimators":[5,10],'max_depth':[3,5]}
gscv = GridSearchCV(clf,param_grid,n_jobs= -1,verbose = 1,cv = 5,error_score = 0,scoring='auc')
gscv.fit(X,y)
gscv.best_score_
gscv.best_params_
gscv.predict_proba(X)#refit=True,gscv为最佳分类器
gscv.grid_scores_#score=roc_auc,auc值
最后
以上就是紧张茉莉为你收集整理的随机森林原理及实现一、原理二、python代码的全部内容,希望文章能够帮你解决随机森林原理及实现一、原理二、python代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复