评估与诊断
本章目标
- 理解当前 HMM 流水线的评估输出——隐状态准确率和学习到的转移矩阵打印。
- 理解 HMM 评估的独特之处——比较的是"状态序列"而非"类别标签"。
- 明确当前流水线已实现和未实现的评估项——以及 HMM 评估与分类/聚类评估的根本差异。
重点方法与概念速览
| 名称 | 类型 | 作用 |
|---|---|---|
| 隐状态准确率 | 定量指标 | np.mean(states_pred == y_true)——Viterbi 路径与真实状态的逐步一致性 |
| 转移矩阵打印 | 诊断输出 | model.transmat_——对比学习到的转移矩阵与真实转移矩阵 |
| 对数似然历史 | 诊断信息 | model.monitor_——逐次迭代的对数似然,用于判断收敛和局部最优 |
| Forward 得分 | 概率评估 | model.score(X, lengths)——观测序列在当前参数下的对数概率 |
1. 隐状态准确率
训练完成后,终端直接打印隐状态预测准确率:
python
states_pred = model.predict(X_obs, lengths)
accuracy = np.mean(states_pred == y_true)
print(f"隐状态预测准确率: {accuracy:.4f}")参数速览
| 参数名 | 类型 | 说明 | 示例取值 |
|---|---|---|---|
states_pred | ndarray,形状 (300,) | Viterbi 解码的隐状态路径 | model.predict(X_obs, lengths) |
y_true | ndarray,形状 (300,) | 真实隐状态——生成数据时记录的地面真值 | data["state_true"].values |
accuracy | float, | 逐步匹配比例——越高表示 HMM 恢复隐状态越成功 | 0.85 |
示例输出
text
隐状态预测准确率: 0.8933
转移矩阵:
[[0.78 0.18 0.04 ]
[0.22 0.58 0.20 ]
[0.12 0.22 0.66 ]]理解重点
- 隐状态准确率与分类准确率有本质区别——这里比较的是时序路径,每一步的准确性受前后文影响。
- 标签编号不能互换——与 GMM 的聚类标签不同,HMM 的隐状态编号在训练中由 Baum-Welch 的初始化决定,可能与
state_true的编号不一致。 - 如果准确率很低但转移矩阵与真实接近——可能存在标签排列(permutation mismatch),即状态
被映射为状态 等。
2. 转移矩阵诊断
终端打印学习到的转移矩阵,可直接与真实转移矩阵对比:
| 真实 | 学习到的 |
|---|---|
[[0.80, 0.15, 0.05] | [[0.78, 0.18, 0.04] |
[0.20, 0.60, 0.20] | [0.22, 0.58, 0.20] |
[0.10, 0.20, 0.70]] | [0.12, 0.22, 0.66]] |
理解重点
- 对角线元素的接近程度反映了状态稳定性的恢复精度。
- 非对角线元素的匹配说明 HMM 成功学会了状态间的迁移偏好。
- 如果学习到的矩阵与真实差很多——可能数据不够长、
设定错误、或 Baum-Welch 陷入局部最优。
3. 对数似然历史
model.monitor_ 存储了逐次迭代的对数似然值:
python
print(model.monitor_.converged) # 是否收敛
print(model.monitor_.history) # 迭代历史理解重点
- 对数似然单调递增——与 GMM 的 EM 一致,如果出现拐点说明 baum-welch 的实现有问题。
- 如果对数似然增长很慢或停滞——可能已经收敛到局部最优。
- 比较多次训练的对数似然——可以判断初始化敏感性和收敛质量。
4. 已实现 vs 未实现的评估
参数速览
| 评估项 | 状态 | 原因 |
|---|---|---|
| 隐状态准确率 | 已实现 | HMM 评估的核心指标 |
| 转移矩阵打印 | 已实现 | 对比学习到的参数与生成参数 |
| 发射矩阵对比 | 未实现 | 当前仅打印转移矩阵——发射矩阵也可以通过 model.emissionprob_ 访问 |
| 可视化(隐状态轨迹图) | 未实现 | 可绘制 time-vs-state 对比图——但教学场景下终端文本已足够 |
| 混淆矩阵 | 不适用 | 状态标签可能排列不匹配——混淆矩阵在此场景下意义有限 |
| BIC/AIC | 未实现 | HMM 模型选择指标——当前 |
| 交叉验证对数似然 | 未实现 | 单条长序列无法做 K-Fold——但多序列场景下可用留一序列验证 |
理解重点
- HMM 的评估与标准分类/聚类完全不同——评估的是"序列推断准确率"而非"标签分类准确率"。
- 无可视化是有意设计——300 步的离散状态序列用终端文本展示更清晰。
5. HMM vs GMM vs 集成模型 评估对比
| 评估维度 | Bagging/GBDT | KMeans | GMM (EM) | HMM |
|---|---|---|---|---|
| 任务类型 | 分类 | 聚类 | 聚类 | 序列状态推断 |
| 可视化 | 混淆矩阵 + ROC | 聚类图 | 双面板聚类图 | 无图(终端文本) |
| 定量指标 | accuracy/precision/recall | inertia_ | lower_bound_ | 隐状态准确率 + 对数似然 |
| 参数对比 | 无 | 无 | weights_/means_/covariances_ | transmat_ 打印 |
| 标签语义 | 有(不可互换) | 无(不可互换) | 无(不可互换) | 部分可互换 |
| 数据特性 | i.i.d. | i.i.d. | i.i.d. | 时序依赖 |
常见坑
- 直接对比
states_pred和y_true的标签编号——可能因排列不匹配而得到虚假的低准确率。 - 忽略转移矩阵的非对角线模式——非对角值代表状态间的迁移偏好,是 HMM 动态特征的核心体现。
- 只看准确率不看转移矩阵——高准确率 + 差的转移矩阵表明可能只是逐点 argmax 的效果。
- 把 HMM 的准确率与分类准确率直接比较——两者的评估对象和意义完全不同。
小结
- HMM 当前有两项评估输出:隐状态准确率(定量,Viterbi 路径 vs 真实路径)和转移矩阵(诊断,学习到的 vs 真实的马尔可夫动态)。
- HMM 评估的核心价值在于"时序一致性"——不仅看单点准确,还要看状态间的迁移模式是否正确恢复。
- 与所有其他模型的评估差异源于序列数据的特性——评估的是"路径推断"而非"标签分类"或"聚类质量"。