Перекрестная проверка — это широко используемый метод машинного обучения для оценки производительности модели и выбора гиперпараметров. Он включает в себя разделение доступных данных на несколько складок, обучение модели на некоторых складках и оценку ее на оставшихся складках. Этот процесс повторяется несколько раз с использованием различных комбинаций складок для обучения и оценки, чтобы получить надежную оценку производительности модели.
В этом руководстве мы рассмотрим основы использования перекрестной проверки в Python, в том числе способы ее реализации вручную и способы использования встроенных функций перекрестной проверки scikit-learn. Мы также обсудим различные стратегии перекрестной проверки и способы использования перекрестной проверки для выбора модели и настройки гиперпараметров.
Внедрение перекрестной проверки вручную
Чтобы реализовать перекрестную проверку вручную в Python, вы можете использовать класс model_selection.KFold
из scikit-learn. Этот класс предоставляет итератор, который дает разделение данных для обучения/тестирования для заданного количества сгибов.
Вот пример использования KFold
для выполнения k-кратной перекрестной проверки набора данных классификации:
import numpy as np from sklearn.model_selection import KFold from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer # Load the breast cancer dataset from scikit-learn data = load_breast_cancer() X = data['data'] y = data['target'] # Define the model model = LogisticRegression() # Define the cross-validation iterator kfold = KFold(n_splits=5, shuffle=True, random_state=42) # Initialize an array to store the evaluation scores scores = [] # Loop over the folds for train_index, test_index in kfold.split(X): # Get the training and test data for this fold X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] # Fit the model to the training data and evaluate on the test data model.fit(X_train, y_train) score = model.score(X_test, y_test) scores.append(score) # Print the mean and standard deviation of the evaluation scores print(f'Mean score: {np.mean(scores):.2f}') print(f'Standard deviation: {np.std(scores):.2f}')
Этот код загружает набор данных о раке молочной железы из scikit-learn, определяет модель логистической регрессии, а затем определяет 5-кратный итератор перекрестной проверки, используя KFold
. Затем код перебирает сгибы, используя обучающие данные для подбора модели и тестовые данные для оценки модели. Оценочные баллы сохраняются в массиве, а затем среднее значение и стандартное отклонение выводятся на консоль.
Использование функций перекрестной проверки scikit-learn
Scikit-learn предоставляет ряд удобных функций для выполнения перекрестной проверки, которые могут быть более эффективными и простыми в использовании, чем их реализация вручную. Эти функции включают в себя:
model_selection.cross_val_score
: Эта функция выполняет k-кратную перекрестную проверку модели и возвращает оценочные баллы для каждой кратности.
import numpy as np from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer # Load the breast cancer dataset from scikit-learn data = load_breast_cancer() X = data['data'] y = data['target'] # Define the model model = LogisticRegression() # Perform k-fold cross-validation scores = cross_val_score(model, X, y, cv=5) # Print the mean and standard deviation of the evaluation scores print(f'Mean score: {np.mean(scores):.2f}') print(f'Standard deviation: {np.std(scores):.2f}')
Этот код эквивалентен предыдущему примеру, но использует cross_val_score
для выполнения k-кратной перекрестной проверки и напрямую возвращает оценочные баллы.
model_selection.cross_val_predict
: Эта функция выполняет k-кратную перекрестную проверку и возвращает предсказанные метки для каждой выборки.
import numpy as np from sklearn.model_selection import cross_val_predict from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer # Load the breast cancer dataset from scikit-learn data = load_breast_cancer() X = data['data'] y = data['target'] # Define the model model = LogisticRegression() # Perform k-fold cross-validation and get the predicted labels for each sample predictions = cross_val_predict(model, X, y, cv=5) # Print the mean and standard deviation of the predicted labels print(f'Mean prediction: {np.mean(predictions):.2f}') print(f'Standard deviation: {np.std(predictions):.2f}')
Этот код аналогичен предыдущему примеру, но использует cross_val_predict
для получения предсказанных меток для каждого образца вместо оценок оценки.
model_selection.GridSearchCV
: Эта функция выполняет исчерпывающий поиск по указанной сетке гиперпараметров с использованием k-кратной перекрестной проверки. Он возвращает лучшие гиперпараметры на основе производительности модели на данных проверки.
import numpy as np from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer # Load the breast cancer dataset from scikit-learn data = load_breast_cancer() X = data['data'] y = data['target'] # Define the model and the hyperparameter grid model = LogisticRegression() param_grid = {'C': [0.1, 1, 10, 100]} # Use grid search with k-fold cross-validation to tune the hyperparameters grid_search = GridSearchCV(model, param_grid, cv=5) grid_search.fit(X, y)
Выбор количества складок
Количество кратностей в k-кратной перекрестной проверке является важным гиперпараметром, который может повлиять на производительность модели и надежность оценок. Большее количество кратностей обеспечит более точную оценку производительности модели, но также будет медленнее для вычислений.
Обычный выбор — использовать 5 или 10 фолдов, которые обеспечивают хороший баланс между точностью и скоростью.
Также можно использовать стратифицированную k-кратную перекрестную проверку, которая гарантирует, что пропорции разных классов в складках такие же, как и в исходном наборе данных. Это может быть полезно для несбалансированных наборов данных, где один класс встречается гораздо чаще, чем другие.
Различные стратегии перекрестной проверки
Помимо k-кратной перекрестной проверки, существует несколько других стратегий перекрестной проверки, которые могут быть полезны в различных ситуациях.
- Перекрестная проверка по одному исключению (LOOCV). Это особый случай перекрестной проверки в k-кратном порядке, где
k
равно размеру обучающей выборки. Это означает, что один образец используется в качестве проверочного набора, а остальные данные используются для обучения. LOOCV может быть очень точным, но также очень медленным для вычислений, особенно для больших наборов данных. - Стратифицированная перекрестная проверка в k-кратном порядке: как упоминалось ранее, это вариант перекрестной проверки в k-кратном порядке, который гарантирует, что пропорции различных классов в сгибах такие же, как и в исходном наборе данных. Это может быть полезно для несбалансированных наборов данных, где один класс встречается гораздо чаще, чем другие.
- Перекрестная проверка с разделением в случайном порядке: это вариант перекрестной проверки в k-кратном порядке, при котором данные перемешиваются, прежде чем они будут разделены на складки. Это может быть полезно, если данные имеют какой-то порядок или если порядок выборок важен.
- Перекрестная проверка временных рядов. Это вариант перекрестной проверки k-кратного размера, специально разработанный для данных временных рядов. Он включает в себя разделение данных на фиксированное количество кратностей, но разделение выполняется по времени, а не случайным образом. Это может быть полезно, если данные имеют временные зависимости, которые следует сохранить в складках.
Использование перекрестной проверки для выбора модели и настройки гиперпараметров
Одним из основных применений перекрестной проверки является выбор модели и настройка гиперпараметров. Используя перекрестную проверку, вы можете оценить производительность различных моделей и различных комбинаций гиперпараметров на одних и тех же данных и выбрать модель и гиперпараметры, которые работают лучше всего.
Чтобы использовать перекрестную проверку для выбора модели и настройки гиперпараметров, вы можете использовать функцию scikit-learn GridSearchCV
. Эта функция выполняет исчерпывающий поиск по указанной сетке гиперпараметров с использованием перекрестной проверки в k-кратном порядке и возвращает лучшие гиперпараметры на основе производительности модели по данным проверки.
Вот пример использования GridSearchCV
для настройки гиперпараметров модели логистической регрессии:
import numpy as np from sklearn.model_selection import GridSearchCV from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_breast_cancer # Load the breast cancer dataset from scikit-learn data = load_breast_cancer() X = data['data'] y = data['target'] # Define the model and the hyperparameter grid model = LogisticRegression() param_grid = {'C': [0.1, 1, 10, 100], 'penalty': ['l1', 'l2']} # Use grid search with k-fold cross-validation to tune the hyperparameters grid_search = GridSearchCV(model, param_grid, cv=5) grid_search.fit(X, y) # Print the best hyperparameters print(f'Best hyperparameters: {grid_search.best_params_}') # Print the mean and standard deviation of the evaluation scores for the best model scores = grid_search.cv_results_['mean_test_score'] stds = grid_search.cv_results_['std_test_score'] for mean, std, params in zip(scores, stds, grid_search.cv_results_['params']): print(f'{mean:.3f} (+/-{std * 2:.3f}) for {params}')
Этот код определяет модель логистической регрессии и сетку гиперпараметров для поиска. Затем он использует `GridSearchCV` для выполнения исчерпывающего поиска по сетке гиперпараметров с использованием k-кратной перекрестной проверки. Затем распечатываются лучшие гиперпараметры вместе со средним значением и стандартным отклонением оценок для лучшей модели.
Заключение
В этом руководстве мы рассмотрели основы использования перекрестной проверки в машинном обучении с использованием Python. Мы рассмотрели, как реализовать перекрестную проверку вручную и как использовать встроенные функции перекрестной проверки scikit-learn. Мы также обсудили различные стратегии перекрестной проверки и то, как использовать перекрестную проверку для выбора модели и настройки гиперпараметров.
Я надеюсь, что это руководство послужило хорошим введением в использование перекрестной проверки в машинном обучении.