Введение:

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

Что такое перекрестная проверка?

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

Типы перекрестной проверки:

1. K-кратная перекрестная проверка:

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

2. Стратифицированная перекрестная проверка K-кратности:

Стратифицированная кросс-валидация в K-кратном порядке аналогична перекрестной проверке в K-кратном, но гарантирует, что в каждой кратности будет одинаковая доля выборок из каждого класса. Этот тип перекрестной проверки полезен при работе с несбалансированными наборами данных.

3. Перекрестная проверка без исключения:

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

4. Перекрестная проверка временных рядов:

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

Преимущества перекрестной проверки:

  1. Надежность. перекрестная проверка обеспечивает более надежную оценку производительности модели на невидимых данных за счет использования различных подмножеств данных для обучения и оценки.
  2. Выбор модели. Перекрестная проверка полезна для выбора лучшей модели из набора моделей-кандидатов. Обычно выбирается модель с лучшими показателями перекрестной проверки.
  3. Предотвращает переобучение. Перекрестная проверка может помочь предотвратить переобучение, которое происходит, когда модель хорошо работает на обучающих данных, но плохо на тестовых данных. Оценивая модель на невидимых данных, перекрестная проверка помогает определить модели, которые лучше подходят для обучающих данных.

Недостатки перекрестной проверки:

  1. Вычислительные затраты. Перекрестная проверка может потребовать значительных вычислительных ресурсов, особенно если набор данных велик или когда обучение модели занимает много времени.
  2. Утечка данных. Перекрестная проверка может привести к утечке данных, когда информация из оценочного набора попадает в обучающий набор. Это может произойти, когда модель обучается на подмножестве данных, а затем оценивается на оставшихся данных.

Пример кода:

Вот пример K-кратной перекрестной проверки с использованием Python и scikit-learn:

В этом примере мы сначала загружаем набор данных радужной оболочки, используя функцию scikit-learn load_iris. Затем мы создаем объект KFold с 5 складками и инициализируем модель логистической регрессии, используя класс LogisticRegression scikit-learn.

Затем мы перебираем складки, используя метод split объекта KFold. Для каждой складки мы разделяем данные на обучающие и тестовые наборы, используя индексы, предоставленные методом split. Затем мы обучаем модель логистической регрессии на обучающем наборе и оцениваем ее на тестовом наборе, используя метод score модели логистической регрессии.

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

from sklearn.model_selection import KFold
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
import numpy as np

# Load the iris dataset
iris = load_iris()
X = iris.data
y = iris.target

# Create a KFold object with 5 folds
kf = KFold(n_splits=5, shuffle=True)

# Create a logistic regression model
model = LogisticRegression()

# Initialize an array to store the test set scores
test_scores = np.zeros(5)

# Loop over the folds
for i, (train_index, test_index) in enumerate(kf.split(X)):
    # Split the data into training and test sets
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # Train the model on the training set
    model.fit(X_train, y_train)

    # Evaluate the model on the test set and store the score
    test_scores[i] = model.score(X_test, y_test)

# Compute the average test set score
avg_test_score = np.mean(test_scores)

print("Average test set score: {:.2f}".format(avg_test_score))

Приведенный выше фрагмент кода выполняет перекрестную проверку в K-кратном порядке с использованием scikit-learn в Python. Он загружает набор данных радужной оболочки, создает объект KFold с 5 складками, инициализирует модель логистической регрессии, а затем выполняет цикл по складкам для обучения и оценки модели по каждой складке. Наконец, он вычисляет средний балл тестового набора по всем сгибам и распечатывает его.

В этом примере мы используем метод score модели логистической регрессии, чтобы оценить ее эффективность на тестовом наборе для каждой складки. Метод score возвращает точность модели на тестовом наборе. Мы сохраняем баллы набора тестов в массиве, а затем вычисляем средний балл теста по всем сгибам, используя функцию np.mean.

Средний балл теста — это хорошая оценка производительности модели на невидимых данных. Он часто используется в качестве показателя производительности для моделей машинного обучения. В этом примере мы печатаем средний результат теста, используя функцию print, и форматируем его с двумя десятичными знаками, используя синтаксис форматирования строки "{:.2f}".

Таким образом, средний результат теста представляет собой точность модели на невидимых данных и может быть интерпретирован как процент правильно классифицированных выборок. Например, средний балл теста 0,95 означает, что модель правильно классифицировала 95% тестовых образцов в среднем по всем складкам.

Вывод:

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