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

В этом руководстве мы рассмотрим основы использования перекрестной проверки в 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. Мы также обсудили различные стратегии перекрестной проверки и то, как использовать перекрестную проверку для выбора модели и настройки гиперпараметров.

Я надеюсь, что это руководство послужило хорошим введением в использование перекрестной проверки в машинном обучении.