fastai的TextLMDataBunch报NaN错误但DataFrame无空值如何解决
问题成因
- 你手动校验的是内存中已处理好的DataFrame无NaN,但调用
TextLMDataBunch.from_csv时,fastai内部会重新读取CSV文件,默认的CSV解析逻辑没有做异常容错,全量数据体量较大时,若存在行内未转义的逗号、换行符、引号不匹配等情况,就会出现行解析错误,生成的DataFrame会额外产生NaN值,这部分异常是你手动校验内存中DataFrame时查不到的。 - fastai创建数据集时会默认按
valid_pct=0.2随机拆分训练集和验证集,你抽取3千行子集时,拆分后的子集刚好没有命中异常行,因此可以正常运行,全量数据拆分时会覆盖到异常行,所以触发报错。 - 少数情况下,若文本列存在空字符串
"",isna()无法识别这类值,fastai的校验逻辑也可能触发类似报错。
解决方案
- 优先采用
from_df接口创建数据集,直接传入你已经校验过无异常的DataFrame,跳过fastai读取CSV的步骤,避免解析异常:
# 传入已确认无NaN的train DataFrame即可 data_lm = TextLMDataBunch.from_df(path, train_df=train, valid_pct=0.2, min_freq=1)
- 若必须使用
from_csv接口读取文件,可传入CSV解析容错参数,适配你的文件格式:
import csv data_lm = TextLMDataBunch.from_csv(path, 'train.csv', min_freq=1, quoting=csv.QUOTE_ALL, escapechar="\\")
- 若怀疑存在空字符串异常,可提前做一次清洗再校验:
import numpy as np # 把空字符串替换为NaN后删除异常行 train['text'] = train['text'].replace("", np.nan) train = train.dropna(subset=['text']) # 再次确认无异常 print(train.isna().any().any())
- 全量数据解析时可适当调大
chunksize参数,避免分块读取时的异常:
data_lm = TextLMDataBunch.from_csv(path, 'train.csv', min_freq=1, chunksize=10000)
内容的提问来源于stack exchange,提问作者Chen-CN
相关产品推荐
相关产品推荐

