You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:07