一、Voting Classifiers
当分类器尽可能相互独立时,集成的效果更好。
想得到不一样的分类器,方法1是用不同的算法,方法2是在不同的数据子集上训练模型,主要有bagging和pasting两种方法。
bagging (bootstrap aggregating ):用有放回抽样的方式生成新的数据集
pasting:无放回抽样生成数据集
每一个单独的predictor的效果不如在原始数据集上训练出来的结果,但是整合在一起,却可以得到比在原始数据集上方差更小的结果(偏差略低于直接在原始数据上建模)。
python Scikit-Learn 代码:(用决策树做基分类器)
from sklearn.ensemble import BaggingClassifier #如果做回归任务用BaggingRegressor
from sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(
DecisionTreeClassifier(), n_estimators = 500,
max_samples = 100, bootstrap = True, n_jobs = -1
)
Note:
1. n_jobs表示用多少个CPU cores, -1指用上所有可行的核。
2. 如果基分类器可以计算类概率,BaggingClassifier 自动用soft voting。
3. bootstrap = False时是pasting,由于bagging是无放回采样,得到的子样本之间差异更大,因此尽管偏差略微大于pasting,方差却更小,实际应用中人们更偏向于bagging。
二、Out-of-bag Evaluation
采用bagging方法时,每个subset里只包含63%的观测点,对每个基分类器而言,没有用于训练的37%叫作out-of-bag instances,这些观测点可以用于衡量该基分类器的效果,并且可以将所有predictor的结果平均,用于衡量该集成方法的效果。(就不用另外做交叉验证了)
在Scikit-Learn中,可以设定oob_score=True,自动获得这一结果。
bag_clf = BaggingClassifier( DecisionTreeClassifier(), n_estimators = 500, max_samples = 100, bootstrap = True, n_jobs = -1, oob_score=True ) bag_clf.fit(X_train, Y_train) bag_clf.oob_score_. #获得结果
可以验证以上方法所获得的accuracy score结果与方法应用于测试集上的结果是接近的:
from sklearn.metrics import accuracy_score y_pred = bag_clf.predict(X_test) accuracy_score(y_test, y_pred)
Note: 还可以获得每一个实例点的oob decision function,即综合所有基分类器的结果,预测的该点属于各类的概率。
bag_clf.oob_decision_function_
Random patches and Random Subspaces method
当处理高维数据时,可以用时对特征进行抽样,用更大的偏差换取方差的进一步减小。使用类似的超参数:max_features and bootstrap_features。
其中,同时对特征和观测点进行抽样是random patches,只对特征进行抽样是random sudspaces method。
三、Random Forests
随机森林是决策树的集成,一般是用bagging方法,并且将max_samples设定为训练集的size,即通过重抽样获得和训练集同等大小的样本。
可以直接使用RandomForestClassifier类:
from sklearn.ensemble import RandomForestClassifier rnd_clf = RandomForestClassifier(n_estimators = 500, max_leaf_nodes = 16, n_jobs = -1) rnd_clf.fit(X_train,y_train) y_pred_clf = rnd_clf.predict(X_test)
随机森林在建每棵树时用这样的方式引入更多的随机性:
在进一步划分一个根结点时,在随机的特征子集中搜寻最好的特征。
Extra-trees(Extremely Randomized Trees):进一步增加随机性,方法是对每个特征,使用随机的thresholds而不是选择最优的一个,这样做还可以节省training的时间。
Note:无法提前知道随机森林分类器/Extra-trees 哪一种效果更好,可以考虑用交叉验证的办法来比较(用grid search来做超参数的tuning)。
Feature importance
对于每棵树而言,越接近树根处的特征越可能是重要的特征,因此可以利用特征在森林里出现的平均深度,来得到特征重要性的估计。
以鸢尾花数据集为例:
from sklearn.datasets import load_iris iris = load_iris() rnd_clf = RandomForestClassifier(n_estimators = 500, n_jobs = -1) rnd_clf.fit(iris['data'],iris['target']) for name, score in zip(iris['feature_names'],rnd_clf.feature_importances_): print(name,score)
注:zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。