【集成学习】基于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 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠4 分钟前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
千天夜13 分钟前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
Debroon13 分钟前
RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法
人工智能
测试界的酸菜鱼16 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
小码农<^_^>18 分钟前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~20 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨21 分钟前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测
晨曦_子画26 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
道可云28 分钟前
道可云人工智能&元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
大数据·人工智能·3d·机器人·ar·vr