Обзор различных методов перекрестной проверки

Введение

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

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

В этой статье мы рассмотрим некоторые методы перекрестной проверки, такие как перекрестная проверка в k-кратном размере, стратифицированная перекрестная проверка в K-кратном порядке и перекрестная проверка с исключением по одному.

Часть I. K-кратная перекрестная проверка

K-кратная перекрестная проверка - один из наиболее часто используемых методов перекрестной проверки. В этом методе k представляет количество экспериментов (или количество экспериментов), которые я хочу попробовать, чтобы протестировать и обучить свои данные.

Например, предположим, что мы хотим провести 5 экспериментов (или производительности) с нашими данными, состоящими из 1000 записей. Итак, во время первого эксперимента мы тестируем или проверяем первые 200 записей, а затем обучаем оставшиеся 800 записей. Когда первый эксперимент закончен, я получаю определенную точность. Затем мы проводим второй эксперимент, в котором тестируем 200 записей, следующих за предыдущими записями, которые я тестировал, и обучаем оставшиеся 800 записей.

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

В конце своих 5 экспериментов я получу 5 значений точности, и окончательная точность будет средним значением всех погрешностей.

Ниже вы можете увидеть наглядный пример.

Перекрестная проверка реализована в scikit-learn с использованием функции cross_val_score из модуля model_selecion. Параметры функций cross_val_score - это модель, которую мы хотим оценить, данные обучения и цель. Ниже пример с логистической регрессией:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression()
scores = cross_val_score(logreg, X,y,cv=5)

Часть II. Стратифицированная перекрестная проверка K-кратности

Рассматривая предыдущий пример с 1000 записей, иногда начало теста с первых 200 записей не всегда является хорошей идеей. Фактически, в наборе данных мы можем обнаружить, что первая треть данных относится к одному и тому же классу.

Представьте, что у нас есть три класса (0,1 и 2), как вы можете видеть ниже:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]

Как видите, первый третий класс равен 0, второй - 1, а третий - 2. Теперь представьте, что вы проводите 3 эксперимента (k = 3). В нашем первом эксперименте набор тестов будет только в классе 0, а обучающий набор будет только в классах 1 и 2. Итак, вы можете распознать, что точность будет равна 0.

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

Scikit-learn помогает нам со StratifiedkFold. Так:

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_split=5, random_state=None)
# X is the feature set and y is the target
for train_index, test_index in skf.split(X,y): 
    print("Train:", train_index, "Test:", test_index) 
    X_train, X_test = X.iloc[train_index], X.iloc[test_index] 
    y_train, y_test = y[train_index], y[test_index]

Часть III. Перекрестная проверка без исключения

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

Ниже мы можем найти реализацию в scikit-learn с LeaveOneOut.

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
cross_val_score(logreg, X, y, cv=loo)

Заключение

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

Спасибо, что прочитали это. Есть еще несколько способов поддерживать со мной связь и следить за моей работой: