训练与预测
本章目标
- 按源码顺序看清当前 LDA 流水线从数据复制到 2D 判别图输出的完整步骤。
- 理解 LDA 有监督训练、无切分、
transform()为输出的工程特征——与 PCA 既有相似又有本质差异。 - 理解
label在当前流程中的双重角色——既是训练输入,也是可视化着色依据。
重点方法与概念速览
| 名称 | 类型 | 作用 |
|---|---|---|
lda_data.copy() | 方法 | 复制原始数据,避免修改源对象 |
data.drop(columns=["label"]) | 操作 | 去掉标签列,保留 13 个特征作为训练输入 |
StandardScaler().fit_transform(X) | 方法 | 对全量特征做一致性标准化——散度矩阵计算的前置条件 |
train_model(X_scaled, y, n_components=2) | 函数 | 训练 LDA 模型——有监督,标签参与判别方向学习 |
model.transform(X_scaled) | 方法 | 将 13 维特征投影到 2 维判别子空间——生成降维坐标 |
plot_dimensionality(...) | 函数 | 绘制降维后的 2D 散点图(按类别着色) |
1. 流水线起点:复制数据并拆出特征与标签
示例代码
python
data = lda_data.copy()
X = data.drop(columns=["label"])
y = data["label"].values理解重点
.copy()确保后续处理不修改全局lda_data。label被单独保存为y——它既参与后续train_model(),也用于最终的plot_dimensionality(...)着色。- 与 PCA 流水线最关键的区别:
y在这里是训练输入,PCA 的y仅用于着色。
2. 标准化
参数速览
适用 API:StandardScaler().fit_transform(X)
| 参数名 | 类型 | 说明 | 示例取值 |
|---|---|---|---|
X | DataFrame,形状 | 去掉 label 后的全量特征矩阵 | X |
| 输出 | ndarray | X_scaled |
示例代码
python
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)理解重点
- LDA 流水线没有训练/测试切分——当前实现为教学型简化,直接在全量数据上训练和投影。
fit_transform直接在全量数据上计算统计量并变换——目标是展示整体判别结构而非评估泛化能力。- 标准化是必须的——散度矩阵
和 的元素对特征尺度高度敏感。Wine 数据中 proline(~278-1680)的量纲远大于nonflavanoid_phenols(~0.13-0.66)。
3. 训练阶段:fit() 学习判别方向
参数速览
适用 API:train_model(X_scaled, y, n_components=2) → model.fit(X_scaled, y)
| 参数名 | 类型 | 说明 | 示例取值 |
|---|---|---|---|
X_scaled | ndarray,形状 | 标准化后的特征矩阵——LDA 的特征输入 | X_scaled |
y | ndarray,形状 | 类别标签 | y |
n_components | int | 保留的判别方向数。当前为 2( | 2 |
示例代码
python
model = train_model(X_scaled, y, n_components=2)理解重点
LinearDiscriminantAnalysis.fit(X_scaled, y)内部流程:计算各类均值→ 构造 和 → 通过 SVD 求解广义特征值问题 → 取最大的 2 个特征值对应的特征向量作为判别方向 → 存入 scalings_。- 这既有训练也有模型——LDA 产出一个可复用的投影矩阵(
scalings_),可以对任意新数据做transform()。 - 与 PCA 对比:
fit()都产出一个投影矩阵,但 PCA 不需要y(无监督),LDA 必须有y(有监督)。
4. 投影阶段:transform() 将数据降到 2D
参数速览
适用方法:model.transform(X_scaled)
| 参数名 | 类型 | 说明 | 示例取值 |
|---|---|---|---|
X_scaled | ndarray,形状 | 需要降维的特征矩阵——当前为训练数据本身 | X_scaled |
| 返回值 | ndarray,形状 | 投影到判别子空间后的 2D 坐标 | X_transformed |
示例代码
python
X_transformed = model.transform(X_scaled)理解重点
transform()是 LDA 流水线的"预测"步骤——它不是预测类别标签,而是预测低维坐标。- 降维后的 2D 坐标就是判别子空间中的位置——同类样本应聚集,不同类样本应分离。
- 当前流水线对训练数据本身做
transform()(全量投影),目的是展示整体判别结构——这与"对新样本做投影"在数学上完全相同。
5. 2D 判别图:可视化如何接入流水线
参数速览
适用函数:plot_dimensionality(X_transformed, y=y, explained_variance_ratio=evr, title=..., dataset_name=..., model_name=..., mode='2d')
| 参数名 | 类型 | 说明 | 示例取值 |
|---|---|---|---|
X_transformed | ndarray,形状 | LDA 降维后的 2D 坐标 | X_transformed |
y | ndarray,形状 | 类别标签——用于散点着色和图例 | y |
explained_variance_ratio | ndarray 或 None | 各判别方向贡献占比——若存在则标注在坐标轴上 | evr |
mode | str | 输出模式。当前为 '2d'——LDA 只输出 2D 图 | '2d' |
示例代码
python
evr = (
model.explained_variance_ratio_
if hasattr(model, "explained_variance_ratio_")
else None
)
plot_dimensionality(
X_transformed,
y=y,
explained_variance_ratio=evr,
title="LDA 降维 (2D)",
dataset_name=DATASET,
model_name=MODEL,
mode="2d",
)理解重点
plot_dimensionality(...)是当前 LDA 分册唯一的可视化函数——与分类分册的四类评估(混淆矩阵+ROC+决策边界+学习曲线)完全不同。explained_variance_ratio的条件传递(if hasattr→evr或None)是 LDA 特有的工程模式——不同求解器对此属性的支持不同。- 图中
y既是训练标签也是着色依据——它在当前分册中有双重作用。坐标轴标签会包含解释占比(如LD1 (78.5%))。
6. 用伪代码看完整流程
python
data = lda_data.copy()
X = data.drop(columns=["label"])
y = data["label"].values
X_scaled = StandardScaler().fit_transform(X)
model = train_model(X_scaled, y, n_components=2)
X_transformed = model.transform(X_scaled)
plot_dimensionality(X_transformed, y=y, explained_variance_ratio=evr, mode="2d")理解重点
- 当前 LDA 流水线的主线非常清楚:取数 → 标准化 → 有监督训练 → 判别投影 → 2D 可视化。
- 这条链路里最关键的中间变量是:
X_scaled(标准化特征)、训练后的model(含scalings_)、二维投影结果X_transformed和标签y。 - 与 PCA 流水线的步骤形式极其相似(StandardScaler → fit → transform → plot),但
fit()是否传y是两套流程的本质分野。
训练诊断可视化

常见坑
- 把 LDA 流水线写成 PCA 那种"标签仅用于着色"的无监督流程——
y在 LDA 中是训练输入。 - 期望当前流水线有
train_test_split——当前实现为教学型简化,直接在全量数据上训练和投影。 - 忘记
transform()才是生成降维坐标的步骤——fit()只学习判别方向,不生成投影坐标。 - 把
explained_variance_ratio_当成一定存在的属性——需用hasattr做保护式判断。
小结
- 当前 LDA 流水线非常清晰:复制数据 → 拆出
X和y→ 全量标准化 →fit(X, y)学习判别方向 →transform(X)投影到 2D → 判别散点图。 - 与 PCA 流水线的核心差异:
y参与训练(有监督)、降维上限(非 )、优化目标不同(类间/类内比 vs 方差)。 - 与分类分册的核心差异:输出是低维坐标而非类别预测、可视化是降维散点图而非混淆矩阵/ROC、无
predict()(用transform()替代)。