如何在Keras中获取预测错误数据的索引及对应原始影评文本?
嘿,这个问题我做情感分析项目时也碰到过!其实要定位错误预测的样本一点都不难,核心就是把模型的预测结果和原始数据(包括文本、真实标签、原始索引)对应起来就行。结合你给出的代码片段,我给你一步步拆解实现方法:
第一步:拆分数据时保留原始信息(关键!)
如果你之前只是拆分了特征和标签数组(比如X_train, X_test, y_train, y_test),很容易丢失原始文本和索引的关联。建议直接对完整的DataFrame做拆分,这样测试集里会保留所有原始数据:
# 假设你的原始数据集是df,包含'text'(影评文本)和'label'(0=负向,1=正向)列 train_df, test_df = train_test_split(df, test_size=0.2, random_state=42)
这样test_df里就有每一条测试样本的文本、真实标签,以及原始数据的索引(如果你的df有索引的话)。
第二步:对测试集做和训练时一致的预处理
模型预测的输入格式必须和训练时完全匹配,所以要复用之前的Tokenizer和序列填充逻辑:
# 假设你已经在训练阶段拟合过Tokenizer: # tokenizer = Tokenizer(num_words=你的词汇量) # tokenizer.fit_on_texts(train_df['text']) # 把测试文本转成序列并填充到固定长度 X_test_seq = tokenizer.texts_to_sequences(test_df['text']) X_test_pad = keras.preprocessing.sequence.pad_sequences(X_test_seq, maxlen=你的max_len)
第三步:获取预测结果并对比真实标签
用模型预测测试集,然后把预测结果和真实标签合并到test_df里,筛选出不一致的样本:
# 获取预测概率,转成二分类标签(假设模型最后用的是sigmoid激活) y_pred_probs = model.predict(X_test_pad) y_pred = np.round(y_pred_probs).astype(int).flatten() # 四舍五入得到0/1标签 # 把预测结果加入test_df test_df['pred_label'] = y_pred test_df['true_label'] = test_df['label'] # 筛选出所有预测错误的样本 wrong_predictions = test_df[test_df['pred_label'] != test_df['true_label']]
第四步:查看和导出错误样本
现在wrong_predictions里就包含了所有预测错误的影评文本、真实标签、预测标签,以及原始数据索引。你可以直接查看,或者导出到文件方便后续分析:
print(f"总共错误预测了 {len(wrong_predictions)} 条样本") print("前5条错误样本详情:") print(wrong_predictions[['text', 'true_label', 'pred_label']].head()) # 导出到CSV文件 wrong_predictions.to_csv('错误预测样本.csv', encoding='utf-8', index=True)
额外情况:如果已经拆分了X/y数组怎么办?
要是你之前已经拆分了独立的X和y数组,那得提前保存原始索引和文本的关联:
# 拆分前先保存所有文本、标签和原始索引 all_texts = df['text'].values all_labels = df['label'].values all_indices = df.index.values # 拆分时带上索引 X_train, X_test, y_train, y_test, idx_train, idx_test = train_test_split( all_texts, all_labels, all_indices, test_size=0.2, random_state=42 ) # 预处理+预测后,创建错误样本DataFrame y_pred = ... # 同上生成预测标签 mask = y_pred != y_test # 错误样本的掩码 wrong_df = pd.DataFrame({ 'original_index': idx_test[mask], 'text': X_test[mask], 'true_label': y_test[mask], 'pred_label': y_pred[mask] }) print(wrong_df.head())
小提醒
- 确保预处理的参数(比如
max_len、num_words)和训练时完全一致,不然预测结果会失真 - 如果模型最后用的是
softmax激活(比如多分类写法),那要用np.argmax(y_pred_probs, axis=1)来获取类别,而不是round
内容的提问来源于stack exchange,提问作者Eric Zhang
相关产品推荐
相关产品推荐

