Да, здесь мы закодируем 5 разных техник!

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

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

Существуют различные методы перекрестной проверки, такие как:

  1. Перекрестная проверка K-кратности
  2. Стратифицированная перекрестная проверка K-кратности
  3. Проверка на основе удержания
  4. Перекрестная проверка без исключения
  5. Групповая перекрестная проверка по K-кратности

Общая идея перекрестной проверки заключается в том, что мы делим данные обучения на несколько частей. Мы выбираем несколько из этих частей для обучения, а остальные — для тестирования модели. Различные методы перекрестной проверки основаны на том, как мы разделяем данные.

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

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

Фрагмент кода для запуска перекрестной проверки K-Fold,

# import model_selection module of scikit-learn
from sklearn import model_selection
# initiate the k-fold 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)):
df.loc[val_, 'kfold'] = fold

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

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

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

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

Чтобы найти подходящее количество бункеров, мы следуем правилу Стерджа,

Количество ячеек = 1 + log2(N)

Где N — количество выборок в вашем наборе данных.

Код для Stratified K-Fold аналогичен, только мы предоставляем целевую переменную, для которой мы хотим сохранить процент выборок,

# import model_selection module of scikit-learn
from sklearn import model_selection
# fetch targets
y = df.target.values
# initiate the kfold class from model_selection module
kf = model_selection.StratifiedKFold(n_splits=5)
# fill the new kfold column
for f, (t_, v_) in enumerate(kf.split(X=df, y=y)):
df.loc[v_, 'kfold'] = f

3. Проверка на основе удержания

Это наиболее распространенный тип перекрестной проверки. Здесь мы разделяем набор данных на обучающий и тестовый наборы, как правило, в соотношении 70:30 или 80:20. Модель обучается на обучающих данных, а оценка производительности происходит на тестовых данных. Поскольку мы знаем, что чем больше данных видит модель, тем лучше она становится, этого подхода здесь не хватает, поскольку он изолирует часть данных от модели во время обучения.

Удерживающая перекрестная проверка также используется в моделях временных рядов, где самые последние данные используются в качестве набора проверки. Например, у нас есть данные за 2005–2010 годы, поэтому мы будем хранить данные за 2010 год для проверки и использовать данные за 2005–2009 годы для обучения.

Мы можем использовать функцию scikit-learn для разделения данных или выполнить разделение вручную для проблем, подобных описанной выше.

# import model_selection module of scikit-learn
from sklearn import model_selection
#holding out 40% of the data for testing (evaluating)
X_train, X_test, y_train, y_test = model_selection.train_test_split (X, y, test_size=0.4, random_state=0)

4.Перекрестная проверка с исключением одного

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

Мы можем использовать код проверки K-Fold для создания n-кратностей, где n — количество выборок в данных. В качестве альтернативы мы также можем использовать метод LeaveOneOut() из scikit-learn,

# import model_selection module of scikit-learn
from sklearn.model_selection import LeaveOneOut
# Instantiate the LeaveOneOut() object
loo = LeaveOneOut()
# Run the function through the dataset (here, X)
loo.get_n_splits(X)
# Get the list of Train-Test sets
for train_index, test_index in loo.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

5. Групповая перекрестная проверка по К-кратному

GroupKFold — это вариант k-fold, который гарантирует, что одна и та же группа не представлена ​​ни в наборах для тестирования/проверки, ни в обучающих наборах.

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

GroupKFold позволяет обнаруживать такие ситуации переобучения.

Фрагмент для применения того же,

# import model_selection module of scikit-learn
from sklearn.model_selection import LeaveOneOut
# Creating GroupKFold Object
n_splits = 5
gkf = GroupKFold(n_splits = 5)
# Creating Group Folds
result = []
for train_idx, val_idx in gkf.split(train_df, y_labels, groups =groups_by_patient_id_list):
train_fold = train_df.iloc[train_idx]
val_fold = train_df.iloc[val_idx]
result.append((train_fold, val_fold))

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

Есть и другие подобные методы перекрестной проверки, но мы оставляем их вам, чтобы изучить и выяснить!

Если вы зашли так далеко, хлопайте в ладоши и следите за мной, чтобы узнать больше!

Кроме того, мы благодарим Абхишека Тхакура за его замечательную книгу «Подход (почти) к любой проблеме машинного обучения» за подробное описание перекрестной проверки и веб-сайт scikit-learn за удивительные визуализации перекрестной проверки.