Scikit-learn双CSV数据集文本自动分类出现空结果求助
解决短文本分类真实数据输出为空的问题
我正在开展文本自动分类项目,使用train_data.csv和new_data.csv两个独立CSV文件,基于本地网络驱动器的文件路径将文本分类至对应类别。因文本句子较短,决定跳过stemming(词干提取)与停用词移除步骤,直接运行分类器预测类别。测试阶段准确率约81%,但应用真实数据时得到空结果,预期输出为包含“文件路径”“预测类别”及“锦上添花项”列的CSV文件。
测试阶段的准确率不错,说明分类器核心逻辑没问题,真实数据出空结果基本是数据加载/预处理环节不一致或者预测流程细节出错导致的,我给你梳理几个关键排查点和解决方案:
1. 先排查真实数据的加载问题
网络驱动器上的文件容易出现路径、编码或权限问题:
- 检查文件路径:Windows下网络路径(比如
\\server\folder)要注意转义,代码里要么用原始字符串r'\\server\folder\new_data.csv',要么把\换成\\;Linux/macOS下路径格式要正确。 - 检查文件编码:网络共享文件的编码可能不是默认的utf-8,读取时指定编码试试,比如
pd.read_csv('new_data.csv', encoding='latin1')或者encoding='gbk',避免因编码错误读取到空数据。 - 检查文本列质量:用
new_df['你的文本列名'].isnull().sum()统计空文本数量,如果真实数据里有大量空值,分类器自然输出空结果;另外确认真实数据的文本列名称和训练数据完全一致(比如训练时用的是text,真实数据不能是content)。
2. 确保训练与预测的特征提取完全一致
这是最容易踩坑的点!因为你跳过了词干和停用词,训练时用的特征提取器必须直接复用在真实数据上,不能重新初始化:
- 错误做法:训练时用
TfidfVectorizer(),预测时又新建一个TfidfVectorizer()做转换,这样特征空间不匹配,会输出空或错误结果。 - 正确做法:训练好的特征提取器(比如
vectorizer)直接调用transform()处理真实数据,而不是fit_transform()。
给你一个完整的流程示例(用sklearn):
import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression # ---------------------- 训练流程 ---------------------- # 加载训练数据(假设文本列是`text`,类别列是`category`) train_df = pd.read_csv('train_data.csv') X_train = train_df['text'] y_train = train_df['category'] # 特征提取:跳过停用词和词干,所以stop_words设为None,不指定词干提取器 vectorizer = TfidfVectorizer(stop_words=None, lowercase=True) X_train_vec = vectorizer.fit_transform(X_train) # 训练分类器(你用的其他分类器也可以替换) clf = LogisticRegression() clf.fit(X_train_vec, y_train) # ---------------------- 真实数据预测流程 ---------------------- # 加载真实数据(注意路径和编码) new_df = pd.read_csv(r'\\你的网络驱动器路径\new_data.csv', encoding='utf-8') X_new = new_df['text'] # 关键:用训练好的vectorizer做转换,不要fit_transform! X_new_vec = vectorizer.transform(X_new) # 预测 predictions = clf.predict(X_new_vec) # 生成预期输出的CSV # 假设文件路径列是`file_path`,锦上添花项可以自定义(比如文本长度、关键词) new_df['预测类别'] = predictions new_df['锦上添花项'] = new_df['text'].apply(lambda x: f"文本长度:{len(x)}字符") # 输出到网络路径(注意权限,如果失败先输出到本地测试) new_df[['file_path', '预测类别', '锦上添花项']].to_csv(r'\\你的网络驱动器路径\result.csv', index=False, encoding='utf-8-sig')
3. 检查输出环节的问题
- 确认预测结果
predictions不为空:打印len(predictions)看看,如果和真实数据的行数一致,说明预测没问题;如果为空,回到前面的特征提取环节排查。 - 检查输出路径的写入权限:网络驱动器可能需要读写权限,先把结果输出到本地桌面测试,如果能正常生成,再切换到网络路径。
4. 锦上添花项的注意点
如果“锦上添花项”的生成依赖预测结果,要确保预测结果不为空时再生成,比如:
def add_bonus(row): if pd.notna(row['预测类别']): return f"类别:{row['预测类别']} | 文本词数:{len(row['text'].split())}" else: return "无有效预测" new_df['锦上添花项'] = new_df.apply(add_bonus, axis=1)
按照上面的步骤排查,应该能解决真实数据输出为空的问题。
内容的提问来源于stack exchange,提问作者PiotrK
相关产品推荐
相关产品推荐

