计算机系统应用教程网站

网站首页 > 技术文章 正文

【Python机器学习系列】梯度提升集成:LGBM与XGB组合预测油耗

btikc 2024-10-25 10:53:47 技术文章 6 ℃ 0 评论

这是我的第368篇原创文章。

一、引言

LightGBM和XGBoost是两种高效的梯度提升决策树算法,常用于回归和分类任务,通过逐步优化模型来提升预测精度,并支持并行计算以加速训练过程,我们的组合模型通过分别训练LightGBM和XGBoost模型,然后对它们的预测结果取平均值,以进一步提高预测的准确性和稳健性。

二、实现过程

2.1 数据读取及预处理

df = pd.read_csv('dataset.csv')
df = df.iloc[:,:-1]
# 缺失值处理
df['horsepower'] = df['horsepower'].fillna(df['horsepower'].mean())
# 编码
le = LabelEncoder()
df['origin'] = le.fit_transform(df['origin'])
cols = df.columns
print(df.head())

df:

2.2 划分数据集

features = cols[1:]
target = ['mpg']
# 首先将数据集划分为训练集和测试集
X_temp, X_test, y_temp, y_test = train_test_split(df[features], df[target], test_size=0.2, random_state=42)
# 然后将训练集进一步划分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42)
# 输出数据集的大小
print(f"训练集维度: {X_train.shape}")
print(f"验证集维度: {X_val.shape}")
print(f"测试集维度: {X_test.shape}")

结果:

2.3 创建平均模型

# LightGBM模型参数
params_lgb = {
    'learning_rate': 0.02,  # 学习率,控制每一步的步长,用于防止过拟合。典型值范围:0.01 - 0.1
    'boosting_type': 'gbdt',  # 提升方法,这里使用梯度提升树(Gradient Boosting Decision Tree,简称GBDT)
    'objective': 'mse',  # 损失函数
    'metric': 'rmse',  # 评估指标
    'num_leaves': 127,  # 每棵树的叶子节点数量,控制模型复杂度。较大值可以提高模型复杂度但可能导致过拟合
    'verbose': -1,  # 控制 LightGBM 输出信息的详细程度,-1表示无输出,0表示最少输出,正数表示输出更多信息
    'seed': 42,  # 随机种子,用于重现模型的结果
    'n_jobs': -1,  # 并行运算的线程数量,-1表示使用所有可用的CPU核心
    'feature_fraction': 0.8,  # 每棵树随机选择的特征比例,用于增加模型的泛化能力
    'bagging_fraction': 0.9,  # 每次迭代时随机选择的样本比例,用于增加模型的泛化能力
    'bagging_freq': 4  # 每隔多少次迭代进行一次bagging操作,用于增加模型的泛化能力
}


# XGBoost模型参数
params_xgb = {
    'learning_rate': 0.02,  # 学习率,控制每一步的步长,用于防止过拟合。典型值范围:0.01 - 0.1
    'booster': 'gbtree',  # 提升方法,这里使用梯度提升树(Gradient Boosting Tree)
    'objective': 'reg:squarederror',  # 损失函数
    'max_leaves': 127,  # 每棵树的叶子节点数量,控制模型复杂度。较大值可以提高模型复杂度但可能导致过拟合
    'verbosity': 1,  # 控制 XGBoost 输出信息的详细程度,0表示无输出,1表示输出进度信息
    'seed': 42,  # 随机种子,用于重现模型的结果
    'nthread': -1,  # 并行运算的线程数量,-1表示使用所有可用的CPU核心
    'colsample_bytree': 0.6,  # 每棵树随机选择的特征比例,用于增加模型的泛化能力
    'subsample': 0.7,  # 每次迭代时随机选择的样本比例,用于增加模型的泛化能力
    'early_stopping_rounds': None  # 早停参数在fit时单独设置
}


model_lgb = lgb.LGBMRegressor(**params_lgb)
model_xgb = xgb.XGBRegressor(**params_xgb)
average_model = AverageModel([model_lgb, model_xgb])

2.4 训练模型

average_model.fit(X_train, y_train, X_val, y_val)

2.5 进行预测

y_test_pred = average_model.predict(X_test)
y_train_pred = average_model.predict(X_train)

2.6 模型评价

y_test_pred = np.array(y_test_pred)
mse = metrics.mean_squared_error(y_test, y_test_pred)
rmse = np.sqrt(mse)
mae = metrics.mean_absolute_error(y_test, y_test_pred)
r2 = metrics.r2_score(y_test, y_test_pred)


print("均方误差 (MSE):", mse)
print("均方根误差 (RMSE):", rmse)
print("平均绝对误差 (MAE):", mae)
print("拟合优度 (R-squared):", r2)

结果:

2.7 预测结果可视化

训练集预测值与真实值的对比:

验证集预测值与真实值的对比:

作者简介: 读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。关注gzh:数据杂坛,获取数据和源码学习更多内容。

原文链接:

【Python机器学习系列】梯度提升集成:LightGBM与XGBoost组合预测油耗(案例+源码)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表