朴素贝叶斯模型拟合报错请求排查:输入含NaN值(作者预测)
作者预测代码报错排查与解决
报错原因
训练时触发ValueError: Input contains NaN,核心原因是输入数据中存在缺失值(NaN)。MultinomialNB算法要求训练用的特征(content列)和标签(author列)必须无缺失值,原代码未处理数据缺失,导致模型训练前的校验环节失败。
NaN来源定位
NaN只能来自以下两个字段:
content列:部分文章内容为空,或CSV读取解析错误导致变成NaNauthor列:部分作者信息缺失,存储为NaN
要精准定位,可在加载数据后添加两行检查代码:
# 统计content列缺失值数量 print("content列缺失数:", df['content'].isna().sum()) # 统计author列缺失值数量 print("author列缺失数:", df['author'].isna().sum())
执行后就能明确哪一列存在缺失,以及具体缺失条数。
解决方案
针对缺失值,优先采用删除缺失行的方式(适合缺失比例较低的场景);若缺失比例高,可考虑填充(比如content填充空字符串,author填充"Unknown",但标签填充可能影响模型精度)。
修改后的完整代码
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline from sklearn.metrics import classification_report # 加载数据集 df = pd.read_csv('articles1.csv') # 删除content或author列含NaN的行 df = df.dropna(subset=['content', 'author']) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(df['content'], df['author'], test_size=0.2, random_state=42) # 创建模型流水线 model = make_pipeline(TfidfVectorizer(), MultinomialNB()) # 训练模型 model.fit(X_train, y_train) # 模型评估(可选) y_pred = model.predict(X_test) print(classification_report(y_test, y_pred))
内容的提问来源于stack exchange,提问作者ADEWUYI ADEGBITE
相关产品推荐
相关产品推荐

