Вопрос или проблема
Я пробую пример, над которым я тренируюсь на огромном наборе данных в 5 миллионов (только 4 признака) строк с помощью Cudf и CUml, и я использую SGD логистическую регрессию, потому что я должен предсказать, болен ли пациент или нет.
Я использую стратифицированный K-fold, потому что в наборе данных 20474 инфицированных и остальные 4_979_256 — здоровые. В качестве метрики я буду использовать Recall или F1-меру.
Я провел 5 стратифицированных K-fold и теперь хочу сделать поиск по сетке.
Я видел в руководстве https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
(cuml имеет те же параметры)
Мой вопрос: cv = 5 (по умолчанию) Я хочу спросить, если я делаю 5 cv, нужно ли мне 5 РАЗНЫХ One hot encoding и нормализаций (иначе у меня возникнет утечка данных), как вы с этим справляетесь: вы просто запускаете один раз поиск по сетке без K-fold, просто разделяя обучающие и тестовые данные с конкретным случайным состоянием, а затем запускаете 5, 10 и т. д. cv, и если результаты в порядке, вы говорите: хорошо, завершено? Или я что-то упускаю?
Начните с разделения данных на обучающую и тестовую выборки. Тестовый набор должен оставаться невидимым до тех пор, пока вы не проведете окончательную оценку модели на нем. Он также не должен включаться при подгонке функций предобработки, таких как нормализация, масштабирование и т. д., чтобы предотвратить утечку данных.
Затем с обучающими данными вы запускаете GridSearchCV, который автоматически разделит обучающие данные на 5 частей (если cv = 5
), и каждая из этих частей один раз будет являться валидационным набором для поиска по сетке, а в остальное время — обучающим набором для поиска по сетке.
В конце, когда GridSearchCV завершится, он подгонит модель с лучшими найденными параметрами модели на всей обучающей выборке, которая была передана в функцию GridSearchCV. Эта модель должна быть наилучшей и может использоваться для оценки на невидимом тестовом наборе.
Ответ или решение
Для решения вашей задачи, связанной с обучением модели на большом наборе данных в 5 миллионов строк, важно следовать правильной последовательности шагов, чтобы избежать утечек данных и оптимально подобрать гиперпараметры модели.
1. Разделение на обучающую и тестовую выборки
Первым шагом будет разделение ваших данных на обучающую и тестовую выборки. Под тестовой выборкой мы подразумеваем те данные, которые не будут затрагиваться во время обучения модели и на которых вы впоследствии будете оценивать качество модели. Это разделение должно быть сделано один раз, и тестовые данные должны оставаться невидимыми до момента финальной оценки.
2. Предобработка данных
Когда у вас есть обучающая выборка, вы можете приступить к предобработке данных. Этот этап может включать в себя:
- Масштабирование числовых признаков (например, стандартное масштабирование или min-max нормализация)
- One-Hot кодирование категориальных признаков
Важно, чтобы эти предобработки применялись только к обучающей выборке, чтобы избежать утечки данных. Для того, чтобы избежать утечки данных, вы можете использовать методы, встроенные в GridSearchCV
. При этом он будет автоматически управлять процессом разбиения данных, что исключит возможность утечек.
3. Использование GridSearchCV
Теперь вы можете применить GridSearchCV
к вашей обучающей выборке. Устанавливая cv=5
, GridSearchCV
разделит ваши данные на 5 частей (это и есть кросс-валидация). Каждая из этих частей будет по очереди использоваться в качестве валидационной выборки в процессе подбора гиперпараметров. На каждом этапе подбора параметров будет осуществляться предобработка данных, что позволит избежать утечки.
Вот пример того, как это может выглядеть в коде:
from cuml.linear_model import SGDClassifier
from cuml.model_selection import GridSearchCV
from cuml.preprocessing import StandardScaler
from cuml.pipeline import Pipeline
from cuml.datasets.classification import make_classification
# Создание данных для примера
X, y = make_classification(n_samples=5_000_000, n_features=4, n_classes=2, random_state=42)
# Разделение на обучающую и тестовую выборки
from cuml.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Создание пайплайна
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', SGDClassifier())
])
# Определение сетки гиперпараметров
param_grid = {
'classifier__alpha': [1e-4, 1e-3, 1e-2],
'classifier__max_iter': [1000, 2000]
}
# Создание объекта GridSearchCV
grid_search = GridSearchCV(pipeline, param_grid, scoring='f1', cv=5)
# Обучение модели
grid_search.fit(X_train, y_train)
# Оценка на тестовой выборке
best_model = grid_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print(f'Лучшее значение F1 на тестовой выборке: {test_score}')
4. Функция окончательной оценки
После завершения работы GridSearchCV
, вам останется провести окончательную оценку на тестовой выборке. Модель с лучшими параметрами будет автоматически переобучена на всей обучающей выборке после завершения процедуры подбора параметров.
Этот процесс позволяет избежать утечек данных и обеспечивает адекватное распределение данных на этапе кросс-валидации, что позволит получить надежные метрики, такие как F1 или Recall.
Таким образом, вы правильно подходите к решению своей задачи, не упуская из виду важность правильного разделения данных и предобработки для достижения лучших результатов.