sklearn train_test_split拆分比例异常、总数据量丢失问题求助
问题原因分析
- 直接触发因素:你在调用
train_test_split时指定了stratify=data.recommendation参数,sklearn的分层拆分逻辑会自动剔除stratify指定列中存在空值/NaN的行,这部分行不会进入拆分池。你当前数据集的recommendation列存在大量缺失值,直接导致拆分后总样本量远小于原始数据集,同时分层逻辑基于剩余少量样本计算,也会出现比例不符合预期的问题。 - 你与朋友运行结果不一致的原因:你本地读取的数据集和朋友使用的数据集实际存在差异。通常是本地原始数据文件损坏、数据读取参数(分隔符、编码、行过滤规则等)和朋友不一致,或是你在调用拆分函数前对
data做了未留意的修改,导致recommendation列产生大量空值,和朋友的数据集并不完全相同。
验证方法
- 执行以下代码查看
recommendation列的缺失值总数:
print(data['recommendation'].isna().sum())
该数值基本等于原始样本量345438减去拆分后训练集+测试集的总样本量差值。
2. 对比你和朋友的数据集基础统计结果,确认两者读取后的数据集是否一致:
print(data.info()) print(data['recommendation'].value_counts(dropna=False))
解决方案
- 先排查数据读取流程,确认你使用的原始数据文件、读取参数和朋友完全一致,保证本地加载的
data和朋友的数据集无差异。 - 如果你业务上允许丢弃
recommendation为空的行,建议拆分前主动完成空值过滤,避免框架隐性过滤导致的逻辑不可控:
# 主动过滤目标列空值 data_clean = data[data['recommendation'].notna()].reset_index(drop=True) # 再执行拆分 X_train,X_test,y_train,y_test = train_test_split(data_clean[['review','clean_nltk','clean_spacy','clean_sklearn']],data_clean.recommendation,test_size=0.3, stratify=data_clean.recommendation,random_state=100)
- 如果你需要保留所有样本,去掉
stratify参数即可,非分层拆分不会自动过滤空值行。
内容的提问来源于stack exchange,提问作者M. Albert
相关产品推荐
相关产品推荐

