集成学习(二):从理论到实战(附代码)
接上一篇续写《集成学习(一):从理论到实战(附代码)》
五、实用算法
5.1 随机森林
随机森林在数据集的各个子样本上拟合许多决策树分类器,并使用平均来提高预测精度和控制过拟合。每一个分类器拟合了一部分随机样本,同时也拟合一部分随机特征
通过以下两个主要步骤来构建强大的预测模型:
- Bootstrap Sampling:从原始数据集中随机抽取样本(有放回抽样),创建多个不同的子集。
- Random Feature Selection:在每个子集上训练一个决策树时,在每次分裂节点时只考虑一部分特征,而不是所有特征。这样可以增加模型的多样性,并减少过拟合的风险。
最终,对于分类问题,随机森林通常使用多数投票的方式来决定最终类别;对于回归问题,则通常使用平均值的方式来决定最终预测值。
RandomForestClassifier
和 RandomForestRegressor
是基于集成学习方法中的随机森林(Random Forest)算法实现的分类和回归模型。随机森林通过构建多个决策树并将它们的结果结合起来,以提高预测的准确性和控制过拟合。
5.1.1 RandomForestClassifier
RandomForestClassifier
用于分类任务,通过构建多个决策树分类器,并将它们的预测结果进行组合来得出最终的分类决策。
工作原理
- Bootstrap Aggregating (Bagging):对原始数据集进行有放回抽样,生成多个不同的训练子集。
- Random Feature Selection:在每个节点分裂时,只考虑一个随机选择的特征子集,而不是所有特征。
- Majority Voting:每棵树都对输入数据进行分类,最终的分类结果是所有树的分类结果中出现次数最多的类别(即多数投票)。
示例代码
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 创建合成数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义随机森林分类器
rf_clf = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
# 训练模型
rf_clf.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = rf_clf.predict(X_test)
5.1.2 RandomForestRegressor
RandomForestRegressor
用于回归任务,通过构建多个决策树回归器,并将它们的预测结果进行组合来得出最终的预测值。
工作原理
- Bootstrap Aggregating (Bagging):与分类器类似,通过对原始数据集进行有放回抽样生成多个不同的训练子集。
- Random Feature Selection:在每个节点分裂时,同样只考虑一个随机选择的特征子集。
- Average Prediction:每棵树都对输入数据进行预测,最终的预测结果是对所有树的预测结果取平均值。
示例代码
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# 创建合成数据集
X, y = make_regression(n_samples=1000, n_features=20, noise=0.1, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义随机森林回归器
rf_reg = RandomForestRegressor(n_estimators=100, max_depth=5, random_state=42)
# 训练模型
rf_reg.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = rf_reg.predict(X_test)
关键参数解释
n_estimators
:指定要构建的决策树数量。更多的树通常能带来更好的性能,但也会增加计算成本。max_depth
:设置每棵树的最大深度。限制树的深度可以帮助防止过拟合。random_state
:控制随机性,确保实验结果的可重复性。
5.1.3 总结
- RandomForestClassifier 和 RandomForestRegressor 都是基于随机森林算法的模型,分别用于解决分类和回归问题。
- 随机森林通过构建大量的决策树,并结合这些树的预测结果来提高模型的稳定性和准确性。
- 在分类任务中,采用多数投票法决定最终类别;在回归任务中,则通过平均各树的预测值得到最终预测结果。
- 随机森林的一个重要特性是其对高维数据的良好适应性以及对噪声数据的鲁棒性,使其成为实际应用中非常流行的机器学习算法之一。
5.2 XGBoost
XGBoost的核心是梯度提升决策树(Gradient Boosting Decision Trees, GBDT),但其在性能优化、正则化等方面做了很多改进,使得它在速度和效果上都优于传统的GBDT实现。以下是XGBoost的一些关键特性:
-
梯度提升:从一个初始预测开始,然后迭代地添加新的树,每棵树都在尝试修正之前所有树的预测误差。具体来说,每棵新树都是根据前一棵树的残差(即预测值与真实值之间的差异)来训练的。
-
正则化:XGBoost引入了正则项到损失函数中,帮助控制模型复杂度,减少过拟合的风险。
-
列采样和行采样:类似于随机森林,XGBoost也支持特征子集(列)采样和样本子集(行)采样,增加了模型的多样性并提高了计算效率。
-
近似树分裂:为了提高处理大规模数据集的能力,XGBoost使用了一种近似算法来寻找最佳分裂点,而不是精确搜索,这大大加快了训练过程。
-
并行处理:尽管每棵树的构建过程本质上是顺序的,XGBoost通过并行化计算每个节点的最佳分裂点来加速训练。
XGBClassifier
和 XGBRegressor
是基于XGBoost(eXtreme Gradient Boosting)算法的实现,专门用于分类和回归任务。XGBoost是一种高效的梯度提升框架,它通过构建一系列决策树并将它们组合起来以形成一个强大的预测模型。
5.2.1 XGBClassifier
XGBClassifier
适用于分类问题。它通过构建一系列决策树,并使用梯度下降的方法来最小化损失函数(如对数损失),从而逐步改善模型的预测能力。
示例代码
from xgboost import XGBClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建合成数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义XGB分类器
xgb_clf = XGBClassifier(use_label_encoder=False, eval_metric='mlogloss')
# 训练模型
xgb_clf.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = xgb_clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, predictions)
print(f"XGB Classifier Accuracy: {accuracy:.4f}")
use_label_encoder=False
:避免警告信息,因为从某些版本开始,默认情况下会使用标签编码器转换标签。eval_metric='mlogloss'
:指定评估指标为多类对数损失。
5.2.2 XGBRegressor
XGBRegressor
适用于回归问题。它的工作方式与XGBClassifier
类似,但目标是最小化回归任务中的损失函数(如均方误差)。
示例代码
from xgboost import XGBRegressor
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=20, noise=0.1, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义XGB回归器
xgb_reg = XGBRegressor()
# 训练模型
xgb_reg.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = xgb_reg.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, predictions)
print(f"XGB Regressor MSE: {mse:.4f}")
关键参数解释
n_estimators
:要构建的树的数量。更多的树通常可以带来更好的性能,但也可能增加过拟合的风险。max_depth
:每棵树的最大深度。限制树的深度可以帮助防止过拟合。learning_rate
:每次迭代时对新增加的树的重要性进行缩放的比例。较小的学习率通常需要更多的树来达到同样的效果,但它有助于提高模型的泛化能力。subsample
:用于训练每棵树的数据比例。设置小于1.0的值可以减少过拟合。colsample_bytree
:用于训练每棵树的特征比例。同样,设置小于1.0的值可以增加模型的多样性,减少过拟合。
5.2.3 总结
- XGBClassifier 和 XGBRegressor 基于XGBoost算法,分别用于解决分类和回归问题。
- XGBoost通过梯度提升方法构建一系列决策树,并通过多种技术如正则化、列采样和行采样等手段来提高模型的稳定性和泛化能力。
- 这些模型因其高效性和良好的性能,在实际应用中非常受欢迎,特别是在处理大型数据集时表现出色。
5.3 LightGBM
由微软维护,特别适合处理大数据集的机器学习算法。
终极推荐:
- 训练速度
- 推理速度
- 处理数据量
- 结果层面
- 综合来看,最优!!!!!!
LightGBM 的核心原理
-
基于梯度的单边采样 (GOSS):在传统的 GBDT 中,每次迭代都会使用全部的数据进行训练。而在 LightGBM 中,GOSS 通过保留具有较大梯度的实例,并对剩余的小梯度实例进行随机抽样来减少数据量。这种方法能够在不严重损害模型精度的情况下大幅减少数据量,从而加快训练速度。
-
互斥特征捆绑 (EFB):许多实际应用中的特征是稀疏的,且某些特征之间很少或几乎不会同时非零(即它们是互斥的)。EFB 技术利用这一点,将这些互斥特征捆绑在一起作为一个新特征,减少了特征维度,进而提高了训练速度和降低了内存消耗。
-
直方图算法:不同于传统的精确分割方法,LightGBM 使用直方图算法来寻找最佳分裂点。这意味着它不是直接计算每个可能分裂点的信息增益,而是将连续的特征值离散化为若干个区间(桶),然后基于这些区间的统计信息来决定分裂点。这种方法不仅加快了分裂点的选择过程,还支持并行处理。
-
叶子生长策略:大多数 GBDT 实现采用深度优先(Depth-wise)的增长策略,而 LightGBM 使用叶子导向(Leaf-wise)的增长策略。这意味着它会优先选择分裂那些能带来最大收益的叶子节点,而不是简单地逐层增长树。这种策略有助于生成更少但更深的树,从而可能达到更高的准确性。
LGBMClassifier
和 LGBMRegressor
是基于 LightGBM(Light Gradient Boosting Machine)框架的分类和回归模型。LightGBM 是一种梯度提升框架,它被设计用于提高传统梯度提升决策树(GBDT)的速度和效率,同时保持高准确率。LightGBM 通过引入一些创新技术,如基于梯度的单边采样(GOSS, Gradient-based One-Side Sampling)和互斥特征捆绑(EFB, Exclusive Feature Bundling),显著提高了计算效率和内存使用效率。
5.3.1 LGBMClassifier
LGBMClassifier
是专门用于解决分类问题的 LightGBM 模型。它通过上述技术构建一系列决策树,并结合这些树的结果来进行最终的分类预测。
示例代码
from lightgbm import LGBMClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 创建合成数据集
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义LGBM分类器
lgbm_clf = LGBMClassifier(n_estimators=100, learning_rate=0.1, max_depth=5, random_state=42)
# 训练模型
lgbm_clf.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = lgbm_clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, predictions)
print(f"LGBM Classifier Accuracy: {accuracy:.4f}")
5.3.2 LGBMRegressor
LGBMRegressor
是用于回归任务的 LightGBM 模型。其工作方式与 LGBMClassifier
类似,但目标是最小化回归损失函数(如均方误差)。
示例代码
from lightgbm import LGBMRegressor
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=20, noise=0.1, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义LGBM回归器
lgbm_reg = LGBMRegressor(n_estimators=100, learning_rate=0.1, max_depth=5, random_state=42)
# 训练模型
lgbm_reg.fit(X_train, y_train)
# 使用训练好的模型进行预测
predictions = lgbm_reg.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, predictions)
print(f"LGBM Regressor MSE: {mse:.4f}")
关键参数解释
n_estimators
:要构建的树的数量。更多的树通常可以带来更好的性能,但也可能增加过拟合的风险。learning_rate
:每次迭代时对新增加的树的重要性进行缩放的比例。较小的学习率通常需要更多的树来达到同样的效果,但它有助于提高模型的泛化能力。max_depth
:每棵树的最大深度。限制树的深度可以帮助防止过拟合。num_leaves
:控制树的复杂度的一个重要参数,指定了每棵树的叶子节点数。适当调整这个参数可以帮助找到平衡点,在不过度拟合的同时获得较好的模型表现。
5.3.3 总结
- LGBMClassifier 和 LGBMRegressor 基于 LightGBM 框架,分别用于解决分类和回归问题。
- LightGBM 通过多种技术创新,如 GOSS、EFB 和直方图算法,显著提高了训练速度和效率,同时保持了高准确率。
- 这些模型因其高效性和良好的性能,在处理大规模数据集时特别有用,并广泛应用于各种机器学习竞赛和实际项目中。
六、实战建议
使用 GridSearchCV
来进行超参数调优,以找到最佳的模型配置。举个例子,使用 XGBoost 的分类器 XGBClassifier
作为基础模型,并通过网格搜索来寻找最优的超参数组合。
# 自动化建模流程示例
from sklearn.model_selection import GridSearchCV
# 参数网格
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 5],
'learning_rate': [0.1, 0.05]
}
# 网格搜索
grid_search = GridSearchCV(
estimator=XGBClassifier(),
param_grid=param_grid,
scoring='accuracy',
cv=5,
n_jobs=-1
)
# 执行网格搜索:调用 `fit` 方法开始训练模型。
# `GridSearchCV` 会对 `param_grid` 中所有可能的超参数组合进行训练和评估。
# 最终,它会选择在交叉验证中表现最好的一组超参数。
grid_search.fit(X_train, y_train)
# `best_params_` 属性存储了在交叉验证中得分最高的那组超参数。
# 通过打印 `grid_search.best_params_` 可以查看这些最佳参数。
print(f"最佳参数: {grid_search.best_params_}")
代码解释
GridSearchCV
是一个用于自动化超参数调整的强大工具,它通过交叉验证(Cross-Validation)来评估不同超参数设置下的模型性能。
# 参数网格
param_grid = {
'n_estimators': [100, 200],
'max_depth': [3, 5],
'learning_rate': [0.1, 0.05]
}
定义参数网格:这里定义了一个字典 param_grid
,其中键是模型的超参数名称,值是一个列表,包含了该超参数可能取的所有值。
'n_estimators'
:表示要构建的树的数量。在这里尝试了[100, 200]
。'max_depth'
:每棵树的最大深度。在这里尝试了[3, 5]
。'learning_rate'
:每次迭代时对新增加的树的重要性进行缩放的比例。在这里尝试了[0.1, 0.05]
。
# 网格搜索
grid_search = GridSearchCV(
estimator=XGBClassifier(),
param_grid=param_grid,
scoring='accuracy',
cv=5,
n_jobs=-1
)
初始化 GridSearchCV 对象:
estimator=XGBClassifier()
:指定使用的模型为XGBClassifier
。param_grid=param_grid
:传入之前定义的参数网格。scoring='accuracy'
:指定模型评估指标为准确率(适用于分类问题)。对于回归问题,可以使用如'neg_mean_squared_error'
等其他评分标准。cv=5
:指定使用 5 折交叉验证。这意味着数据集将被分成 5 份,模型会训练 5 次,每次使用不同的 4/5 数据作为训练集,剩余的 1/5 数据作为验证集。n_jobs=-1
:利用所有可用的 CPU 核心并行计算,加快搜索速度。
总结:上面这段代码的主要目的是通过网格搜索和交叉验证自动找到 XGBClassifier
模型的最佳超参数组合。这样做有助于提高模型的性能,并避免手动逐一尝试每个超参数组合的繁琐过程。
通过设置不同的参数值范围,GridSearchCV
可以系统地探索所有可能的组合,并基于指定的评分标准(此处为准确率)选择最佳模型配置。这种方法尤其适合于寻找最优超参数设置,特别是在处理复杂或大规模数据集时。
调优策略:
- 优先调节学习率和树数量(n_estimators)
- 控制单棵树复杂度(max_depth, min_child_weight)
- 采样策略(subsample, colsample_bytree)
- 正则化参数(lambda, alpha)
- 早停法防止过拟合
七、结论与推荐
对于结构化数据或表格类数据,集成学习通常是最有效的选择。尽管深度学习在某些领域表现出色,但在处理这类数据时,集成学习往往能提供更好的结果。
- 训练速度:集成学习算法如随机森林、XGBoost和LightGBM在大多数情况下都能快速训练。
- 推理速度:这些算法也具有较快的推理速度,非常适合实时应用。
- 处理数据量:特别是LightGBM,在处理大规模数据集方面表现出色。
- 结果层面:集成学习方法通常能够提供高准确度和鲁棒性的预测结果。
算法选型指南
指标 | 随机森林 | XGBoost | LightGBM |
---|---|---|---|
训练速度 | ★★★☆☆ | ★★★★☆ | ★★★★★ |
预测速度 | ★★★☆☆ | ★★★★☆ | ★★★★★ |
内存消耗 | ★★☆☆☆ | ★★★☆☆ | ★★★★★ |
处理类别特征 | 需要编码 | 需要编码 | 原生支持 |
可解释性 | ★★★★☆ | ★★★☆☆ | ★★★☆☆ |
大数据支持 | ★★☆☆☆ | ★★★★☆ | ★★★★★ |
终极建议:
- 中小数据集:XGBoost(精度优先)
- 大数据集:LightGBM(效率优先)
- 快速原型:随机森林(易用性好)
- 类别特征多:CatBoost
- 需要可解释性:随机森林特征重要性