【集成学习】基于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 集成学习前

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所示:

fb5d37e9493f40fd825bde7521d970b6.png

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

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

3.2 集成学习

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:

4ec551dd053b4b60aa7aa5d0c6842cb2.png

图3-2

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

 

 

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 stacking 集成学习Python 代码示例: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB # 加载数据 X, y = load_iris(return_X_y=True) # 划分训练集和验证集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化基模型 rf = RandomForestClassifier(n_estimators=50, random_state=42) lr = LogisticRegression(random_state=42) knn = KNeighborsClassifier(n_neighbors=3) nb = GaussianNB() # 训练基模型 rf.fit(X_train, y_train) lr.fit(X_train, y_train) knn.fit(X_train, y_train) nb.fit(X_train, y_train) # 使用基模型对验证集进行预测 rf_pred = rf.predict(X_test) lr_pred = lr.predict(X_test) knn_pred = knn.predict(X_test) nb_pred = nb.predict(X_test) # 计算基模型的准确率 rf_acc = accuracy_score(y_test, rf_pred) lr_acc = accuracy_score(y_test, lr_pred) knn_acc = accuracy_score(y_test, knn_pred) nb_acc = accuracy_score(y_test, nb_pred) print('Random Forest accuracy:', rf_acc) print('Logistic Regression accuracy:', lr_acc) print('KNN accuracy:', knn_acc) print('Naive Bayes accuracy:', nb_acc) # 构建元模型的训练集和验证集 train_meta = [rf_pred, lr_pred, knn_pred, nb_pred] train_meta = np.array(train_meta).T test_meta = np.column_stack((rf.predict(X_test), lr.predict(X_test), knn.predict(X_test), nb.predict(X_test))) # 初始化元模型 meta_model = RandomForestClassifier(n_estimators=50, random_state=42) # 训练元模型 meta_model.fit(train_meta, y_test) # 使用元模型对验证集进行预测 meta_pred = meta_model.predict(test_meta) # 计算元模型的准确率 meta_acc = accuracy_score(y_test, meta_pred) print('Stacking accuracy:', meta_acc) ``` 该代码使用 scikit-learn 库中的 iris 数据集演示了如何使用 stacking 集成学习。首先,将数据集划分为训练集和验证集;然后,使用随机森林、逻辑回归、KNN 和朴素贝叶斯等基模型对训练集进行训练,并在验证集上进行预测和评估;接着,将基模型的预测结果作为元特征,构建元模型的训练集和验证集;最后,使用随机森林作为元模型对验证集进行预测和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值