如何将大数据集划分成n个子集来保持类的比例

2024-04-26 10:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个二进制分类问题,我使用的是一个大数据集(样本数量很大,特征不太多)。数据是不平衡的,但我使用的权重数组修复了这个问题(有点)。你知道吗

我在这个集合的一个小版本中尝试了一些带有sklearn的分类器,显然SVM对我想要的东西很有用。然而,一旦我尝试在整个数据集中拟合一个支持向量机,它就需要永远(而且我的内存也用完了)。你知道吗

我想知道的是,在Sklearn中是否有任何快速的方法来划分这个集合,比如说划分成10个子集,保持类的比例,那么我是否可以将每个子集划分为训练/测试,并为每个子集独立地拟合SVM(这样我也可以使用不同的处理器)?你知道吗


Tags: 数据内存版本数量分类器二进制分类特征
2条回答

StratifiedKFold函数可以满足您的需求。它将数据分割成k个分层褶皱。调用_iter_test_masks()_make_test_folds()

基于documentation

>>> from sklearn.model_selection import StratifiedKFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> skf = StratifiedKFold(n_splits=2, shuffle=True)
>>> for i in skf._iter_test_masks(X, y):
...     print(i)

[ True False False  True]
[False  True  True False]

>>> for i in skf._make_test_folds(X, y):
...     print(i)

1
0
0
1

您可以添加一个new column,它将是一个random number,从0到1,带有np.random.random_sample,然后您可以group by这个class,并对生成的随机数应用pd.cut,就像创建一个新列dataset

df = pd.DataFrame({'class': np.random.choice(['A', 'B'], 100), 
               'value': np.random.random_sample(100)})
df['dataset'] = pd.DataFrame(df.groupby('class').apply(lambda x: 
pd.cut(x['value'], 10, labels=range(0, 10)))).reset_index(0, drop=True)

相关问题 更多 >