集成学习基础
集成学习是指结合两个或多个模型的机器学习模型。集成学习是机器学习的分支,通常在追求更强预测的能力时使用。
集成学习经常被机器学习竞赛中的顶级和获胜参与者使用。现代机器学习库(scikit-learn、XGBoost)内部已经结合了常见的集成学习方法。
集成学习介绍
集成学习结合多个不同的模型,然后结合单个模型完成预测。通常情况下,集成学习能比单个模型找到更好的性能。
常见的集成学习技术有三类:
- Bagging, 如. Bagged Decision Trees and Random Forest.
- Boosting, 如. Adaboost and Gradient Boosting
- Stacking, 如. Voting and using a meta-model.
使用集成学习可以减少预测结果的方差,同时也比单个模型更好的性能。
Bagging
Bagging
通过采样训练数据集的样本,训练得到多样的模型,进而得到多样的预测结果。在结合模型的预测结果时,可以对单个模型预测结果进行投票或平均。
Bagging
的关键是对数据集的采样方法。常见的方式可以从行(样本)维度进行采样,这里进行的是有放回采样。
Bagging
可通过BaggingClassifier
和BaggingRegressor
使用,默认情况下它们使用决策树作为基本模型,可以通过n_estimators
参数指定要创建的树的数量。
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
# 创建样例数据集
X, y = make_classification(random_state=1)
# 创建bagging模型
model = BaggingClassifier(n_estimators=50)
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
Random Forest
随机森林是 Bagging与树模型的结合:
- 随机森林集成在训练数据集的不同引导样本上拟合决策树。
- 随机森林还将对每个数据集的特征(列)进行采样。
在构建每个决策树时,随机森林不是在选择分割点时考虑所有特征,而是将特征限制为特征的随机子集。
随机森林集成可通过RandomForestClassifier
和RandomForestRegressor
类在 scikit-learn 中获得。您可以通过n_estimators
参数指定要创建的树的数量,并通过max_features
参数指定要在每个分割点考虑的随机选择的特征的数量。
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import RandomForestClassifier
# 创建样例数据集
X, y = make_classification(random_state=1)
# 创建随机森林模型
model = RandomForestClassifier(n_estimators=50)
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
AdaBoost
Boosting
在迭代过程中尝试纠先前模型所产生的错误,迭代次数越多集成产生的错误就越少,至少在数据支持的限制范围内并且在过度拟合训练数据集之前。
Boosting
想法最初是作为一种理论思想发展起来的,AdaBoost
算法是第一个成功实现基于Boosting
的集成算法的方法。
AdaBoost
在加权训练数据集的版本上拟合决策树,以便树更多地关注先前成员出错的示例。AdaBoost
不是完整的决策树,而是使用非常简单的树,在做出预测之前对一个输入变量做出单一决策。这些短树被称为决策树桩。
AdaBoost
可通过AdaBoostClassifier
和AdaBoostRegressor
使用,它们默认使用决策树(决策树桩)作为基本模型,可以通过n_estimators
参数指定要创建的树的数量。
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import AdaBoostClassifier
# 创建样例数据集
X, y = make_classification(random_state=1)
# 创建adaboost模型
model = AdaBoostClassifier(n_estimators=50)
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
Gradient Boosting
Gradient Boosting
是一个用于提升集成算法的框架,是对AdaBoosting
的扩展。Gradient Boosting
定义为统计框架下的加法模型,并允许使用任意损失函数以使其更加灵活,并允许使用损失惩罚(收缩)来减少过度拟合。
Gradient Boosting
引入了Bagging
的操作,例如训练数据集行和列的采样,称为随机梯度提升。
对于结构化或表格数据来说,Gradient Boosting
一种非常成功的集成技术,尽管由于模型是按顺序添加的,因此拟合模型可能会很慢。已经开发了更有效的实现,如XGBoost、LightGBM。
Gradient Boosting
在可以通过GradientBoostingClassifier
和GradientBoostingRegressor
使用,默认使用决策树作为基础模型。您可以通过n_estimators
参数指定要创建的树的数量,通过learning_rate
参数控制每棵树的贡献的学习率。
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import GradientBoostingClassifier
# 创建样例数据集
X, y = make_classification(random_state=1)
# 创建GradientBoosting模型
model = GradientBoostingClassifier(n_estimators=50)
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
Voting
Voting
使用简单的统计数据来组合来自多个模型的预测。
- 硬投票:对预测类别进行投票;
- 软投票:对预测概率进行求均值;
Voting
可通过VotingClassifier
和VotingRegressor
使用。可以将基本模型列表作为参数,列表中的每个模型都必须是具有名称和模型的元组,
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import VotingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
# 创建数据集
X, y = make_classification(random_state=1)
# 模型列表
models = [('lr', LogisticRegression()), ('nb', GaussianNB())]
# 创建voting模型
model = VotingClassifier(models, voting='soft')
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
Stacking
Stacking
组合多种不同类型的基本模型的预测,和Voting
类似。但Stacking
可以根据验证集来调整每个模型的权重。
Stacking
需要和交叉验证搭配使用,也可以通过StackingClassifier
和StackingRegressor
使用,可以将基本模型作为模型的参数提供。
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import StackingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
# 创建数据集
X, y = make_classification(random_state=1)
# 模型列表
models = [('knn', KNeighborsClassifier()), ('tree', DecisionTreeClassifier())]
# 设置验证集数据划分方式
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)
# 打印模型的精度
print('Mean Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))