网站首页 > 技术文章 正文
这个堆叠有意思,尤其是交叉验证的训练过程,可以使用全部数据集训练 基础模型 和 meta 模型,不会浪费训练数据。思想深刻。
训练过程,先训练出最后的模型,然后用全部数据训练基础模型。训练最后模型时,采用交叉验证过程。先用一部分数据训练基模型 在于剩余数据预测,产生出基础模型的结果 将结果做为输入,输送到基础模型,用于训练最后meta模型。
当然 交叉验证时,分的fold越多,训练效果越好,越耗费时间。
`scikit-learn` 中的 `StackingRegressor` 是一种集成学习方法,通过将多个回归模型“堆叠”在一起,以提高模型的预测性能。这种方法在机器学习中称为“模型堆叠”或“Stacking”,它结合了多个模型的优势来生成更强的预测器。
### StackingRegressor 的工作原理
`StackingRegressor` 主要分为以下两个层次:
1. **基础层模型(Base Models)**:多个基础回归模型(例如线性回归、随机森林、XGBoost 等)在数据上独立训练,它们的预测结果会作为输入传递给元模型。
2. **元模型(Meta Model)**:元模型使用基础模型的预测输出作为新特征进行再训练。通常元模型是一个简单的回归模型(例如线性回归),它的作用是学习基础模型预测输出的组合模式,从而进一步优化最终预测。
### 使用 `StackingRegressor` 的代码示例
以下是一个简单的 `StackingRegressor` 的用法示例:
```python
from sklearn.ensemble import StackingRegressor
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error
# 加载示例数据集
data = load_boston()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 定义基础层模型
base_models = [
('lr', LinearRegression()),
('dt', DecisionTreeRegressor(random_state=42)),
('rf', RandomForestRegressor(n_estimators=10, random_state=42))
]
# 定义元模型
meta_model = LinearRegression()
# 创建 StackingRegressor
stacking_regressor = StackingRegressor(
estimators=base_models,
final_estimator=meta_model
)
# 训练模型
stacking_regressor.fit(X_train, y_train)
# 预测与评估
y_pred = stacking_regressor.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
```
### 参数说明
- `estimators`:基础层的回归模型列表,每个模型用二元组表示,包含模型名称和模型实例。例如 `[('lr', LinearRegression()), ('rf', RandomForestRegressor())]`。
- `final_estimator`:元模型,通常选择简单的模型,如线性回归,但也可以选择其它回归模型。
- `cv`:控制模型交叉验证的次数,默认为 5。设置为 `None` 时不使用交叉验证。
### StackingRegressor 的优缺点
**优点**:
- **提升预测准确率**:通过结合多种模型的预测,通常可以获得比单一模型更好的效果。
- **减少过拟合风险**:模型堆叠增加了泛化能力,尤其在基础模型多样化的情况下。
- **模型灵活性**:支持多种基础模型和元模型,可以根据任务需求自由组合。
**缺点**:
- **计算开销大**:训练多个模型增加了计算量,尤其是当基础模型和元模型都较复杂时。
- **难以解释**:组合模型的复杂性增加了模型解释的难度。
### 应用场景
`StackingRegressor` 适合用于以下场景:
- **复杂的预测任务**:如房价预测、天气预测等,数据特征丰富且具有非线性特征。
- **模型融合需求**:当使用单一模型效果不佳时,可以通过 Stacking 结合多个模型来提升准确性。
`StackingRegressor` 是一种强大的集成方法,在许多预测任务中都能提升模型性能。
`StackingRegressor` 的训练过程是一个两阶段的流程,涉及到基础层模型的训练和元模型的训练。具体的步骤如下:
### 1. **第一阶段:训练基础层模型**
基础层由多个回归模型组成(如线性回归、决策树、随机森林等)。在第一阶段,`StackingRegressor` 会将训练数据传递给这些基础模型,并让它们独立进行训练。
- **训练过程**:每个基础模型都会使用相同的训练数据集进行训练。
- **预测输出**:训练完毕后,基础层模型会对同一组数据进行预测,生成它们各自的预测结果。
假设你有 3 个基础模型 $M_1, M_2, M_3$,它们分别在输入数据 $X$ 上进行训练,并生成各自的预测值 $P_1, P_2, P_3$。
### 2. **第二阶段:训练元模型**
第二阶段的训练集中在元模型上。元模型并不直接使用原始输入数据,而是使用基础层模型的预测结果作为新特征。
- **新特征构造**:将基础层模型的预测结果作为新特征。假设有 3 个基础模型,它们对训练数据 $X$ 生成的预测结果是 $P_1, P_2, P_3$。新的特征矩阵就是由这些预测结果构成的,即:
$
X_{\text{meta}} = [P_1, P_2, P_3]
$
- **训练元模型**:元模型(例如线性回归、支持向量机等)会使用这个新的特征矩阵 $X_{\text{meta}}$ 和原始标签 $y$ 进行训练。元模型的目标是学习如何结合这些基础层模型的输出,进一步优化预测性能。
### 3. **交叉验证与预测修正(可选)**
在一些实现中,如 `scikit-learn` 的 `StackingRegressor`,会使用交叉验证的方式生成基础模型的预测结果,以防止过拟合。这种方法能提高元模型的泛化能力,避免它在训练数据上学到不合理的模式。
- **交叉验证**:在训练基础层模型时,数据集被分成多个折(例如 5 折交叉验证)。对于每个折,基础模型在训练折上进行训练,然后对保留折进行预测。最终使用交叉验证的预测结果作为元模型的输入,而不是基础层模型在整个训练集上的预测输出。
### 4. **整体流程总结**
假设有 3 个基础回归模型 $M_1, M_2, M_3$,并且元模型为 $M_{\text{meta}}$:
1. 使用输入数据 $X$ 和目标变量 $y$ 训练基础模型 $M_1, M_2, M_3$。
2. 基础模型 $M_1, M_2, M_3$ 分别对训练数据进行预测,生成预测结果 $P_1, P_2, P_3$。
3. 将预测结果 $P_1, P_2, P_3$ 作为元模型的输入特征,用目标变量 $y$ 训练元模型 $M_{\text{meta}}$。
4. 元模型 $M_{\text{meta}}$ 学习如何结合基础模型的输出,生成最终预测。
### 5. **预测阶段**
在训练完成后,`StackingRegressor` 用于新数据的预测分为两个步骤:
1. **基础模型的预测**:对新输入数据 $X_{\text{new}}$,每个基础模型会分别生成一个预测值 $P_1^{\text{new}}, P_2^{\text{new}}, P_3^{\text{new}}$。
2. **元模型的预测**:将这些预测结果作为输入传递给元模型,元模型根据训练时学到的组合规则生成最终的预测结果。
$
\hat{y}_{\text{final}} = M_{\text{meta}}(P_1^{\text{new}}, P_2^{\text{new}}, P_3^{\text{new}})
$
### 图解流程(简化版):
```
数据 X, y
第一阶段:训练基础层模型
M1 ← X → P1
M2 ← X → P2
M3 ← X → P3
第二阶段:训练元模型
X_meta = [P1, P2, P3] → M_meta → 最终预测
```
### 核心要点
- **基础层模型的多样性**:`StackingRegressor` 通常结合不同类型的回归模型,以确保基础层模型能够捕捉数据的多样性。
- **元模型的选择**:元模型通常选用简单的回归模型,例如线性回归,因为它的任务是学习如何结合多个基础模型的预测结果。
- **交叉验证**:在堆叠过程中,交叉验证用于防止过拟合,并确保模型具有良好的泛化能力。
### 优化技巧
1. **模型多样性**:为了提高预测效果,基础层的模型应尽可能多样化,避免使用多个相似模型。
2. **交叉验证的使用**:通过交叉验证来构造元模型的训练数据,可以更有效地防止过拟合。
3. **选择合适的元模型**:元模型的任务是学习基础模型的组合,一般选择简单但稳健的模型(如线性回归)作为元模型。
`StackingRegressor` 通过组合多个不同的模型,能够提升整体的预测性能,尤其适合复杂的回归任务。
- 上一篇: 机器学习中必学的四种交叉验证技术
- 下一篇: AI实践 100问:训练集、验证集、测试集
猜你喜欢
- 2024-12-05 快乐8第24272期训练与验证
- 2024-12-05 一文彻底搞懂自动机器学习AutoML:TPOT
- 2024-12-05 中安表单识别AI训练平台的识别准确率是否可以通过测试来验证?
- 2024-12-05 基于LIBS技术的煤炭灰分、挥发分和热值定量分析及特征工程研究
- 2024-12-05 样本分布不平衡,机器学习准确率高又有什么用?
- 2024-12-05 详解3类「人工智能数据集」,数据划分原则,交叉验证法
- 2024-12-05 交叉验证(Cross-Validation)
- 2024-12-05 AI实践 100问:训练集、验证集、测试集
- 2024-12-05 机器学习中必学的四种交叉验证技术
- 2024-12-05 python机器学习:机器学习模型评价-交叉验证与留一验证
- 1510℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 541℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 497℃MySQL service启动脚本浅析(r12笔记第59天)
- 477℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 475℃启用MySQL查询缓存(mysql8.0查询缓存)
- 454℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 434℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 432℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)