0. 题首
由于sklearn是python机器学习中最重要的库,几乎封装了所有常见的机器学习算法,因而这个库内容非常多。在学习有时候会有一种“不知庐山真面目,只缘身在此山中”的感觉。这个时候我们需要跳出现在学习的框架,站在更高的高度来俯视就可以获得全貌了。
比如这次的bagging算法,和上一次的投票法Votting一样,都是集成在sklearn的ensemble模块中,这个时候我们打开sklearn的官方文档,可以一窥ensemble模块的全貌。如下:
1.JPG
可以看到sklearn.ensemble模块下封装了好多集成算法。除了我们之前学习的Voting和本期的Bagging意以外,常用的还有Adaboost、 GBDT、RandomForest等。通过这种一览全貌的做法,我们也可以熟悉那个方法封装在那个模块下面。因为sklearn的设计全面而博大精深,在使用的时候经常会遇到忘记某个模块的具体位置。
1. Bagging原理概述
Bagging是Bootstrap Aggregation的缩写,常翻译为装袋法。因而要了解bagging,先从Bootstrap说起。Bootstrap,即pull up by your own bootstraps,意思就是白手起家,自立更生的意思,因而bootstrap可以引申为自助采样法,它是一种有放回的抽样方法,目的为了得到统计量的分布以及置信区间,其算法过程如下:
A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
使用流程图更加直观:
image.png
bagging的集合策略也比较简单,对于分类问题,通常使用简单投票法,得到最多票数的类别或者类别之一为最终的模型输出。对于回归问题,通常使用简单平均法,对T个弱学习器得到的回归结果进行算术平均得到最终的模型输出。
由于Bagging算法每次都进行采样来训练模型,因此泛化能力很强,对于降低模型的方差很有作用。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些。
2. 实例分析
Sklearn为我们提供了
[BaggingRegressor]与 [BaggingClassifier]
两种Bagging方法的API,我们在这里通过一个完整的例子演示Bagging在分类问题上的具体应用。这里两种方法的默认基模型是树模型。
# evaluate bagging algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
我们创建一个含有1000个样本20维特征的随机分类数据集:
# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
# summarize the dataset
print(X.shape, y.shape)
>>>
(1000, 20) (1000,)
我们将使用重复的分层k-fold交叉验证来评估该模型,一共重复3次,
每次有10个fold。我们将评估该模型在所有重复交叉验证中性能的平均值和标准差。
# evaluate bagging algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=5)
# define the model
model = BaggingClassifier()
# evaluate the model
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
# report performance
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
>>>
Accuracy: 0.867 (0.034)
最终模型的效果是Accuracy: 0.867 标准差0.034
网友评论