Обзор различных методов перекрестной проверки
Введение
Как вы знаете, когда мы разделяем наши данные на обучающие и тестовые наборы, наша основная цель - понять способность нашей модели прогнозировать, когда она сталкивается с новыми данными, которые отличаются от данных, используемых на этапе обучения.
В любом случае, есть надежный способ оценить производительность нашей модели. Этот способ называется перекрестной проверкой. Перекрестная проверка - это статистический метод оценки эффективности обобщения, который более стабилен, чем использование разделения на обучающий и тестовый набор.
В этой статье мы рассмотрим некоторые методы перекрестной проверки, такие как перекрестная проверка в 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)
Заключение
В этой статье вы познакомились с наиболее распространенными методами перекрестной проверки, которые используются в машинном обучении для оценки точности модели. В любом случае, есть и другие методы, такие как перекрестная проверка с перемешиванием и разделением, перекрестная проверка с группами и перекрестная проверка временных рядов, которые очень полезны в некоторых ситуациях.
Спасибо, что прочитали это. Есть еще несколько способов поддерживать со мной связь и следить за моей работой:
- Подпишитесь на мою рассылку.
- Вы также можете связаться через мою группу Telegram Data Science for Beginners.