使用sklearn的StratifiedShuffleSplit处理多标签数据时遇ValueError
问题原因与解决方案
嘿,这个问题我之前也踩过坑!核心原因是**StratifiedShuffleSplit根本不支持多标签数据的分层拆分**——它是为单标签分类场景设计的,处理多标签时会把每个样本的整个标签向量(比如[1,0,1])当作一个独立的"类别",而不是按单个标签的分布来做分层。
具体为什么会报错?
你虽然移除了所有实例数少于2的单个标签,但可能存在某个标签组合(比如某一行的标签向量)只出现了一次。StratifiedShuffleSplit会把这个唯一的标签组合当成一个"类",而这个"类"只有1个样本,就触发了ValueError里的提示。
举个例子:假设你的y里有一行是[1,1,0],其他行都没有完全一样的标签组合,那这个组合对应的"类"样本数就是1——哪怕每个单独标签的实例数都≥2,照样会触发报错。
怎么解决?
直接用sklearn专门为多标签场景设计的MultiLabelStratifiedShuffleSplit就行!这个类会保证每个标签在训练集和测试集中的分布和原始数据一致,完全避开标签组合唯一性的问题。
修改你的代码如下:
import numpy as np from sklearn.model_selection import MultiLabelStratifiedShuffleSplit # 替换成这个类 # Generate some data np.random.seed(0) n_samples = 10 n_features = 40 n_labels = 20 x = np.random.rand(n_samples, n_features) y = np.zeros((n_samples, n_labels)) for col in range(n_labels): n_instances = np.random.randint(5) indices = np.random.permutation(n_samples)[:n_instances] y[indices,col] = 1 print('Features training set shape:', x.shape) print('Labels from training set shape:', y.shape) print('Are there any labels with fewer than two instances?', np.any(y.sum(axis=0) < 2), '\n') print(y, '\n') # Remove labels which are represented fewer than two times in the training set, # since this messes with StratifiedShuffleSplit below. label_indices_rm = np.where(y.sum(axis=0) < 2)[0] y = np.delete(y, label_indices_rm, axis=1) print(len(label_indices_rm), ' labels had fewer than two instances and were removed.') print('Features from training set shape:', x.shape) print('Labels from training set shape:', y.shape) print('Are there any labels with fewer than two instances?', np.any(y.sum(axis=0) < 2), '\n') print(y, '\n') # 替换成MultiLabelStratifiedShuffleSplit mlsss = MultiLabelStratifiedShuffleSplit(n_splits=1, train_size=0.5) indices,_ = mlsss.split(x, y) # 现在可以正常运行了 print("Training indices:", indices[0])
补充说明
MultiLabelStratifiedShuffleSplit从sklearn 0.24版本开始引入,如果你用的是旧版本,需要先升级sklearn:
pip install --upgrade scikit-learn
这个方法的核心逻辑是保证每个标签在训练/测试集中的比例和原始数据一致,完美适配多标签场景,不会再因为标签组合的唯一性报错啦!
内容的提问来源于stack exchange,提问作者Bobson Dugnutt
相关产品推荐
相关产品推荐

