调用ktrain的preprocess_train函数出现ValueError的含义与解决方法
错误含义
报错是ktrain的文本预处理校验逻辑触发的:preprocess_train要求传入的第一个参数texts必须是字符串组成的列表/数组,或是句对形式的二元字符串元组列表,你传入的X_train_smote.Tweet.values是整数数组,不符合输入格式要求,所以直接抛出错误。
从你给出的参数值也能看出来,X_train_smote.Tweet.values输出是array([1830, 471, 1100, ..., 1308, 930, 868]),全是数字,没有任何文本字符串,自然过不了校验。
问题根因
你大概率是在过采样之前就提前对Tweet列的原始文本做了分词、ID映射的编码操作,但ktrain自带的Transformer预处理器会自动完成文本清洗、分词、token转ID的全流程,不需要你提前做编码处理,提前转成数字反而不符合输入要求。
另外额外提醒:SMOTE是针对结构化数值数据设计的过采样方法,直接对文本的token ID序列做SMOTE过采样完全没有意义,还会破坏文本原有的语义逻辑,根本起不到缓解类别不平衡的效果。
解决方案
- 回溯数据处理流程,取出SMOTE处理之前的、未经过编码的原始Tweet文本内容,直接把原始文本组成的数组传入
preprocess_train和preprocess_test即可。 - 如果已经丢失原始文本,需要找到你之前做编码的映射字典,把数组里的整数ID反向转成对应的原始文本字符串,再传入预处理方法。
如果存在类别不平衡问题,建议换用文本场景适用的处理方案:
- 训练时给不同类别设置不同的损失权重
- 对少数类样本做文本增强(比如回译、同义词替换、随机截断拼接等)
内容的提问来源于stack exchange,提问作者DevLeb2022
相关产品推荐
相关产品推荐

