You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras中如何展示高误差样本、查找误差样本及定位时间序列误差区间?

分析Keras模型高误差样本的实用方法

嘿,针对你用Keras训练神经网络后测试集误差约80%的问题,我来一步步帮你解决这三个核心疑问:

1. 如何展示所有误差最高的样本?

要找出误差最高的样本,核心思路是计算每个测试样本的单独误差,然后排序筛选出Top N的高误差样本。具体步骤和代码示例如下:

步骤1:计算每个样本的误差

首先用模型预测测试集,然后针对你的任务类型(分类/回归)计算每个样本的误差:

  • 分类任务:可以用交叉熵损失(每个样本单独计算,不做平均)
  • 回归任务:可以用MSE或MAE损失(同样单独计算)
import numpy as np
from tensorflow import keras

# 假设你已经有测试数据x_test、真实标签y_test,以及训练好的model
y_pred = model.predict(x_test, verbose=0)

# --- 分类任务示例 ---
# 如果y_test是独热编码,先转成标签;如果已经是标签则跳过
y_true_labels = np.argmax(y_test, axis=1) if len(y_test.shape) == 2 else y_test
y_pred_labels = np.argmax(y_pred, axis=1)

# 计算每个样本的交叉熵误差(reduction='none'表示不做平均,保留每个样本的误差)
loss_fn = keras.losses.CategoricalCrossentropy(reduction='none')
sample_losses = loss_fn(y_test, y_pred).numpy()

# --- 回归任务示例 ---
# loss_fn = keras.losses.MeanSquaredError(reduction='none')
# sample_losses = loss_fn(y_test, y_pred).numpy()

步骤2:排序并提取高误差样本

通过numpy的排序函数找到误差最高的样本索引,然后提取对应的样本、真实标签和预测结果:

# 取误差最高的前20个样本(可根据需求调整数量)
top_k = 20
top_error_indices = np.argsort(sample_losses)[::-1][:top_k]

# 提取相关数据
top_error_samples = x_test[top_error_indices]
top_error_true = y_true_labels[top_error_indices] if len(y_test.shape) == 2 else y_test[top_error_indices]
top_error_pred = y_pred_labels[top_error_indices] if len(y_test.shape) == 2 else y_pred[top_error_indices]
top_error_values = sample_losses[top_error_indices]

# 打印或可视化这些样本
for i in range(top_k):
    print(f"样本索引: {top_error_indices[i]}")
    print(f"真实值: {top_error_true[i]}, 预测值: {top_error_pred[i]}")
    print(f"误差值: {top_error_values[i]:.4f}\n")

你还可以根据数据类型(比如图像、时间序列)做可视化,直观观察这些样本的特征,找出模型容易出错的模式。

2. 是否可以找出存在误差的样本?

当然可以!本质上就是筛选出**预测结果与真实值不一致(分类)或误差超过阈值(回归)**的样本:

分类任务:找出所有预测错误的样本

直接对比真实标签和预测标签,找出不匹配的样本:

# 找出所有预测错误的样本索引
error_indices = np.where(y_pred_labels != y_true_labels)[0]

# 提取错误样本
error_samples = x_test[error_indices]
error_true_labels = y_true_labels[error_indices]
error_pred_labels = y_pred_labels[error_indices]

print(f"测试集中共有 {len(error_indices)} 个错误样本,占比 {len(error_indices)/len(x_test)*100:.2f}%")

回归任务:找出误差超过阈值的样本

先计算每个样本的误差,再设定一个合理的阈值(比如平均误差的1.5倍)来筛选:

# 计算每个样本的MSE误差
loss_fn = keras.losses.MeanSquaredError(reduction='none')
sample_losses = loss_fn(y_test, y_pred).numpy()

# 设定阈值(可根据业务需求调整)
threshold = np.mean(sample_losses) * 1.5
high_error_indices = np.where(sample_losses > threshold)[0]

print(f"测试集中共有 {len(high_error_indices)} 个高误差样本")

3. 时间序列数据如何定位误差对应的区间?

时间序列的误差定位需要结合你的预测模式(单步/多步预测)来对应到原始序列的时间区间:

情况1:单步预测(用历史序列预测下一个时间点)

比如你用window_size=10的滑动窗口,输入过去10个时间步,预测第11个时间点。此时每个测试样本对应原始序列的一个窗口,误差对应的就是窗口后的那个时间点:

# 假设原始时间序列为data(一维数组),窗口大小window_size=10
window_size = 10

# 遍历高误差样本索引,定位对应的时间区间
for idx in top_error_indices:
    # 样本对应的输入序列区间:[idx, idx+window_size-1]
    # 预测的时间点:idx+window_size
    start_idx = idx
    end_input_idx = idx + window_size - 1
    predicted_idx = idx + window_size

    print(f"误差对应的输入序列区间: [{start_idx}, {end_input_idx}]")
    print(f"预测的时间点: {predicted_idx}")

    # 可视化验证
    import matplotlib.pyplot as plt
    plt.plot(data[start_idx:predicted_idx+1], label='原始序列')
    plt.scatter(predicted_idx, y_test[idx], color='green', label='真实值')
    plt.scatter(predicted_idx, y_pred[idx], color='red', label='预测值')
    plt.title(f"高误差样本 {idx} 的时间序列")
    plt.legend()
    plt.show()

情况2:多步预测(序列到序列,预测未来多个时间点)

如果是输入一段序列,预测接下来的N个时间点,需要计算每个预测时间步的误差,找出误差最高的时间段:

# 假设y_test和y_pred的形状为(n_samples, n_steps),n_steps是预测的步数
n_steps = 5

# 计算每个样本每个时间步的误差
step_losses = keras.losses.MeanSquaredError(reduction='none')(y_test, y_pred).numpy()

# 找出每个样本中误差最高的时间步
max_step_error = np.max(step_losses, axis=1)
top_error_indices = np.argsort(max_step_error)[::-1][:10]

for idx in top_error_indices:
    # 找到该样本中误差最高的预测步
    worst_step = np.argmax(step_losses[idx])
    # 对应的原始序列区间
    input_start = idx
    input_end = idx + window_size - 1
    predicted_start = input_end + 1
    worst_predicted_idx = predicted_start + worst_step

    print(f"样本 {idx} 最高误差出现在第 {worst_step+1} 个预测步,对应时间点 {worst_predicted_idx}")

    # 可视化
    plt.plot(data[input_start:predicted_start+n_steps], label='原始序列')
    plt.plot(np.arange(predicted_start, predicted_start+n_steps), y_test[idx], color='green', label='真实预测值')
    plt.plot(np.arange(predicted_start, predicted_start+n_steps), y_pred[idx], color='red', label='模型预测值')
    plt.scatter(worst_predicted_idx, y_pred[idx][worst_step], color='orange', label='最高误差点')
    plt.legend()
    plt.show()

通过这些方法,你可以精准定位模型的问题所在,比如是否是某些时间段的数据噪声大、序列模式复杂,或者模型对特定模式的拟合不足,进而针对性优化模型或数据。

内容的提问来源于stack exchange,提问作者yovizatut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:06:56