描述
集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体性能的技术。集成学习的核心思想是通过多个弱学习器的组合,可以构建一个强学习器。
sklearn中常见的集成学习算法:
- Bagging:通过自助采样法(Bootstrap Sampling)生成多个训练集,然后分别训练多个模型,最后通过投票或平均的方式得到最终结果。
- Boosting:通过迭代的方式训练多个模型,每个模型都试图纠正前一个模型的错误,最终通过加权投票的方式得到结果。
- Stacking:通过训练多个不同的模型,然后将这些模型的输出作为新的特征,再训练一个元模型(Meta-Model)来进行最终的预测。
sklearn中的集成学习算法在sklearn.ensemble
中;后面的XGBClassifier算法需要单独安装xgboost库;LGBMClassifier需要安装lightgbm库。
Bagging
Bagging 的目标是通过减少模型的方差来提高性能,适用于高方差、易过拟合的模型。
- 数据集重采样:对训练数据集进行多次有放回的随机采样,每次采样得到一个子数据集。
- 训练多个模型:在每个子数据集上训练一个基学习器(通常是相同类型的模型)。
- 结果合并:将多个基学习器的结果进行合并,通常是通过投票(分类问题)或平均(回归问题)。
最具代表性的算法是:随机森林是 Bagging 的经典实现,它通过构建多个决策树,每棵树在训练时随机选择特征,从而减少过拟合的风险。
优势
- 可以有效减少方差,提高模型稳定性。
- 适用于高方差的模型(如决策树)
缺点
- 训练过程时间较长,需要训练多个模型
- 结果难以解释
Boosting
Boosting 的目标是通过减少模型的偏差来提高性能,适用于弱学习器。Boosting 的核心思想是逐步调整每个模型的权重,强调那些被前一轮模型错误分类的样本。
- 序列化训练:模型是一个接一个地训练的,每一轮训练都会根据前一轮的错误进行调整。
- 加权投票:最终的预测是所有弱学习器预测的加权和,其中错误分类的样本会被赋予更高的权重。
- 合并模型:每个模型的权重是根据其在训练过程中的表现来确定的。
典型算法:
- AdaBoost:通过改变样本的权重,使得每个后续分类器更加关注前一轮错误分类的样本。
- 梯度提升树:GBT 通过迭代优化目标函数,逐步减少偏差。
- XGBoost:XGBoost 是一种高效的梯度提升算法,广泛应用于数据科学竞赛中,具有较强的性能和优化。
- LightGBM:是一种基于梯度提升树的框架,相较于 XGBoost,具有更快的训练速度和更低的内存使用。
优势
- 适用于偏差较大的模型,能有效提高预测准确性。
- 性能好,在许多实际应用中表现优异。
缺点
对噪声数据比较敏感,容易导致过拟合。
训练过程较慢,特别是在数据量较大的情况下。
Stacking
Stacking 是一种通过训练不同种类的模型并组合它们的预测来提高整体预测准确度的方法。核心思想是:
- 第一层(基学习器):训练多个不同类型的基学习器(例如,决策树、SVM、KNN 等)来对数据进行预测。
- 第二层(元学习器):将第一层学习器的预测结果作为输入,训练一个元学习器(通常是逻辑回归、线性回归等),来做最终的预测。
优势
- 可以使用不同类型的基学习器,捕捉数据中不同的模式。
- 理论上可以结合多种模型的优势,达到更强的预测能力。
缺点
- 训练过程复杂,需要对多个模型进行训练,且模型之间的结合方式也需要精心设计。
- 比其他集成方法如 Bagging 和 Boosting 更复杂,且容易过拟合。
应用样例
StackingClassifier
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=42)
# 定义基学习器
estimators = [
('dt', DecisionTreeClassifier(max_depth=1)),
('svc', SVC(kernel='linear', probability=True))
]
# final_estimator 参数指定元学习器
stacking = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())
stacking.fit(X_train, y_train)
print(stacking.score(X_train,y_train),stacking.score(X_test,y_test))
XGBClassifier
from xgboost.sklearn import XGBClassifier
model = XGBClassifier(eval_metric='error',max_depth=1)
model.fit(X_train,y_train)
print(model.score(X_train,y_train),model.score(X_test,y_test))
XGBClassifier常用参数:
- learning_rate:小的学习率意味着更多的迭代次数,通常能带来更好的结果,但会增加计算时间。
- max_depth:控制每棵树的深度,避免过拟合。
- subsample:训练每棵树时使用的样本比例。
- colsample_bytree:在构建树时对特征进行采样的比例。
- n_estimators:决策树的个数
- eval_metric:校验数据所需的评价指标。回归任务默认‘rmse’,分类任务默认‘error’。其他可选值’logloss’、‘auc’
- gamma:惩罚项系数,指定节点分裂所需的最小损失函数下降值。值越大,算法越保守。
- alpha:L1 正则化系数,默认为 1。
- booster:指定弱学习器的类型,默认值为 ‘gbtree’。可以选择 ‘gblinear’ 使用线性模型。
LGBMClassifier
from lightgbm.sklearn import LGBMClassifier
model = LGBMClassifier(max_depth=1,boosting_type='gbdt',learning_rate=0.2)
model.fit(X_train,y_train)
print(model.score(X_train,y_train),model.score(X_test,y_test))
LGBMClassifier常用参数:
- n_estimators:指定弱分类器的数量,默认是100
- learning_rate:控制每个弱分类器的贡献,默认0.1。一个较小的学习率一般需要更多的树来提高模型性能
- max_depth:控制每棵树的深度,避免过拟合。
- boosting_type:提升类型,可以是 gbdt(默认)、dart、goss等,分别对应传统提升树、Dropouts与GOSS。
- class_weight:用于解决分类不平衡问题,可以设置成balanced或者手动指定每个类别的权重。
- num_leaves:叶子节点的数量,较高的值能够提高训练的准确度,但也容易导致过拟合