Все, что вам нужно знать о методах перекрестной проверки

На практике специалисты по данным работают с тремя различными наборами примеров:

  1. Обучающий набор
  2. набор проверки
  3. тестовый набор

Получив данные в виде набора примеров, первое, что вы делаете в своем проекте машинного обучения, — это перемешиваете примеры и делите набор данных на три отдельных набора: обучение, проверка и тестирование. Учебный набор обычно самый большой; алгоритм обучения использует обучающий набор для создания модели. Наборы для проверки и тестирования имеют примерно одинаковый размер, намного меньше размера обучающего набора. Алгоритму обучения
не разрешается использовать примеры из проверочных или тестовых наборов для обучения модели. Вот почему эти два набора также называются наборами удержания.

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

Перекрестная проверка

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

Итак, что такое перекрестная проверка?

Мое однострочное определение:

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

Когда использовать перекрестную проверку?

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

Мы можем найти несколько определений того, что такое перекрестная проверка. Еще одно определение, которое мне нравится:

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

Но это приводит к другому термину: переоснащение.

Переобучение означает, что модель хорошо изучит обучающие данные, но не будет обобщать невидимые выборки.

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

К ним относятся:
- перекрестная проверка в k-кратном порядке
- стратифицированная перекрестная проверка в k-кратном порядке
- проверка на основе удержания
- перекрестная проверка с исключением одного случая< br /> - групповая k-кратная перекрестная проверка

Как работает k-кратная перекрестная проверка?

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

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

Приступаем к кодированию.

# Download the data
! wget https://raw.githubusercontent.com/amit-timalsina/model-validation-tutorial/master/datasets/winequality-red.csv winequality.csv

Давайте посмотрим, как выглядят эти данные:

import pandas as pd
df = pd.read_csv("winequality-red.csv")

Этот набор данных выглядит примерно так:

Существует довольно известный набор данных о качестве красного вина. Этот набор данных имеет 11 различных атрибутов, которые определяют качество красного вина. Эти атрибуты включают: фиксированную кислотность, летучую кислотность, лимонную кислоту, остаточный сахар, хлориды, свободный диоксид серы, общий диоксид серы, плотность, рН, сульфаты и спирт.

Основываясь на этих различных атрибутах, мы должны предсказать качество красного вина, которое находится в диапазоне от 0 до 10.

Для простоты выберем эту задачу в качестве задачи классификации. Однако этот набор данных состоит только из шести типов значений качества. Таким образом, мы сопоставим все значения качества от 0 до 5.

# a mapping dictionary that maps the quality values from 0 to 5
quality_mapping = {
  3: 0,
  4: 1,
  5: 2,
  6: 3,
  7: 4,
  8: 5
}
# you can use the map function of pandas with
# any dictionary to convert the values in a given
# column to values in the dictionary
df.loc[:, "quality"] = df.quality.map(quality_mapping)

Мы можем разделить любые данные на k-равные части, используя KFold из scikit-learn. Каждому образцу присваивается значение от 0 до k-1 при использовании k-кратной перекрестной проверки.

# We create a new column called kfold and fill it with -1
df_0["kfold"] = -1

# the next step is to randomize the rows of the data
df_0 = df_0.sample(frac=1).reset_index(drop=True)

# initiate the kfold class from model_selection module
kf = model_selection.KFold(n_splits=5)

# fill the new kfold column
for fold, (trn_, val_) in enumerate(kf.split(X=df_0)):
    df_0.loc[val_, "kfold"] = fold

Вы можете использовать этот процесс практически со всеми видами наборов данных: изображениями, текстом и т. д.

Например, если у вас есть изображения, вы можете создать CSV-файл с идентификатором изображения, местоположением изображения и меткой изображения и использовать описанный выше процесс.

Как работает стратифицированная k-кратная перекрестная проверка?

Следующий важный тип перекрестной проверки — стратифицированная k-кратная. Если у вас есть искаженный набор данных для бинарной классификации с 90% положительных выборок и только 10% отрицательных выборок, вы не хотите использовать случайную k-кратную перекрестную проверку. Использование простой k-кратной перекрестной проверки для такого набора данных может привести к свертыванию всех отрицательных выборок. В этих случаях мы предпочитаем использовать стратифицированную k-кратную перекрестную проверку. Стратифицированная k-кратная перекрестная проверка поддерживает постоянное соотношение меток в каждой кратности. Таким образом, в каждом случае у вас будут одинаковые 90% положительных и 10% отрицательных образцов. Таким образом, какую бы метрику вы ни выбрали для оценки, она даст одинаковые результаты во всех сгибах.

Код для создания k-кратной перекрестной проверки легко изменить для создания стратифицированных k-кратных. Мы только меняем model_selection.KFold на
model_selection.StratifiedKFold и в функции kf.split(…) указываем целевой столбец, по которому мы хотим провести стратификацию. Мы предполагаем, что в нашем наборе данных CSV есть столбец под названием «цель», и это проблема классификации!

# We create a new column called kfold and fill it with -1
df_1["kfold"] = -1

# the next step is to randomize the rows of the data
df_1 = df.sample(frac=1).reset_index(drop=True)

# fetch targets
y = df_1.quality.values

# initiate the StratifiedKFold class from model_selection module
kf = model_selection.StratifiedKFold(n_splits=5)

# fill the new kfold column
for fold, (trn_, val_) in enumerate(kf.split(X=df_1, y=y)):
    df_1.loc[val_, "kfold"] = fold

Для набора данных о вине давайте посмотрим на распределение этикеток.

b = sns.countplot(x='quality', data=df)
b.set_xlabel("quality", fontsize=20)
b.set_ylabel("count", fontsize=20)

Обратите внимание, что мы продолжаем код выше. Итак, мы преобразовали целевые значения. Глядя на рисунок 6, можно сказать, что качество очень сильно перекошено. В некоторых классах есть много образцов, а в некоторых не так уж много. Если мы сделаем простое k-кратное, у нас не будет одинакового распределения целей в каждом сверте. Таким образом, в данном случае мы выбираем стратифицированную k-кратность.

Ниже показано распределение меток во всех кратностях при использовании k-кратности. Мы видим, что коэффициент распределения отличается от исходного df.

Но, как вы можете видеть ниже, при использовании стратифицированного k-кратного коэффициента распределения точно соответствует исходному df.

Правило простое. Если это стандартная задача классификации, выбирайте стратифицированную k-fold вслепую.

Как работает удерживающая перекрестная проверка?

Но что делать, если у нас большой объем данных? Предположим, у нас есть 1 миллион образцов. Пятикратная перекрестная проверка будет означать обучение на 800 тысячах образцов и проверку на 200 тысячах. В зависимости от того, какой алгоритм мы выбираем, обучение и даже проверка могут быть очень дорогими для набора данных такого размера. В этих случаях мы можем выбрать проверку на основе задержки.

Набор задержек должен быть репрезентативным для входных данных, которые модель увидит в производстве.

Процесс создания удержания остается таким же, как и для стратифицированной k-кратности. Для набора данных с 1 миллионом выборок мы можем создать десять сгибов вместо 5 и оставить один из этих сгибов в качестве резерва. Это означает, что у нас будет 100 000 сэмплов в задержке, и мы всегда будем рассчитывать потери, точность и другие показатели на этом наборе и тренироваться на 900 000 сэмплах.

Удержание также очень часто используется с данными временного ряда. Предположим, что задача, которую нам предоставили, — это прогноз продаж магазина на 2020 год, а вам предоставлены все данные за 2015–2019 годы. В этом случае вы можете выбрать все данные за 2019 год в качестве резерва и обучить свою модель на всех данных с 2015 по 2018 год.

В примере, представленном на рисунке 9, допустим, наша задача состоит в том, чтобы предсказать продажи с 31-го по 40-й временной шаг. Затем мы можем оставить 21-30-й шаг в качестве задержки и обучить нашу модель с 0-го по 20-й шаг. Обратите внимание, что когда вы прогнозируете от 31 до 40, вы должны включить в свою модель данные от 21 до 30; в противном случае производительность будет ниже номинала.

Как работает перекрестная проверка с исключением одного?

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

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

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

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

Как работает перекрестная проверка GroupKFold?

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

Наша задача — построить бинарный классификатор, который берет входное изображение и предсказывает вероятность его доброкачественности или злокачественности.

В таких наборах данных у вас может быть несколько изображений для одного и того же пациента в наборе обучающих данных. Итак, чтобы построить здесь хорошую систему перекрестной проверки, вы должны иметь стратифицированные k-кратности, но вы также должны убедиться, что пациенты в обучающих данных не появляются в проверочных данных. К счастью, scikit-learn предлагает как GroupKFold, так и StratifiedGroupKFold. Здесь пациентов можно рассматривать как группы.

Спасибо за прочтение!

Если вам было весело здесь, и вы ищете полную дорожную карту для науки о данных, вот то, что я сделал:

https://amit-timalsina.medium.com/how-i-became-machine-learning-engineer-at-18-years-old-full-roadmap-for-beginners-39d26292dc6e

Оставайтесь с нами 😀 до следующего раза.