
如何高效爬取全球新闻网站 – 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集
GBDT、LightGBM、XGBoost 和 AdaBoost 都属于提升树 (Boosting) 算法。它们通过逐步训练一系列弱学习器(通常是决策树),并将这些弱学习器组合成一个强学习器,以提高模型的准确性。其主要优势包括对复杂数据结构的建模能力强、较高的预测精度以及能够处理缺失值和非线性关系。相比之下,LightGBM 和 XGBoost 在计算效率和内存利用上有显著提升,适合大规模数据处理。
那下面,咱们一起来具体看看各个算法,也进行一个比较~
GBDT(梯度提升决策树)是通过构建一系列决策树,逐步减少模型的误差。每棵树都是在前一棵树的残差基础上构建的。
优点:
缺点:
LightGBM 是一种高效的梯度提升框架,专注于快速训练和低内存使用。它采用了基于直方图的决策树学习算法,显著提高了效率。
LightGBM 的核心与 GBDT 相同,但在优化方面进行了改进。它引入了基于直方图的算法,将连续值离散化,从而加快了训练速度并降低了内存消耗。
优点:
缺点:
XGBoost 是一种高效的梯度提升框架,优化了传统的 GBDT,并引入了正则化项以防止过拟合。
优点:
缺点:
AdaBoost(Adaptive Boosting)通过结合多个弱分类器来提高分类性能。每个分类器的权重由其错误率决定,后续分类器更关注前面分类器错误分类的样本。
优点:
缺点:
这里,咱们是一个使用 GBDT、LightGBM、XGBoost 和 AdaBoost 的完整示例。
整个这个示例将涵盖以下内容:
我们将使用以下包:
scikit-learn
:用于 GBDT 和 AdaBoost。lightgbm
:用于 LightGBM。xgboost
:用于 XGBoost。matplotlib
和 seaborn
:用于数据可视化。我们将生成一个合成的回归数据集,以便比较不同模型的性能。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import lightgbm as lgb
import xgboost as xgb
from sklearn.ensemble import GradientBoostingRegressor, AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
# 生成合成数据
X, y = make_regression(n_samples=1000, n_features=10, 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)
# 转换为 DataFrame 以便绘图
df_train = pd.DataFrame(X_train, columns=[f"feature_{i}" for i in range(X_train.shape[1])])
df_train['target'] = y_train
df_test = pd.DataFrame(X_test, columns=[f"feature_{i}" for i in range(X_test.shape[1])])
df_test['target'] = y_test
# 1. Gradient Boosting Decision Tree (GBDT)
gbdt_model = GradientBoostingRegressor(n_estimators=100, random_state=42)
gbdt_model.fit(X_train, y_train)
y_pred_gbdt = gbdt_model.predict(X_test)
# 2. LightGBM
lgb_model = lgb.LGBMRegressor(n_estimators=100, random_state=42)
lgb_model.fit(X_train, y_train)
y_pred_lgb = lgb_model.predict(X_test)
# 3. XGBoost
xgb_model = xgb.XGBRegressor(n_estimators=100, random_state=42)
xgb_model.fit(X_train, y_train)
y_pred_xgb = xgb_model.predict(X_test)
# 4. AdaBoost
ada_model = AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=3), n_estimators=100, random_state=42)
ada_model.fit(X_train, y_train)
y_pred_ada = ada_model.predict(X_test)
def evaluate_model(y_true, y_pred, model_name):
mse = mean_squared_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"{model_name} - MSE: {mse:.4f}, R2: {r2:.4f}")
print("Performance Comparison:")
evaluate_model(y_test, y_pred_gbdt, "GBDT")
evaluate_model(y_test, y_pred_lgb, "LightGBM")
evaluate_model(y_test, y_pred_xgb, "XGBoost")
evaluate_model(y_test, y_pred_ada, "AdaBoost")
我们将绘制模型的预测结果与实际值的对比图,并绘制预测值的分布图。
plt.style.use('ggplot') # 使用有效的样式
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()
def plot_predictions(ax, y_true, y_pred, model_name):
sns.scatterplot(x=y_true, y=y_pred, ax=ax)
ax.plot([min(y_true), max(y_true)], [min(y_true), max(y_true)], 'k--', label='Perfect Prediction')
ax.set_title(f'{model_name} Predictions vs Actual')
ax.set_xlabel('Actual Values')
ax.set_ylabel('Predicted Values')
ax.legend()
# 预测与实际值对比
plot_predictions(axes[0], y_test, y_pred_gbdt, 'GBDT')
plot_predictions(axes[1], y_test, y_pred_lgb, 'LightGBM')
plot_predictions(axes[2], y_test, y_pred_xgb, 'XGBoost')
plot_predictions(axes[3], y_test, y_pred_ada, 'AdaBoost')
plt.tight_layout()
plt.show()
# 预测值分布图
fig, axes = plt.subplots(2, 2, figsize=(16, 12))
axes = axes.flatten()
def plot_prediction_distribution(ax, y_pred, model_name):
sns.histplot(y_pred, ax=ax, kde=True, bins=30)
ax.set_title(f'{model_name} Predicted Values Distribution')
ax.set_xlabel('Predicted Values')
ax.set_ylabel('Frequency')
# 绘制预测值的分布
plot_prediction_distribution(axes[0], y_pred_gbdt, 'GBDT')
plot_prediction_distribution(axes[1], y_pred_lgb, 'LightGBM')
plot_prediction_distribution(axes[2], y_pred_xgb, 'XGBoost')
plot_prediction_distribution(axes[3], y_pred_ada, 'AdaBoost')
plt.tight_layout()
plt.show()
可视化部分:
预测与实际值对比:
预测值分布图:
针对 GBDT、LightGBM、XGBoost 和 AdaBoost 的调参细节以及每种方法的建议参数范围和优化技巧。
GBDT 通常使用 sklearn
的 GradientBoostingRegressor
来实现。主要调参项包括:
n_estimators
: 树的数量。增加数量可以提高模型的性能,但会增加计算时间和可能导致过拟合。推荐范围:100
到 1000
。learning_rate
: 学习率。控制每棵树对最终预测的贡献。较小的学习率可以提高模型的性能,但需要更多的树。推荐范围:0.01
到 0.2
。max_depth
: 每棵树的最大深度。限制树的深度可以防止过拟合。推荐范围:3
到 10
。min_samples_split
: 每个内部节点的最小样本数,用于进行分裂。增加此值可以防止过拟合。推荐范围:2
到 20
。min_samples_leaf
: 每个叶子节点的最小样本数。增加此值也可以防止过拟合。推荐范围:1
到 20
。subsample
: 每棵树训练时使用的样本比例。推荐范围:0.5
到 1.0
。调参技巧:
GridSearchCV
)或随机搜索(RandomizedSearchCV
)来寻找最佳超参数。n_estimators
的值,调整 learning_rate
和 max_depth
,然后调整其他参数。LightGBM 是一个高效的梯度提升框架,适用于大规模数据。主要调参项包括:
num_leaves
: 每棵树的叶子数量。更多的叶子可能导致过拟合。推荐范围:20
到 300
。learning_rate
: 学习率。较小的学习率与更多的树结合使用。推荐范围:0.01
到 0.2
。n_estimators
: 树的数量。推荐范围:100
到 1000
。max_depth
: 树的最大深度。推荐范围:-1
(无限制)到 20
。min_child_samples
: 每个叶子上的最小样本数。推荐范围:10
到 100
。subsample
: 训练样本的比例。推荐范围:0.5
到 1.0
。colsample_bytree
: 每棵树的特征比例。推荐范围:0.5
到 1.0
。调参技巧:
lgb.cv
)来选择最佳超参数。optuna
等库来进行超参数优化。XGBoost 是另一种流行的梯度提升框架。主要调参项包括:
n_estimators
: 树的数量。推荐范围:100
到 1000
。learning_rate
: 学习率。推荐范围:0.01
到 0.2
。max_depth
: 树的最大深度。推荐范围:3
到 10
。min_child_weight
: 每个叶子节点的最小样本权重。推荐范围:1
到 10
。subsample
: 训练样本的比例。推荐范围:0.5
到 1.0
。colsample_bytree
: 每棵树的特征比例。推荐范围:0.5
到 1.0
。gamma
: 节点分裂所需的最小损失函数下降值。推荐范围:0
到 5
。调参技巧:
xgb.cv
)来选择最佳超参数。GridSearchCV
或 RandomizedSearchCV
来找到最佳参数组合。AdaBoost 是一种提升方法,通过调整每个样本的权重来提高模型性能。主要调参项包括:
n_estimators
: 基学习器的数量。推荐范围:50
到 500
。learning_rate
: 学习率。控制每个基学习器的贡献。推荐范围:0.01
到 1.0
。base_estimator
: 基学习器。常用的基学习器是 DecisionTreeRegressor
,可以设置其参数,如 max_depth
。调参技巧:
DecisionTreeRegressor
的 max_depth
)会影响模型性能,适当调整。假设我们使用网格搜索来调整 GBDT 的超参数:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'n_estimators': [100, 200, 300],
'learning_rate': [0.01, 0.1, 0.2],
'max_depth': [3, 5, 7],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 5]
}
# 创建模型
gbdt = GradientBoostingRegressor()
# 使用网格搜索进行调参
grid_search = GridSearchCV(estimator=gbdt, param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 输出最佳参数
print("Best parameters found: ", grid_search.best_params_)
大家可以对 LightGBM 和 XGBoost 进行类似的调参,只需使用相应的模型和参数网格。
调参是一个迭代的过程,通常需要多次实验才能找到最佳参数组合。希望这些细节和技巧能帮助大家在自己实际的实验中,可以得到一些启发!~