Подтвердить что ты не робот

Стратифицированный поезд/тест-раскол в scikit-learn

Мне нужно разделить свои данные на тренировочный набор (75%) и набор тестов (25%). В настоящее время я делаю это с помощью кода ниже:

X, Xt, userInfo, userInfo_train = sklearn.cross_validation.train_test_split(X, userInfo)   

Тем не менее, я хотел бы расслоить мой набор учебных материалов. Как мне это сделать? Я изучал метод StratifiedKFold, но не позволял мне рассчитать 75%/25% и только стратифицировать набор учебных материалов.

4b9b3361

Ответ 1

[обновление для 0.17]

См. документы sklearn.model_selection.train_test_split:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    stratify=y, 
                                                    test_size=0.25)

[/update for 0.17]

Здесь есть запрос на перенос здесь. Но вы можете просто сделать train, test = next(iter(StratifiedKFold(...))) и используйте поезда и тестовые индексы, если хотите.

Ответ 2

TL; DR: используйте StratifiedShuffleSplit с помощью test_size=0.25

Scikit-learn предоставляет два модуля для Stratified Splitting:

  • StratifiedKFold: этот модуль полезен в качестве прямого k-кратного механизма перекрестной проверки: так как в нем будут установлены n_folds обучающие/тестовые наборы, такие как что классы одинаково сбалансированы в обоих.

Вот какой код (непосредственно из документации)

>>> skf = cross_validation.StratifiedKFold(y, n_folds=2) #2-fold cross validation
>>> len(skf)
2
>>> for train_index, test_index in skf:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
...    #fit and predict with X_train/test. Use accuracy metrics to check validation performance
  1. StratifiedShuffleSplit: Этот модуль создает единый набор для обучения/тестирования, имеющий одинаково сбалансированные (стратифицированные) классы. По сути, это то, что вы хотите с помощью n_iter=1. Вы можете указать размер теста здесь так же, как в train_test_split

код:

>>> sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
>>> len(sss)
1
>>> for train_index, test_index in sss:
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
>>> # fit and predict with your classifier using the above X/y train/test

Ответ 3

Здесь приведен пример данных непрерывной/регрессии (до эта проблема на GitHub).

# Your bins need to be appropriate for your output values
# e.g. 0 to 50 with 25 bins
bins     = np.linspace(0, 50, 25)
y_binned = np.digitize(y_full, bins)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y_binned)

Ответ 4

В дополнение к принятому ответу @Andreas Mueller, просто добавьте это как @tangy, упомянутое выше:

StratifiedShuffleSplit наиболее близко напоминает train_test_split (stratify = y) с добавленными функциями:

  • stratify по умолчанию
  • указав n_splits, он многократно разбивает данные

Ответ 5

#train_size is 1 - tst_size - vld_size
tst_size=0.15
vld_size=0.15

X_train_test, X_valid, y_train_test, y_valid = train_test_split(df.drop(y, axis=1), df.y, test_size = vld_size, random_state=13903) 

X_train_test_V=pd.DataFrame(X_train_test)
X_valid=pd.DataFrame(X_valid)

X_train, X_test, y_train, y_test = train_test_split(X_train_test, y_train_test, test_size=tst_size, random_state=13903)