Расслоенные Train/Test-split в scikit-учатся

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

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

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

62
задан 3 April 2015 в 22:11

6 ответов

[обновление для 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)

[/обновление для 0,17]

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

113
ответ дан 31 October 2019 в 13:28

TL; DR: Используйте , StratifiedShuffleSplit с test_size=0.25

Scikit-учится, обеспечивает два модуля для Стратифицированного Разделения:

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

Heres некоторый код (непосредственно из вышеупомянутой документации)

>>> 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
23
ответ дан 31 October 2019 в 13:28

Вот пример для непрерывных данных / данных регрессии (пока этот вопрос о 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)
9
ответ дан 31 October 2019 в 13:28

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

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

  1. расслаиваются значением по умолчанию
  2. путем определения n_splits, оно неоднократно разделяет данные
4
ответ дан 31 October 2019 в 13:28

Можно просто сделать это с train_test_split(), метод, доступный в Scikit, учится:

from sklearn.model_selection import train_test_split 
train, test = train_test_split(X, test_size=0.25, stratify=X['YOUR_COLUMN_LABEL']) 

я также подготовил короткую Суть GitHub, которая показывает, как stratify опция работает:

https://gist.github.com/SHi-ON/63839f3a3647051a180cb03af0f7d0d9

4
ответ дан 31 October 2019 в 13:28
#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)
0
ответ дан 31 October 2019 в 13:28

Другие вопросы по тегам:

Похожие вопросы: