Назначение переменных, возвращаемых Sklearn train_test_split () - PullRequest
0 голосов
/ 28 мая 2020

Меня смутило использование train_test_split() в sklearn. Вот фрагмент кода того, что я пробовал:

X = example_df.drop('features', axis=1)
y = example_df['price']

y_test, X_train, X_test, y_train= train_test_split(X, y, test_size=0.2)

Как он разбивает строки example_df? example_df имеет 100 строк, поэтому я ожидал, что наборы данных будут разделены на следующие размеры.

  1. y_test должно иметь 80 строк

  2. X_train должно иметь 20 строк

  3. X_test должно иметь 80 строк

  4. y_train должно иметь 20 строк

Но размеры моих наборов данных были соответственно: 20, 20, 80, 20.

Почему это?

1 Ответ

1 голос
/ 28 мая 2020

Итак, в этом случае правильный порядок присвоения переменных, который вы должны использовать, - X_train, X_test, y_train, y_test. то есть вам нужно переписать свой код, чтобы он был

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Распаковка нескольких назначений

Кроме того, я подозреваю, что ваша путаница также может быть вызвана непониманием того, как распаковка нескольких назначений in python работает, и возвращаемое значение train_test_split(...).

Давайте рассмотрим предоставление train_test_split(...) единственного массива для разделения, например y = [0, 1, 2, 3, 4]. train_test_split(y) дает нам результат, который будет выглядеть примерно как [[0, 1, 2], [3, 4]] (плюс-минус некоторое перемешивание). Мы видим, что он берет наш исходный список и возвращает список из 2 списков .

Мы можем передать train_test_split(...) произвольное количество списков для разделения. Итак, давайте посмотрим, что произойдет, если мы предоставим train_test_split(...) 2 списка (list_1, list_2) в качестве входных данных. Он вернет список из 4 списков . Первые два внутренних списка будут обучающим набором list_1, за которым следует набор тестирования list_1, а последние два внутренних списка будут обучающим набором list_2, за которым следует набор тестирования list_2. Однако возвращенные списки не соответствуют никаким ключевым словам, таким как «X_train» или «x_test», это просто старые добрые обычные списки.

Один из способов обработки вывода был бы таким

datasets = train_test_split(list_1, list_2)
list_1_train = datasets[0]
list_1_test = datasets[1]
list_2_train = datasets[2]
list_2_test = datasets[3]

Однако это длительный, повторяющийся и подверженный ошибкам. К счастью, python дает нам синтаксис для распаковки нескольких переменных и их назначения в одном операторе. Эквивалент назначения четырех списков, как показано в приведенном выше фрагменте кода, будет следующим:

[list_1_train, list_1_test, list_2_train, list_2_test] = train_test_split(list_1, list_2)

или с большим количеством сахара :

list_1_train, list_1_test, list_2_train, list_2_test = train_test_split(list_1, list_2)
...