StratifiedShuffleSplit报错含义及使用问题咨询
为什么用StratifiedShuffleSplit划分Advertising数据集会报错?
嘿,作为数据科学新手踩这个坑真的太正常了——我刚入门的时候也在这栽过跟头!让我给你掰扯清楚问题出在哪,以及那些报错到底在说什么。
核心原因:StratifiedShuffleSplit是给分类任务设计的
StratifiedShuffleSplit的核心作用是保持训练集和测试集中各类别的占比一致(比如分类任务里,正负样本比例在训练测试集里和原数据集差不多)。但你的Advertising数据集里的标签sales是连续数值(属于回归任务),根本没有“类别”这个概念,这就完全违背了这个函数的设计逻辑,自然会报错。
常见报错的含义
你大概率会遇到以下两种报错,我给你翻译成人话:
ValueError: Supported target types are: ('binary', 'multiclass'). Got 'continuous' instead.
这句话直接明说:这个函数只支持二分类、多分类的离散标签,你给的是连续值,不兼容,用不了。TypeError: Singleton array array(...) cannot be considered a valid collection.
这种情况相对少见,一般是因为代码里的标签格式有问题,但本质还是因为连续值标签不符合函数对“类别集合”的要求。
回归任务该用什么划分数据集?
回归任务不需要保持连续标签的分布比例(或者说没法直接做分层),用普通的随机划分工具就够了,推荐两种简单方法:
方法1:用ShuffleSplit(和Stratified版本用法类似,只是不分层)
import pandas as pd from sklearn.model_selection import ShuffleSplit # 加载数据集 data = pd.read_csv("Advertising.csv") X = data[["TV", "Radio", "Newspaper"]] y = data["sales"] # 初始化划分器,这里只分1次,测试集占20% ss = ShuffleSplit(n_splits=1, test_size=0.2, random_state=42) train_idx, test_idx = next(ss.split(X, y)) # 拆分数据集 X_train, X_test = X.iloc[train_idx], X.iloc[test_idx] y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
方法2:更简洁的train_test_split
这是日常用得最多的方式,默认就会随机打乱:
import pandas as pd from sklearn.model_selection import train_test_split data = pd.read_csv("Advertising.csv") X = data[["TV", "Radio", "Newspaper"]] y = data["sales"] # 直接拆分,test_size控制测试集比例,random_state保证结果可复现 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, shuffle=True, random_state=42 )
额外提醒
如果你真的想给回归任务做“分层”(比如把sales分成几个区间当作类别),也可以先对连续标签分箱,再用StratifiedShuffleSplit,但一般来说回归任务完全没必要这么做,普通随机划分已经足够啦。
内容的提问来源于stack exchange,提问作者Evan C
相关产品推荐
相关产品推荐

