内容参考:https://github.com/NLP-LOVE/ML-NLP/tree/master/Machine%20Learning/3.1%20Random%20Forest
略做修改
如果你随机向几千专家询问一个复杂的问题,然后汇总他们的回答,在许多情况下,你会发现,这个汇总的答案比最好的那个专家回答得要好。同样,如果你聚合一组预测器(比如分类器或者回归器)的预测,得到的预测结果也比最好的单个预测器要好,这种聚合一组预测器来进行预测的方法,称为集成学习。
例如,你可以训练一组决策树分类器,每一颗树都基于训练集不同的子集进行训练,在做预测时,你只需要获得所有树的预测,然后给出票数最多的类别作为预测结果。
常见的集成学习方法包括:bagging,Random-Forest,boosting,stacking等
Bagging(bootstrap aggregating的缩写,bootstrap在统计学中是放回重新采用方法,采用时样本不放回就是pasting)。思想就是从总体样本当中随机取一部分样本进行训练,通过多次这样的结果,进行投票获取平均值作为结果输出,这就极大可能的避免了不好的样本数据,从而提高准确度。与直接在原始训练集上的单个预测器相比,集成学习的偏差相近,但方差更低。
Scikit-learn提供了一个简单的API,可用BaggingClassifier进行Bagging或者Pasting(或者BaggingRegressor用于回归)。以下代码训练一个包含500颗决策树分类器继承,每次随机从训练集中采用100个实例进行训练,然后放回(如果想使用pasting,只需设置设置bootstrap=False),参数n_jobs用来指示Scikit-learn用多少CPU内核来进行训练和预测(-1表示让Scikit-learn使用所有可用的内核)
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(
DecisionTreeClassifier(random_state=42), n_estimators=500,
max_samples=100, bootstrap=True, n_jobs=-1, random_state=42)
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
下图比较了单个决策树和一个由500个决策树组成的bagging集成方法的决策边界,可以看出集成预测的泛化效果很可能比单独的决策树要更好一些,二者偏差相近,但是继承方法方差要更小(两边训练集上的错误数量差不多,但是集成的决策边界更加光滑)
上面提到的Bagging方法是先构建一个BaggingClassifier,然后将结果传输到DecisionTreeClassifier,还有一种方法是使用RandomForestClassifier。Random Forest(随机森林)是一种基于树模型的Bagging的优化版本(对回归任务,还有一个RandomForestRegressor)。一下代码为训练一个500颗树的随机森林分类器,每棵树限制未16个叶子结点。
from sklearn.ensemble import RandomForestClassifier
rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)
rnd_clf.fit(X_train, y_train)
y_pred_rf = rnd_clf.predict(X_test)
而同一批数据,用同样的算法只能产生一棵树,这时Bagging策略可以帮助我们产生不同的数据集。Bagging策略来源于bootstrap aggregation:从样本集(假设样本集N个数据点)中重采样选出Nb个样本(有放回的采样,样本数据点个数仍然不变为N),在所有样本上,对这n个样本建立分类器(ID3\C4.5\CART\SVM\LOGISTIC),重复以上步骤m次,获得m个分类器,最后根据这m个分类器的投票结果,决定数据属于哪一类。
每棵树的按照如下规则生成:
一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
随机森林再树的生长上引入了更多的随机性:分裂节点不再是搜索最好的特征(信息增益最大),而是在一个随机生成的子特征集里搜索最好的特征。建立多颗这样的决策树,然后通过这几课决策树来投票,决定数据属于哪一类(投票机制有一票否决制、少数服从多数、加权多数)
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
优点:
缺点:
根据随机森林创建和训练的特点,随机森林对缺失值的处理还是比较特殊的。
其实,该缺失值填补过程类似于推荐系统中采用协同过滤进行评分预测,先计算缺失特征与其他特征的相似度,再加权得到缺失值的估计,而随机森林中计算相似度的方法(数据在决策树中一步一步分类的路径)乃其独特之处。
OOB:
上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
bagging方法中Bootstrap每次约有1/3的样本不会出现在Bootstrap所采集的样本集合中,当然也就没有参加决策树的建立,把这1/3的数据称为袋外数据oob(out of bag),它可以用于取代测试集误差估计方法。
袋外数据(oob)误差的计算方法如下:
优缺点:
这已经经过证明是无偏估计的,所以在随机森林算法中不需要再进行交叉验证或者单独的测试集来获取测试集误差的无偏估计。
你已经建了一个有10000棵树的随机森林模型。在得到0.00的训练误差后,你非常高兴。但是,验证错误是34.23。到底是怎么回事?你还没有训练好你的模型吗?
答:该模型过度拟合,因此,为了避免这些情况,我们要用交叉验证来调整树的数量。
GitHub:Jupyter Notebook Viewer