【集成学习】基于python的stacking回归预测

1 回归模型

当涉及到线性回归、岭回归、套索回归、决策树回归、随机森林回归、梯度提升回归和支持向量机回归模型的原理时,我们可以按照以下方式清晰地解释它们:

1.1 线性回归

线性回归是利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。其表达形式为 y=w'x+e,其中 e 为误差,服从均值为0的正态分布。线性回归模型可以是一元或多元的,依赖于自变量的数量。

1.2 岭回归(Ridge Regression)

岭回归是一种处理具有多重共线性问题的线性回归分析技术。它通过引入一个调节参数λ(通常大于0),对回归系数的幅度进行限制,从而提高回归模型的泛化能力。岭回归的原理可以概括为:

  1. 收缩方法:通过限制回归系数的幅度来减少过拟合。
  2. λ参数的重要性:λ取值太小可能导致过拟合,取值过大可能导致欠拟合。
  3. 数学技术:基于特征值分解的方法,将原始的最小二乘问题转化为带有约束条件的最小二乘问题。
1.3 套索回归(Lasso Regression)

套索回归是一种线性回归技术,它通过最小化误差平方和并加入L1惩罚项来限制模型系数,以减少变量数量并提高模型的预测能力和泛化性能。L1惩罚项可以表示为 λ∑|w_j|,其中λ是惩罚系数,控制惩罚项的强度。

1.4 决策树回归

决策树回归是一种非参数回归方法,它通过递归地二分回归空间来构建预测模型。其基本原理包括:

  1. 递归划分:通过递归地选择最佳划分特征来划分数据。
  2. 特征选择:在每个分支点根据特征选择最优切分变量和切分点。
  3. 预测值:终端节点区域的均值即为该数据的预测值。
1.5 随机森林回归

随机森林回归是一种基于集成学习的算法,它通过构建多个决策树并将它们的预测结果进行集成来进行回归任务。其基本原理包括:

  1. 随机选择样本和特征:从原始训练集中随机选择样本和特征来构建每棵决策树。
  2. 构建决策树:在每个子样本集上使用决策树算法构建决策树。
  3. 集成预测:将多棵决策树的预测结果进行平均或加权平均,得到最终的回归结果。
1.6 梯度提升回归(Gradient Boosting Regression)

梯度提升回归是一种基于集成学习的方法,它通过结合多个弱学习器(通常是决策树)来构建强大的模型。其基本原理包括:

  1. 弱学习器:使用决策树等作为基学习器。
  2. 提升算法:通过迭代训练,每一轮训练都调整学习器的权重,使之前训练不好的样本在后续训练中得到更多关注。
  3. 拟合残差:通过拟合残差来训练下一个弱学习器,逐步减小整体模型的误差。
1.7 支持向量机回归(Support Vector Machine Regression, SVR)

支持向量机回归是一种强大的机器学习算法,用于回归问题。其原理是通过最小化预测误差来拟合数据,并在拟合过程中保持一个边界(间隔),使得大部分数据点都落在这个边界之内。SVR与分类问题中的SVM有些相似,但其目标是拟合数据而不是分离数据。

2 集成学习原理

2.1 Bagging(装袋)

Bagging是一种并行式集成学习方法,它通过自助采样法(bootstrap sampling)从原始数据集中生成多个子集,然后在每个子集上训练一个基学习器,并将这些基学习器的输出通过简单投票法或平均法等方式结合起来,形成最终的预测结果。

Bagging的核心思想是利用自助采样法引入样本扰动,增加基学习器之间的差异性,从而提高集成学习的泛化能力。由于每个基学习器都是独立训练的,因此Bagging可以并行化执行,提高训练效率。

Bagging的优点在于简单、高效,并且对于不稳定的基学习器(如决策树、神经网络等)效果尤为显著。然而,Bagging对于稳定的基学习器(如线性回归、K近邻等)效果可能并不明显。

2.2 Boosting(提升)

Boosting是一种串行式集成学习方法,它通过改变训练样本的权重,使得先前学习器做错的样本在后续学习器中得到更多的关注,从而逐步提高集成学习的性能。

Boosting的代表算法有AdaBoost、GBDT(梯度提升决策树)等。AdaBoost通过调整样本权重和基学习器权重,使得基学习器能够针对特定的错误样本进行学习,从而提高集成学习的整体性能。GBDT则是通过梯度下降的方式优化损失函数,逐步逼近最优解。

Boosting的优点在于能够充分利用先前学习器的错误信息,提高集成学习的性能。然而,Boosting对噪声数据和异常值较为敏感,可能会导致过拟合。

2.3 Stacking(堆叠)

Stacking是一种将多个基学习器的预测结果作为新的特征输入到一个元学习器中进行训练的集成学习方法。Stacking的核心思想是通过将多个基学习器的预测结果作为新的特征,增加模型的复杂度,从而提高集成学习的性能。

Stacking的优点包括:

  1. 灵活性高:可以使用不同类型的基学习器进行训练,并且能够根据数据的特点选择最合适的基学习器组合。
  2. 泛化能力强:通过结合多个基学习器的预测结果,Stacking能够减少模型的偏差和方差,提高模型的泛化能力。
  3. 可解释性好:Stacking的元学习器可以基于任何类型的模型,因此可以根据需求选择具有可解释性的元学习器(如线性模型),从而提高模型的可解释性。

相比于Bagging和Boosting,Stacking的优势在于其能够充分利用不同基学习器的优点,并通过元学习器进行融合,从而得到更加准确和稳定的预测结果。此外,Stacking还能够通过交叉验证等方式避免过拟合问题,提高模型的泛化能力。

3 代码

3.1 集成学习前
python 复制代码
import pandas as pd  
import numpy as np  
from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LinearRegression, Ridge, Lasso  
from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor  
from sklearn.svm import SVR  
import matplotlib.pyplot as plt  
  
# 1. 数据准备  
df = pd.read_excel('数据集.xlsx')  
X = df.drop('label', axis=1)  # 假设 '目标变量列名' 是目标变量的列名  
y = df['label']  

# 2. 模型训练  
models = {  
    'Linear Regression': LinearRegression(),  
    'Ridge Regression': Ridge(alpha=1.0),  
    'Lasso Regression': Lasso(alpha=0.1),  
    'Decision Tree': DecisionTreeRegressor(),  
    'Random Forest': RandomForestRegressor(n_estimators=80),  
    'Gradient Boosting': GradientBoostingRegressor(n_estimators=100),  
    'Support Vector Machine': SVR(kernel='rbf', C=11, gamma=0.1)  
}  
  
predictions = {}  
for name, model in models.items():  
    model.fit(X, y)  
    predictions[name] = model.predict(X)  # 这里使用全部数据作为"测试集"  
  
# 3. 结果对比和 4. 绘制折线图  
plt.figure(figsize=(12, 6))  
  
# 绘制真实值  
plt.plot(y, label='True Values', color='red', linewidth=2)  
  
# 绘制每个模型的预测值  
for i, (name, pred) in enumerate(predictions.items()):  
    plt.plot(pred, label=name, linestyle=':', linewidth=1, marker='.')  
  
# 设置图例、标题等  
plt.legend()  
plt.title('Comparison of Regression Models')  
plt.xlabel('Sample Index')  
plt.ylabel('Target Variable')  
plt.grid(True)  
plt.show()

运行结果如图3-1所示:

图3-1 各模型预测结果对比

从图3-1可以看出决策树回归、随机森林回归、梯度提升回归、支持向量机回归预测效果较好,其他的线性回归、岭回归、套索回归都是线性回归模型,对于非线性关系预测能力较差。

3.2 集成学习

python 复制代码
import pandas as pd  
import numpy as np  
from sklearn.model_selection import train_test_split, KFold  
from sklearn.linear_model import LinearRegression, Ridge, Lasso  
from sklearn.tree import DecisionTreeRegressor  
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor  
from sklearn.svm import SVR  
from sklearn.pipeline import make_pipeline  
from sklearn.preprocessing import StandardScaler  
from sklearn.metrics import mean_squared_error  
from sklearn.base import clone  
from sklearn.ensemble import StackingRegressor  
  
# 定义基模型  
base_models = [  
    ('lr', LinearRegression()),  
    ('ridge', Ridge(alpha=1.0)),  
    ('lasso', Lasso(alpha=0.1)),  
    ('dt', DecisionTreeRegressor()),  
    ('rf', RandomForestRegressor(n_estimators=100)),  
    ('gb', GradientBoostingRegressor(n_estimators=100)),  
    ('svr', make_pipeline(StandardScaler(), SVR(kernel='rbf', C=11, gamma=0.1)))  
]  
  
# 定义元模型  
final_estimator = LinearRegression()  
  
# 实例化StackingRegressor  
stacking_regressor = StackingRegressor(  
    estimators=base_models,  
    final_estimator=final_estimator,  
    cv=KFold(n_splits=5, shuffle=True, random_state=42)  
)  
  
# 训练基模型和Stacking集成模型  
for name, model in base_models:  
    model.fit(X, y)  
  
stacking_regressor.fit(X, y)   
  
# 预测  
base_predictions = {name: model.predict(X) for name, model in base_models}  
stacking_prediction = stacking_regressor.predict(X)  
  
# 评估Stacking集成的性能(可选)  
mse_stacking = mean_squared_error(y, stacking_prediction)  
print(f"Stacking MSE: {mse_stacking}")  
  
# 绘制折线图对比预测结果  
plt.figure(figsize=(12, 6))  
  
# 绘制真实值  
plt.plot(range(len(y)), y, label='True Values', color='red', linewidth=2)  
  
# 绘制每个基模型的预测值  
for i, (name, pred) in enumerate(base_predictions.items(), 1):  
    plt.plot(range(len(y)), pred, label=f'{name} Prediction', linestyle=':', linewidth=2)  
  
# 绘制Stacking集成的预测值  
plt.plot(range(len(y)), stacking_prediction, label='Stacking Prediction', color='black', linestyle='-.', linewidth=2, marker='s')  
  
# 设置图例、标题等  
plt.legend()  
plt.title('Comparison of Regression Models and Stacking')  
plt.xlabel('Sample Index')  
plt.ylabel('Target Variable')  
plt.grid(True)  
plt.show()

运行结果如图3-2:

图3-2

从图3-2可以看出stacking集成学习很好的学习了决策树回归、随机森林回归、梯度提升回归、支持向量机回归的良好经验以至于stacking学习能力极强,预测结果极好。

相关推荐
职略1 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22741 小时前
LeetCode 196, 73, 105
java·算法·leetcode
阿里巴巴P8资深技术专家2 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
zengson_g3 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
爱上电路设计3 小时前
有趣的算法
开发语言·c++·算法
2401_858120263 小时前
探索sklearn文本向量化:从词袋到深度学习的转变
开发语言·python·机器学习
算法金「全网同名」5 小时前
算法金 | 一个强大的算法模型,GPR !!
机器学习
江畔柳前堤5 小时前
CV01_相机成像原理与坐标系之间的转换
人工智能·深度学习·数码相机·机器学习·计算机视觉·lstm
qq_526099135 小时前
为什么要在成像应用中使用图像采集卡?
人工智能·数码相机·计算机视觉
码上飞扬5 小时前
深度解析:机器学习与深度学习的关系与区别
人工智能·深度学习·机器学习