集成算法的目标是:组合几个基学习器的预测,以此来提高单个模型的泛化性和健壮性
集成方法常分为两类:
- averging methods:平均法的原则是: 独立的构建几个学习器,然后平均他们的预测。通常,组合的学习器要比任何一个单个的学习器要好,因为它降低了方差。 其中的代表:bagging 方法,随即森林
- boosting methods:学习器依次构建,试图降低组合的学习器的偏差。 其中的代表:AdaBoost,Gradient Tree Boosting
1、 Bagging
在集成算法中,bagging方法在原始数据集的基础之上利用黑盒的方式构建几个学习器,然后将它们独立的预测进行聚集,作为最后的预测。
通过在基学习器构建的过程中引入随机方法,并最后通过集成。利用这种方式来降低单个学习器的方差。
若是希望通过一种方式来降低overfitting:
- baggnig方法,在模型strong、complex的时候效果好
- boosting方法,在模型weak的时候效果好
Bagging方法有很多形式,不同的是随机选择训练数据的方式
- 随机选择数据子集--->Pasting
- 可以重复抽样--->Bagging
- 样本在随机选择的属性中抽样-- Random Subspaces
- 构建基学习器的时候样本和属性都是子集时---> Random Patches
2、随机森林
在Scikit-Learn的ensemble模块中有两个平均的方法基于决策树:随机森林(RandomForest)和极限树(Extra-Trees)。
一个小例子:
from sklearn.ensemble import RandomForestClassifier
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = RandomForestClassifier(n_estimators=10)
clf = clf.fit(X, Y)
2.1 随机森林
在随机森林(包括随机森林分类和随机森林回归),每一棵树都是通过又放回的抽样的方式获得的。并且每棵树的节点在分裂时选择特征子集(随机特征子集)中最好的特征进行分裂节点。
依靠这种方式随机森林的偏差可能会增加,但是方差会降低。
2.2 Extremely Randomized Trees 极限树
在极限随机树种(包括极限树分类和极限树回归),在分裂节点时,随机的更彻底一些。跟随机森林算法一样,极限树算法会随ijide选择特征子集,不同的是:会在每个特征中随机的选择阈值来划分特征,而不是寻找最佳的划分阈值。然后在这里边选择最好的作为划分特征和划分特征的阈值。
由于随机的更加彻底,方差会进一步降低,凡是偏差会增大。
一个小例子:
from sklearn.model_selection import cross_val_score
from sklearn.datasets import make_blobs
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.tree import DecisionTreeClassifier
X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0)
clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)
scores = cross_val_score(clf, X, y)
scores.mean()
clf = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf,X,y)
scores.mean()
clf = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)
scores = cross_val_score(clf,X,y)
scores.mean() > 0.999
2.3 参数
最主要的参数有两个n_estimators、 max_features
n_estimators: 代表森林中树的数量。越多越好,但是越多代表着训练时间越长。
max_features :