Параметр "стратифицировать" из метода "train_test_split" (scikit Learn)

Я пытаюсь использовать train_test_split Из пакета scikit Узнайте, но у меня проблемы с параметром stratify, Здесь и далее код:

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

Тем не менее, я продолжаю получать следующую проблему:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

У кого-то есть идея, что происходит? Ниже приведена документация по функциям.

[...]

стратификация: массив или нет (по умолчанию нет)

Если не None, данные разделяются стратифицированно, используя это как массив меток.

Новое в версии 0.17: расслоение

[...]

6 ответов

Решение

Scikit-Learn просто говорит вам, что не распознает аргумент "стратифицировать", а не то, что вы используете его неправильно. Это связано с тем, что параметр был добавлен в версию 0.17, как указано в приведенной вами документации.

Так что вам просто нужно обновить Scikit-Learn.

Это stratify Параметр разделяется таким образом, чтобы доля значений в произведенном образце была такой же, как доля значений, предоставленных параметру stratify,

Например, если переменная y является двоичной категориальной переменной со значениями 0 а также 1 и есть 25% нулей и 75% единиц, stratify=y убедитесь, что ваш случайный сплит имеет 25% 0и 75% 1"S.

Для моего будущего я, который приходит сюда через Google:

train_test_split сейчас в model_selection отсюда:

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

это способ использовать его. Настройка random_state желательно для воспроизводимости.

В этом контексте стратификация означает, что метод train_test_split возвращает обучающие и тестовые поднаборы, которые имеют те же пропорции меток классов, что и входной набор данных.

Ответ, который я могу дать, заключается в том, что стратификация сохраняет пропорцию распределения данных в целевом столбце и отображает ту же пропорцию распределения в train_test_split. Возьмем, к примеру, проблему с бинарной классификацией, а в целевом столбце соотношение 80% = да и 20% = нет . Поскольку в целевом столбце в 4 раза больше «да», чем «нет» , при разделении на обучение и тестирование без стратификации мы можем столкнуться с проблемой, что в наш обучающий набор попадет только «да» , а все « нет», попадающих в наш тестовый набор (т. е. в обучающем наборе может не быть «нет»в своем целевом столбце)

Следовательно, при стратификации целевой столбец для обучающего набора имеет 80% «да» и 20% «нет» , а также целевой столбец для тестового набора имеет 80% «да» и 20% «нет». соответственно.

Следовательно, Stratify равномерно распределяет цель (метку) в наборе поездов и тестов — так же, как она распределяется в исходном наборе данных.


X_train, y_train, X_test, y_test = train_test_split(features, target, test-size = 0.25, stratify = target, random_state = 43)

Попробуйте запустить этот код, он "просто работает":

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])
Другие вопросы по тегам