✨ 欢迎关注 ✨
本节介绍: 回归模型基于熵权法与TOPSIS的多子模型训练与权重赋值优化融合 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。 获取 前请咨询,避免不必要的问题
✨ 相关信息 ✨
该篇推文的灵感来自于往期推文——顶刊复现:通过TOPSIS赋权优化多模型融合的SHAP解释提升模型透明性,该文献是二分类模型进行实现,在这里修改为回归模型,并引入熵权法确定各指标的权重,具体实现方法如下:
对多个回归模型(如决策树、随机森林、XGBoost、LightGBM、SVM、GBDT 和神经网络)进行训练,并通过网格搜索优化其超参数。然后,使用验证集评估每个模型的表现,计算其MSE、RMSE、MAE、R² 等指标。接着,采用熵权法和TOPSIS方法计算每个模型的权重,并根据权重进行加权融合,构建一个集成回归模型。最后,集成模型通过加权平均各子模型的预测结果,提升整体的预测性能,更多细节通过代码讲解
✨ 基础代码 ✨
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('2025-8-15公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
X = df.drop(['Y'], axis=1)
y = df['Y'] # 目标变量
# 划分训练集和测试集,测试集占 20%
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=1314520)
# 然后将训练集进一步划分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=1314520)
from sklearn.preprocessing import StandardScaler
# 初始化标准化器
scaler = StandardScaler()
# 在训练集上拟合,并转换训练集
X_train_scaled = scaler.fit_transform(X_train)
# 用训练集拟合得到的scaler来转换验证集和测试集
X_val_scaled = scaler.transform(X_val)
X_test_scaled = scaler.transform(X_test)
将数据集分为训练集、验证集和测试集,验证集主要用于模型权重的获取,并对所有数据进行标准化处理,以确保后续模型(如SVM和ANN)能够有效处理不同量纲的特征
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV
# 初始化决策树回归模型
dt_model = DecisionTreeRegressor(random_state=42)
# 设置网格搜索的参数范围
param_grid = {
'criterion': ['mse', 'friedman_mse'], # 回归模型的划分标准
'max_depth': [None, 10, 20, 30, 40], # 树的最大深度
'min_samples_split': [2, 5, 10], # 内部节点再划分所需的最小样本数
'min_samples_leaf': [1, 2, 4], # 叶子节点的最小样本数
'max_features': [None, 'sqrt', 'log2'] # 每次划分时考虑的最大特征数
}
# 创建GridSearchCV对象,进行K折交叉验证,选择最优参数
grid_search = GridSearchCV(estimator=dt_model, param_grid=param_grid, cv=5, n_jobs=-1, verbose=1)
# 训练网格搜索模型
grid_search.fit(X_train_scaled, y_train)
# 输出最优参数
print(f"最优参数:{grid_search.best_params_}")
# 使用最优参数建立最终决策树回归模型
best_dt_model = grid_search.best_estimator_
使用网格搜索 (GridSearchCV) 对决策树回归模型进行超参数优化,通过5折交叉验证选择最佳参数,并基于最佳参数训练出最终的决策树回归模型
Fitting 5 folds for each of 270 candidates, totalling 1350 fits
最优参数:{'criterion': 'friedman_mse', 'max_depth': 10, 'max_features': None, 'min_samples_leaf': 1, 'min_samples_split': 10}
在进行5折交叉验证和270个候选参数组合(通过网格搜索的 param_grid)的训练过程中,总共进行1350次训练(5 折交叉验证 × 270 个候选参数组合)。最终,模型选择的最佳超参数组合,决策树回归模型使用friedman_mse划分标准,最大深度为10,考虑所有特征进行分割,叶子节点最少1个样本,内部节点最少10个样本才划分,以防止过拟合
from sklearn.ensemble import RandomForestRegressor
# 初始化随机森林回归模型
rf_model = RandomForestRegressor(random_state=42)
# 设置网格搜索的参数范围
param_grid = {
'n_estimators': [50, 100, 200], # 树的数量
'criterion': ['mse', 'friedman_mse'], # 划分标准(回归任务)
'max_depth': [None, 10, 20, 30, 40], # 树的最大深度
'min_samples_split': [2, 5, 10], # 内部节点再划分所需的最小样本数
'min_samples_leaf': [1, 2, 4], # 叶子节点的最小样本数
'max_features': [None, 'sqrt', 'log2'] # 每次划分时考虑的最大特征数
}
# 创建GridSearchCV对象,进行K折交叉验证,选择最优参数
grid_search = GridSearchCV(estimator=rf_model, param_grid=param_grid, cv=5, n_jobs=-1, verbose=1)
# 训练网格搜索模型
grid_search.fit(X_train_scaled, y_train)
# 输出最优参数
print(f"最优参数:{grid_search.best_params_}")
# 使用最优参数建立最终随机森林回归模型
best_rf_model = grid_search.best_estimator_
Fitting 5 folds for each of 810 candidates, totalling 4050 fits
最优参数:{'criterion': 'friedman_mse', 'max_depth': None, 'max_features': 'log2', 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 200}
Selection deleted
使用网格搜索 (GridSearchCV) 对随机森林回归模型进行超参数优化,选择最佳的模型参数,并通过交叉验证训练出最终的最优模型,逻辑与前面决策树回归模型的训练过程类似,接下来同样的逻辑对剩下的几个子模型进行训练即可
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from scipy.stats import pearsonr
models = {
'DT': best_dt_model,
'RF': best_rf_model,
'XGB': best_xgb_model,
'LGBM': best_lgbm_model,
'SVM': best_svm_model,
'GBDT': best_gbdt_reg,
'ANN': best_model_ann
}
# 初始化一个空的DataFrame来存放评估指标
metrics_df = pd.DataFrame(columns=['MSE', 'RMSE', 'MAE', 'R2', 'Pearson'])
# 计算每个模型在验证集上的评估指标
for model_name, model in models.items():
y_pred = model.predict(X_val_scaled)
mse = mean_squared_error(y_val, y_pred)
rmse = np.sqrt(mse)
mae = mean_absolute_error(y_val, y_pred)
r2 = r2_score(y_val, y_pred)
# 皮尔逊相关系数(scipy 的 pearsonr 返回系数和 p 值,这里取系数)
pearson_corr, _ = pearsonr(y_val, y_pred)
metrics_df.loc[model_name] = [mse, rmse, mae, r2, pearson_corr]
metrics_df
计算各个回归模型在验证集上的多个评估指标(如MSE、RMSE、MAE、R2和皮尔逊相关系数),并将这些指标作为输入应用熵权法和TOPSIS方法来计算各个子模型的权重
熵权法:根据每个模型评估指标的差异程度(熵值),来确定每个指标的权重。熵值越低,说明该指标的信息越有用,权重越高,当然也可以像前一篇TOPSIS文章一样默认各个指标的权重相等
TOPSIS法:基于各个指标的评分,计算每个模型的综合得分,从而得出每个模型的排名
这两个方法结合使用时,通过熵权法来为每个指标分配权重,再利用TOPSIS法得出最终模型的综合评分和排名,从而帮助赋予每个子模型相应的权重帮助进行模型融合,更多细节参考完整代码
Result
结果展示了多个回归模型(如DT、RF、XGB、LGBM等)在评估指标下的表现,重点关注正理想解、负理想解、综合得分指标及其百分比占比和排名。其他模型的具体评价指标是经过实际的数据预处理进行变化了的,真实值在上面metrics_df中展示
# 初始化集成回归模型
ensemble_model = EnsembleModel(models=models, weights=Result['百分比占比'].values)
ensemble_model.fit(X_train_scaled, y_train)
这里定义一个集成回归模型,通过对多个基学习器的加权预测结果进行集成,权重由TOPSIS方法计算得到,并在训练数据上进行训练
# 获取每个模型的权重
model_weights = ensemble_model.get_model_weights()
model_weights
调用get_model_weights()方法获取并返回集成模型中每个基学习器的名称及其对应的权重
{'DT': 0.01224706792563413,
'RF': 0.1810891218908141,
'XGB': 0.2345968061001126,
'LGBM': 0.256657723491482,
'SVM': 0.04272858790149892,
'GBDT': 0.21594994456118274,
'ANN': 0.05673074812927554}
这些权重是通过TOPSIS方法计算得出的,表示各个模型在最终预测结果中的重要程度。权重越大,模型的预测结果对集成模型的影响越大,集成模型的预测值计算公式如下:
ensemble_model_prediction=(0.012×DT_prediction)+(0.181×RF_prediction)+(0.235×XGB_prediction)+(0.257×LGBM_prediction)+(0.043×SVM_prediction)+(0.216×GBDT_prediction)+(0.057×ANN_prediction)
通过将每个模型的预测结果乘以这些权重(保留三位小数),然后相加,得到最终的集成模型预测值,这就是集成原理
def evaluate_models(models, ensemble_model, X, y, dataset_type="test"):
# 初始化字典来保存每个模型的评估指标
results = {
'Model': [],
'MSE': [],
'RMSE': [],
'MAE': [],
'R2': [],
'Pearson': []
}
# 评估集成模型
ensemble_pred = ensemble_model.predict(X)
results['Model'].append('Ensemble')
results['MSE'].append(mean_squared_error(y, ensemble_pred))
results['RMSE'].append(np.sqrt(mean_squared_error(y, ensemble_pred)))
results['MAE'].append(mean_absolute_error(y, ensemble_pred))
results['R2'].append(r2_score(y, ensemble_pred))
results['Pearson'].append(pearsonr(y, ensemble_pred)[0])
# 评估每个基学习器模型
for model_name, model in models.items():
model_pred = model.predict(X)
results['Model'].append(model_name)
results['MSE'].append(mean_squared_error(y, model_pred))
results['RMSE'].append(np.sqrt(mean_squared_error(y, model_pred)))
results['MAE'].append(mean_absolute_error(y, model_pred))
results['R2'].append(r2_score(y, model_pred))
results['Pearson'].append(pearsonr(y, model_pred)[0])
# 将结果转换为DataFrame
results_df = pd.DataFrame(results)
# 打印或返回数据集类型
print(f"Evaluating models on {dataset_type} data:")
return results_df
# 对测试集进行评估:
results_test = evaluate_models(models, ensemble_model, X_test_scaled, y_test, dataset_type="test")
results_test
# 对训练集进行评估:
results_train = evaluate_models(models, ensemble_model, X_train_scaled, y_train, dataset_type="train")
results_train
定义一个函数evaluate_models,用于评估集成模型和每个基学习器在指定数据集(如测试集)上的表现,并计算多个评估指标(如MSE、RMSE、MAE、R2、Pearson相关系数)
这两个结果可以看出,集成模型在测试集上的表现明显优于大部分单一模型。虽然相对于RF模型而言在测试集上 evaluate_models拟合优度只比其好一点,在训练集上 evaluate_models又比其小一点,虽然不是巨大提升但是过拟合也有一点减缓,所以这种集成方法通过结合多个模型的预测结果,能够弥补单个模型的不足,取得更加稳定和高效的预测效果。然而,需要强调的是,这些结果仅基于当前的模拟数据集,在不同的数据集上,各个模型的表现可能会有所不同。因此,最终选择使用哪种模型还需根据实际情况和数据集特性进行评估
最后遍历多个回归模型,绘制每个模型在训练集和测试集上的真实值与预测值的散点图,并添加回归线和R²值,进行可视化展示
当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息
✨ 该文章案例 ✨
在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。
同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。
✨ 介绍 ✨
本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。
更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。
✨ 群友反馈 ✨
✨ 淘宝店铺 ✨
请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!
往期推荐
顶刊复现:通过TOPSIS赋权优化多模型融合的SHAP解释提升模型透明性
顶刊复现:基于TOPSIS赋权的多模型融合方法及其优化应用提升模型预测性能
digital medicine复现:缺失值过滤、方差过滤、缺失值插补、相关系数与逐步特征选择
期刊复现:XGBoost模型采用Early Stopping策略提高模型的泛化能力减少过拟合
期刊复现:基于Pearson相关分析与SHAP评估特征重要性优化特征减少冗余
期刊复现:基于贝叶斯优化的XGBoost模型与SHAP解释特征阈值的非线性分析
期刊复现:使用SHAP解释深度学习卷积神经网络(CNN)在多分类任务中的决策过程
一区IF6.2期刊复现①:LightGBM特征重要性及部分依赖分析进行模型解读
一区IF6.2期刊复现②:最优模型LightGBM组图SHAP揭示关键特征影响力机制
一区IF6.2期刊复现③:最优模型LightGBM基于网络的糖尿病风险预测计算器Web部署
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考