Вопрос или проблема
У меня есть следующее:
train_set, test_set = train_test_split(arbres_df, test_size=0.2, random_state=42)
Это старая train_test_split
, которую мы знаем.
А затем я разделяю признаки и целевую переменную:
train_feat = train_set.drop("anneedeplantation", axis=1).reset_index(drop=True)
train_target = train_set["anneedeplantation"].copy().reset_index(drop=True)
Следуя знаменитой книге Hands-on Machine Learning, у меня возникла небольшая проблема с построением пайплайна:
Автор использует train_test_split
в начале проекта, он также отделяет целевую переменную и признаки в X_train
и y_train
, проводит некоторый анализ в train_data
, строит новые признаки и т.д., а затем помещает все в пайплайн для преобразования данных. Все в порядке.
Теперь я работаю над другим проектом, и одна вещь произошла иначе: после разделения данных мне нужно было удалить некоторые строки в train_feat
. В книге ему не нужно было удалять строки, поэтому при преобразовании данных в пайплайне с этим не возникло проблем. Но мне нужно было удалить некоторые строки, и в итоге у меня остался train_feat
с меньшим количеством строк, чем train_target
.
Мои вопросы:
-
Как я могу вставить в пайплайн инструкцию для удаления эквивалентных строк в
train_target
? Я не могу просто удалить любую строку, это должны быть строки, соответствующие удалённым строкам вtrain_features
. -
Правильна ли ответ на предыдущий вопрос: “не отделяйте данные на
X_train
иy_train
до пайплайна, а только после”? Если да, то хорошая ли это практика?
Чтобы ответить на ваши вопросы, вы выполняете разделение на обучающую и тестовую выборки до того, как обучаете пайплайн. Вам не нужно удалять строки в пайплайне; вы делаете это до разделения на обучающую и тестовую выборки. Иными словами, вы удаляете строки, которые хотите удалить, перед тем, как разделить набор данных, так что тогда не возникнет проблемы с удалением строк в обучающей выборке, а строки будут все еще присутствовать в тестовой выборке.
Не имеет значения, выполняете ли вы разделение на обучающую и тестовую выборки до или после того, как вы “построите” пайплайн, но имеет значение, чтобы вы сделали это до того, как вы обучите пайплайн на данных. Если вы обучите его на всем наборе данных, вам некуда будет его потом тестировать!
Надеюсь, это поможет!
Ответ или решение
Чтобы ответить на ваши вопросы, давайте рассмотрим несколько важных аспектов процесса подготовки данных и использования конвейеров (pipelines) в машинном обучении.
1. Разделение данных на обучающую и тестовую выборки:
Вам действительно следует сначала выполнить разделение данных на обучающую и тестовую выборки с помощью train_test_split()
. Это дает вам возможность обеспечить, чтобы ваши модели не могли «запомнить» данные тестовой выборки и могли обобщать свое поведение на новых данных.
2. Удаление строк:
Удаление строк из train_feat
и train_target
после разделения на выборки может привести к несоответствию между количеством строк в ваших признаках и целевой переменной. Это может вызвать ошибки при обучении модели, поскольку вы будете пытаться соответствовать менее количеству данных в одной выборке с большим количеством в другой.
Рекомендуется удалять ненужные строки перед тем, как выполнять train_test_split()
. Таким образом, все изменения в ваших данных будут согласоваться, и размерность ваших тренировочных и тестовых выборок будет одинаковой.
3. Как поступить:
Если вы хотите сохранить существующий порядок выполнения вашего кода, вы можете реализовать следующую логику:
- Сначала удалите ненужные строки из всего датафрейма.
- Затем выполните
train_test_split()
на уже очищенном датафрейме. - Наконец, разделите датафрейм на
X_train
иy_train
.
Пример кода может выглядеть следующим образом:
# Удаление ненужных строк из всего датафрейма
arbres_df_cleaned = arbres_df.dropna() # пример удаления строк с пустыми значениями, измените по необходимости
# Разделение данных на обучающую и тестовую выборки
train_set, test_set = train_test_split(arbres_df_cleaned, test_size=0.2, random_state=42)
# Отделение признаков и целевой переменной
train_feat = train_set.drop("anneedeplantation", axis=1).reset_index(drop=True)
train_target = train_set["anneedeplantation"].copy().reset_index(drop=True)
4. Проведение анализа и создание конвейера:
После того, как вы завершите все вышеописанные шаги, вы сможете безопасно создать конвейер, который будет применяться как к X_train
, так и к y_train
, без необходимости в дополнительных манипуляциях с данными после разделения.
5. Итог:
Ответ на ваш вопрос — да, вам стоит избегать разделения данных на X_train
и y_train
до завершения всех необходимых операций с данными (таких как удаление строк). Это обеспечит согласованность и поможет избежать потенциальных ошибок. Стратегия, при которой вы очищаете данные перед разделением на выборки, считается хорошей практикой в обработке данных для машинного обучения.
Надеюсь, это поможет вам в вашей работе!