TensorFlow序列模型传入DataFrame批量预测结果全为中性问题求助
问题排查思路
- 先修正代码中的变量错误
你写的循环逻辑没有用到遍历得到的x变量,prediction属于未定义变量(如果没有提前全局定义,这里取到的固定值大概率对应neutral的索引1,所以所有输出都是neutral):
# 错误写法 for x in data_prediction: np.array(x) print(y_label[np.argmax(prediction)]) # 正确循环写法 for x in data_prediction: print(y_label[np.argmax(x)]) # 更高效的批量处理写法,无需循环 pred_classes = np.argmax(data_prediction, axis=1) pred_labels = [y_label[c] for c in pred_classes]
- 修正输入数据格式错误
你输出的padded全是[1, 0, 0,...],说明tokenizer.texts_to_sequences没有正确识别输入文本,本质原因是data_predict.values.tolist()得到的是二维列表,每一行是DataFrame的整行数据(包含所有列),而texts_to_sequences要求输入是一维字符串列表,每个元素对应一条待处理的文本。你单条测试时传入的是一维字符串列表所以正常,批量时转成二维列表就会失效。
需要先指定待预测的文本列,比如你的文本存在名为text的列,写法如下:
# 错误写法,整个DataFrame转二维列表 new = data_predict.values.tolist() # 正确写法,取文本列转一维字符串列表 new = data_predict['text'].tolist()
- 核对预处理参数一致性
确认max_length、padding_type、trunc_type三个参数和模型训练时的取值完全一致,同时确认当前使用的tokenizer就是训练阶段已经完成词汇拟合的分词器,不是重新初始化的新实例。
正确批量预测完整代码示例
import numpy as np import pandas as pd # 标签映射和训练阶段保持一致 y_label = {0:"negative",1:"neutral",2:"positive"} # 预处理参数和训练阶段保持一致 max_length = 替换为你训练时设置的最大序列长度 padding_type = 'post' # 与训练时的填充方向一致 trunc_type = 'post' # 与训练时的截断方向一致 # 读取数据 data_predict = pd.read_excel("data clear.xlsx") data_predict = data_predict.dropna(subset=['text']) # 只过滤文本列为空的行 # 取文本列转一维列表 text_list = data_predict['text'].tolist() # 文本预处理 sequences = tokenizer.texts_to_sequences(text_list) padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type) # 批量预测 data_prediction = model.predict(padded, batch_size=32) # 可指定batch_size提升预测效率 pred_classes = np.argmax(data_prediction, axis=1) pred_labels = [y_label[c] for c in pred_classes] # 结果输出 print(pred_labels) # 可将预测结果写回原DataFrame导出 data_predict['pred_label'] = pred_labels data_predict.to_excel("predict_result.xlsx", index=False)
内容的提问来源于stack exchange,提问作者cyber
相关产品推荐
相关产品推荐

