优秀的编程知识分享平台

网站首页 > 技术文章 正文

scikit 模型堆叠,

nanyue 2024-12-05 15:06:12 技术文章 6 ℃


这个堆叠有意思,尤其是交叉验证的训练过程,可以使用全部数据集训练 基础模型 和 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` 通过组合多个不同的模型,能够提升整体的预测性能,尤其适合复杂的回归任务。

最近发表
标签列表