Как разделить большой набор данных на n подмножеств, поддерживающих пропорцию класса - PullRequest
0 голосов
/ 20 апреля 2019

Я работаю над проблемой бинарной классификации и использую большой набор данных (количество выборок велико, функций не так много). Данные являются дисбалансом, но я использую массив весов, который решает эту проблему (вроде).

Я пробовал некоторые классификаторы со sklearn в небольшой версии этого набора, и, очевидно, SVM хорошо работает для того, что я хочу. Однако, как только я пытаюсь вписать SVM во весь набор данных, это занимает вечность (и у меня также заканчивается память).

Что я хочу знать, так это то, что в Sklearn есть какой-нибудь быстрый способ разделить этот набор, скажем, на 10 подмножеств, сохраняя пропорцию классов, так что я могу затем разделить каждый из этих подмножеств на обучение / тестирование и приспособить SVM независимо для каждого подмножества (чтобы я мог использовать разные процессоры тоже)?

Ответы [ 2 ]

1 голос
/ 20 апреля 2019

StratifiedKFold функция может служить вашим требованиям.Это разделит данные на число стратифицированных сгибов.позвоните в _iter_test_masks() или _make_test_folds(),

На основании документации :

>>> 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
1 голос
/ 20 апреля 2019

Вы можете добавить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...