机器学习之集成学习算法
集成学习算法
- 一 概述
- 二 Bagging方法
- 2.1思想
- 2.2代表算法
- 2.3API
- 三 Boosting 方法
- 3.1 AdaBoost
- 3.1.1思想
- 3.1.2API
- 3.2 GBDT
- 3.2.1思想
- 3.2.2API
- 3.3 XGBoost
- 3.3.1思想
- 3.3.2API
机器学习算法很多,今天和大家聊一个很强悍的算法- 集成学习算法,基本上是处理复杂问题的首选.话不多说,直奔主题.
一 概述
集成学习(Ensemble Learning): 是一种通过 组合多个模型的预测结果 来提升整体性能 的机器学习技术。常用于分类、回归等任务.
集成学习的基本思想: 是将多个弱模型(weak learners)组合成一个强模型(strong learner),从而获得更好的预测效果.
中心思想:简单说就是弱弱变强或者强强联合.
二 Bagging方法
2.1思想
Bagging(Bootstrap Aggregating)又称装袋法 是一种 并行训练 多个模型的方法, 使用 Bootstrap方法,即:通过有放回 的对训练数据集进行 随机采样 得到多个数据子集,每个子集的大小与原始数据集相同。并 在每个子集上 训练一个独立的模型,结合这些模型的预测结果 来减少方差(即:模型的波动性),最后通过 投票或平均 的方法 作为最终结果.
可以处理回归问题也可处理分类问题,才用不同的评估方式:
对于 回归问题,通常使用 平均值 作为 最终预测结果
对于 分类问题,通常使用 多数投票法 来决定最终 分类结果
2.2代表算法
随机森林:一种通过 样本和特征随机化 构建 多棵决策树 并集成它们结果的集成学习方法。在训练过程中,随机森林对训练数据进行 有放回的随机抽样(Bootstrap 采样),为每棵决策树生成不同的训练子集。同时,在每个决策树的节点分裂时,随机选择特征子集以进行最佳分裂,增加了模型的多样性并降低了过拟合风险。最终,分类任务通过多数投票法整合各棵树的预测结果,回归任务则通过对预测值取平均值生成最终预测。由于两种随机化的引入,随机森林在面对高维数据或噪声数据时表现稳定且具有较强的泛化能力。
2.3API
在 scikit-learn
中, 通过 ensemble
中的 RandomForestClassifier
或 RandomForestRegressor
实现:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建随机森林模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
# 训练模型
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 输出准确率
print(f"Accuracy: {clf.score(X_test, y_test)}")
常用 API 参数(以 sklearn.ensemble.RandomForestClassifier
和 RandomForestRegressor
为例):
-
n_estimators:默认值为 100
- 表示构建多少棵决策树。树的数量越多,模型的泛化能力通常越强,但训练时间会变长。
-
criterion:默认值为
"gini"
(分类)和"squared_error"
(回归)- 决定树的分裂标准。分类任务中可选择
"gini(CAET分类)"
或"entropy(ID3)
,回归任务中可选择"squared_error"
或"absolute_error"
。
- 决定树的分裂标准。分类任务中可选择
-
max_depth:默认值为
None
- 决定决策树的最大深度。如果不设置,树会一直生长直到叶子节点中的样本数小于
min_samples_split
或叶子节点纯度足够高。
- 决定决策树的最大深度。如果不设置,树会一直生长直到叶子节点中的样本数小于
-
min_samples_split:默认值为 2
- 内部节点再划分所需的最小样本数。可以控制树的生长,防止过拟合。
-
min_samples_leaf:默认值为 1
- 叶子节点最少包含的样本数。设置较大的值可以让模型更加保守,防止过拟合。
-
max_features:默认值为
"sqrt"
(分类)和1.0
(回归)- 在每次分裂时考虑的最大特征数。分类任务中,默认使用特征数的平方根;回归任务中,默认使用全部特征。
-
bootstrap:默认值为
True
- 是否使用 Bootstrap 采样。如果设为
False
,则使用所有样本构建每棵树。
- 是否使用 Bootstrap 采样。如果设为
-
oob_score:默认值为
False
- 是否使用袋外样本(Out-of-Bag samples)来估计模型的泛化误差。启用该参数可以在不使用交叉验证的情况下估计模型性能。
-
n_jobs:默认值为
None
- 并行化构建决策树的数量。可以设置为 -1 使用所有的 CPU 核心来加速训练。
-
random_state:默认值为
None
- 设置随机数种子,确保模型在每次运行时的行为一致性。
三 Boosting 方法
Boosting :又称提升法是一种 串行训练 多个模型的方法, 每次训练时, 将重点放在前一轮 被错误分类 的样本上, 使 后续模型 能够更好的 纠正前面模型的错误, 从而 逐步提高 模型整体预测的准确性. 最后将 所有模型的输出 加权组合成 最终的预测结果.
代表算法如下3个
3.1 AdaBoost
3.1.1思想
AdaBoost(AdaptiveBoosting 自适应提升) 是一种基于 加权 的集成学习算法.
算法思想: AdaBoost 是一种基于 样本加权 的集成学习方法,通过迭代 构建多个弱分类器 来生成 一个强分类器。在每次迭代中,算法会根据 前一个弱分类器的分类结果 调整 训练样本的权重 ——对错分样本的权重进行增加,降低正确样本的权重,这样后续的 弱分类器会更加关注这些 难以分类的样本。最终,所有弱分类器通过 加权投票 的方式整合其预测结果,形成一个强分类器。弱分类器通常是决策树桩(深度为1的决策树),并且 加权投票 是根据 每个弱分类器 的 错误率 来进行的,错误率较低 的分类器 赋予更大的权重。
3.1.2API
在 scikit-learn
中, 通过 ensemble
中的 AdaBoostClassifier
实现
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
# 创建弱分类器
base_clf = DecisionTreeClassifier(max_depth=1)
# 创建 AdaBoost 模型
ada_clf = AdaBoostClassifier(base_estimator=base_clf, n_estimators=50, random_state=42)
# 训练模型
ada_clf.fit(X_train, y_train)
# 预测
y_pred = ada_clf.predict(X_test)
# 输出准确率
print(f"Accuracy: {ada_clf.score(X_test, y_test)}")
3.2 GBDT
3.2.1思想
梯度提升决策树(GradientBoostingDecisionTree) 是一种基于 梯度残差的集成学习方法 .
描述:通过迭代多个 弱学习器(通常是决策树),以 最小化预测值和真实值之间的误差。在每次迭代中,GBDT根据当前模型的残差(误差)拟合新的学习器,而不是像 AdaBoost那样调整样本权重。每个新学习器致力于 减少前一个模型的 预测误差,所有弱学习器的 预测结果 通过 加权累加 整合成一个 强学习器。
优缺点: GBDT 的优点在于它灵活地支持不同的损失函数,且通常表现出强大的回归和分类能力,但由于是串行构建弱学习器,训练速度较慢且容易出现过拟合。
3.2.2API
使用 scikit-learn
中 GBDT 的回归示例
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 生成数据集
X, y = make_regression(n_samples=1000, n_features=10, noise=0.1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建 GBDT 模型
gbdt = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
# 训练模型
gbdt.fit(X_train, y_train)
# 预测
y_pred = gbdt.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
常用参数
在 scikit-learn
中,GBDT 由 GradientBoostingClassifier
(分类)和 GradientBoostingRegressor
(回归)实现。常用的超参数包括:
- n_estimators:默认值为 100
- 弱学习器(决策树)的数量。增加此值会提升模型的性能,但也可能导致过拟合。
- learning_rate:默认值为 0.1
- 学习率用于缩减每个弱学习器的贡献。较低的学习率需要更多的树才能达到相同的效果。
- max_depth:默认值为 3
- 每棵决策树的最大深度。控制单棵树的复杂度,防止模型过拟合。
- subsample:默认值为 1.0
- 每棵树构建时使用的样本比例。较低的值可以引入更多的随机性,增强模型的泛化能力。
- min_samples_split:默认值为 2
- 决策树节点再分裂所需的最小样本数。较大的值可以使树更加保守,防止过拟合。
- min_samples_leaf:默认值为 1
- 叶节点最少样本数。较大的值会减少模型复杂度,防止过拟合。
- max_features:默认值为
None
- 构建每棵树时考虑的最大特征数。可以设置为 “auto”, “sqrt”, 或 “log2” 来引入随机性。
- loss:默认值为
"deviance"
- 损失函数。分类任务中通常为 “deviance”(即逻辑损失),回归任务可选择
"ls"
(平方误差)或"lad"
(绝对误差)。
- 损失函数。分类任务中通常为 “deviance”(即逻辑损失),回归任务可选择
- random_state:默认值为
None
- 控制随机数生成,确保结果的可重复性。
- warm_start:默认值为
False
- 是否使用之前训练的模型进行训练(增量训练)。设为
True
可以在已有模型的基础上增加新的弱学习器。
- 是否使用之前训练的模型进行训练(增量训练)。设为
3.3 XGBoost
3.3.1思想
XGBoost(Extreme Gradient Boosting 极限提升树) 是一种基于 梯度残差并结合正则化与并行化 的集成学习方法.
描述: 通过 逐步拟合多个弱学习器(通常是决策树)来优化模型的预测精度。在每次迭代中,XGBoost 通过 最小化损失函数和正则化项构建新的弱学习器,修正前一轮模型的残差。与 GBDT 相比,XGBoost 在正则化、并行化、特征采样、学习率缩减等方面进行了改进,能够有效防止过拟合并提升训练速度。最终,多个弱学习器通过累加其预测结果生成强学习器,广泛应用于大规模数据集和高维特征任务中。
XGBoost 算法的核心: XGBoost 是在 GBDT 的基础上引入了一些优化,来提升效率和表现。其主要框架仍然遵循 梯度提升 的步骤。
应用: XGBoost 被广泛应用于 Kaggle 竞赛、金融预测、广告点击率预测等领域,尤其在需要高精度模型的任务中表现出色。
优缺点:
XGBoost 的优点
1. 高效的计算能力: XGBoost 在多核 CPU 上并行训练,同时支持分布式计算,大大提高了训练速度。
2. 支持正则化: 相比传统的 GBDT,XGBoost 通过引入 \( L_1 \) 和 \( L_2 \) 正则化,避免了模型的过拟合。
3. 学习率与收缩: XGBoost 使用学习率控制每棵树的贡献,确保模型不会过度拟合。
4. 支持缺失值处理: XGBoost 通过自动学习最佳的缺失值处理策略来应对缺失值。
5. 列采样: 类似于随机森林中的特征采样,XGBoost 的列采样能进一步减少过拟合,提升模型泛化能力。
6. 自定义损失函数: XGBoost 可以灵活地接受用户自定义的损失函数。
3.3.2API
使用 XGBoost
进行分类任务的简单例子
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
# 创建XGBoost分类器
model = xgb.XGBClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.4f}")
常用参数
XGBoost 的实现是通过 xgboost.XGBClassifier (分类任务)和 xgboost.XGBRegressor(回归任务)
- n_estimators:默认值为 100
- 树的数量,也称为 boosting 轮数。
- learning_rate(或
eta
):默认值为 0.3- 学习率,用于缩小每棵树的贡献值。较小的值通常需要更多的 boosting 轮数来达到相同效果。
- max_depth:默认值为 6
- 控制每棵树的最大深度。较大的深度会使模型更复杂,但也可能导致过拟合。
- subsample:默认值为 1
- 每棵树随机使用的训练样本比例,类似于 GBDT 中的
subsample
,用于减少过拟合。
- 每棵树随机使用的训练样本比例,类似于 GBDT 中的
- colsample_bytree:默认值为 1
- 每棵树随机使用的特征比例。可以通过降低此值来引入更多随机性,提高模型的泛化能力。
- colsample_bylevel:默认值为 1
- 每个树的每一层使用的特征比例。进一步增加随机性。
- reg_alpha:默认值为 0
- L1 正则化项,用于控制模型的稀疏性。较大的值可以减少模型的复杂度。
- reg_lambda:默认值为 1
- L2 正则化项,用于控制模型的权重值。较大的值会让模型更保守,防止过拟合。
- gamma:默认值为 0
- 节点分裂所需的最小损失下降值。值越大,算法越保守。
- objective:默认值为
binary:logistic
- 定义损失函数。例如:
binary:logistic
:用于二分类的逻辑回归。multi:softmax
:用于多分类任务,输出离散的类别值。reg:squarederror
:用于回归任务的平方误差。
- 定义损失函数。例如:
- scale_pos_weight:默认值为 1
- 适用于类别不平衡的数据。通常设为负类样本数/正类样本数,以平衡数据。
- eval_metric:默认值为
logloss
(分类)和rmse
(回归)- 评估指标。例如:
auc
、logloss
、rmse
。
- 评估指标。例如:
- seed:默认值为 0
- 控制随机数生成,确保结果的可重复性。
在仿生学中我们根据小鸟的灵感创造了飞机,通过生物神经元抽象出了神经网络.其实人本身也是一个模型需要不断的训练和提升.
好了,以上就是今天和大家分享的机器学习中关于集成学习算法的内容,有兴趣的小伙伴可以点赞关注哦,持续更新中…