Что такое кросс валидация
Перейти к содержимому

Что такое кросс валидация

  • автор:

Обучение модели машинного обучения с помощью перекрестной проверки

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

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

Данные и модель данных

Используя данные из файла, который имеет следующий формат:

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($) 620.00, 148330.32, 140913.81, 136686.39, 146105.37 550.00, 557033.46, 529181.78, 513306.33, 548677.95 1127.00, 479320.99, 455354.94, 441694.30, 472131.18 1120.00, 47504.98, 45129.73, 43775.84, 46792.41 

Данные можно моделировать с помощью класса, например, HousingData , и загружать в IDataView .

public class HousingData < [LoadColumn(0)] public float Size < get; set; >[LoadColumn(1, 3)] [VectorType(3)] public float[] HistoricalPrices < get; set; >[LoadColumn(4)] [ColumnName("Label")] public float CurrentPrice < get; set; >> 

Подготовка данных

Следует предварительно обработать данные перед их использованием для создания модели машинного обучения. В этом примере столбцы Size и HistoricalPrices объединяются в один вектор признака, который выводится в новый столбец с именем Features с помощью метода Concatenate . Кроме получения данных в формате, ожидаемом алгоритмами ML.NET, сцепка столбцов оптимизирует последующие операции в конвейере, применяя операцию один раз для объединенного столбца, а не обрабатывая каждый отдельный столбец.

Как только столбцы объединяются в один вектор, NormalizeMinMax применяется к столбцу Features , чтобы получить Size и HistoricalPrices в одном и том же диапазоне 0–1.

// Define data prep estimator IEstimator dataPrepEstimator = mlContext.Transforms.Concatenate("Features", new string[] < "Size", "HistoricalPrices" >) .Append(mlContext.Transforms.NormalizeMinMax("Features")); // Create data prep transformer ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data); // Transform data IDataView transformedData = dataPrepTransformer.Transform(data); 

Обучение модели с помощью кросс-валидации

Когда данные предварительно обработаны, пришло время для обучения модели. Во-первых, выберите алгоритм, который наиболее точно соответствует задаче машинного обучения. Поскольку прогнозируемое значение является числовым и непрерывным, задача — регрессия. Один из алгоритмов регрессии, реализуемый ML.NET, – алгоритм StochasticDualCoordinateAscentCoordinator . Для обучения модели с использованием кросс-валидации используется метод CrossValidate .

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

// Define StochasticDualCoordinateAscent algorithm estimator IEstimator sdcaEstimator = mlContext.Regression.Trainers.Sdca(); // Apply 5-fold cross validation var cvResults = mlContext.Regression.CrossValidate(transformedData, sdcaEstimator, numberOfFolds: 5); 

CrossValidate выполняет следующие действия.

  1. Разбивает данные на несколько секций по значению, указанному в параметре numberOfFolds . В результате каждая секция превратится в объект TrainTestData .
  2. Модель обучается на каждой из секций с помощью указанного алгоритма оценки машинного обучения в наборе данных для обучения.
  3. Эффективность каждой модели оценивается с помощью метода Evaluate на тестовом наборе данных.
  4. Для всех моделей возвращается сама модель, а также ее метрики.

Результат в cvResults сохраняется в коллекции объектов CrossValidationResult . Этот объект включает обученную модель, а также метрики, доступные через свойства Model и Metrics соответственно. В этом примере свойство Model имеет тип ITransformer , а свойство Metrics имеет тип RegressionMetrics .

Оценка модели

Метрики для разных обученных моделей доступны через свойства Metrics отдельного объекта CrossValidationResult . В этом случае метрика R-квадрат извлекается и сохраняется в переменной rSquared .

IEnumerable rSquared = cvResults .Select(fold => fold.Metrics.RSquared); 

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

// Select all models ITransformer[] models = cvResults .OrderByDescending(fold => fold.Metrics.RSquared) .Select(fold => fold.Model) .ToArray(); // Get Top Model ITransformer topModel = models[0]; 

Совместная работа с нами на GitHub

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

Введение в кросс-валидацию k-fold

Введение в кросс-валидацию k-fold

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

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

В этом уроке мы рассмотрим процедуру кросс-валидации k-fold для оценки качества моделей машинного обучения.

После завершения этого урока, вы будете знать:

  • Как использовать k-fold кросс-валидацию для оценки квалификации модели на новых данных.
  • общие тактики, которые можно использовать, чтобы выбрать значение k для набора данных.
  • широко используемые вариации на перекрестной проверки, такие как стратифицированы (stratified) и repeated, которые доступны в библиотеки scikit-learn.

Урок состоит из 5 частей:

  • k-Fold Кросс-Валидация
  • Конфигурация k
  • Рабочий пример
  • Работы с API кросс-валидации
  • Вариации на кросс-валидации

k-Fold кросс-Валидация

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

Процедура имеет один параметр, называемый k, который относится к числу групп, на которые должна быть разделена данная выборка данных. Таким образом, процедура часто называется перекрестной проверкой (кросс-валидацией) k-fold. При выборе определенного значения для k, оно может быть использовано вместо k в ссылке на модель, например, при k=10, становится 10-кратной перекрестной проверкой.

Перекрестная проверка в основном используется в прикладном машинном обучении для оценки квалификации модели машинного обучения на не используемых данных. То есть использовать ограниченную выборку (test sample) для оценки того, как модель будет работать в целом при использовании ее при прогнозирования на данных, не используемых во время обучения модели.

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

Общая процедура заключается в следующем:

1. Перемешайте датасет случайным образом

2. Разделите датасет на k-групп

3. Для каждой уникальной выборки:

  • Возьмите группу в качестве тестирования датасета
  • Возьмите остальные группы в качестве выборки учебных данных
  • Приготовьте модель на обучаемых выборках и оцените ее на тестовой выборке
  • Сохраняйте оценку модели и отбросьте модель

4. Обобщите параметры качества модели с помощью выборки оценки моделей

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

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

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

Конфигурация параметра k

Значение k должно быть тщательно выбрано для выборки данных.

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

Существуют три подхода для выбора значения параметра k:

  • Представитель: Значение для k выбрано таким образом, что каждая группа подборка/тестовая группа данных достаточно велика, чтобы быть статистически репрезентативной для более широкого набора данных.
  • k=10: Значение для k фиксируется до 10. Данное число было найдено в ходе экспериментов и обычно приводит к оценке качества модели с низкой предвзятостью небольшую дисперсии.
  • k = n: Значение для k фиксируется на n, где n является размером набора данных, чтобы дать каждому тестовой группе возможность быть использованной в наборе данных.

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

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

Рабочий пример

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

Представьте, что у нас есть выборка данных с 6 наблюдениями:

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]

Первым шагом является выбор значения для k для определения количества выборок, используемых для разделения данных. Здесь мы будем использовать значение k=3. Это означает, что мы будем тасовать данные, а затем разделить данные на 3 группы. Поскольку у нас есть 6 наблюдений, каждая группа будет иметь равно 2 наблюдения.

subset1: [0,5, 0,2] subset2: [0,1, 0,3] subset3: [0,4, 0,6]

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

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

  • Модель1: обучаем на subset1 и subset2, тестируем на subset3
  • Модель2: обучаем на subset2 и subset3, тестируем на subset1
  • Модель3: обучаем на subset1 и subset3, тестируем на subset2

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

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

API кросс-валидации

Мы не должны осуществлять k-fold проверки вручную. Библиотека scikit-learn предоставляет реализацию, которая поможет разделить датасет .

Метод KFold() из библиотеки scikit-learn может быть использован. Он принимает в качестве аргументов количество выборок на которое надо разбить датасет, следует ли перетасовывать датасет, и числовую затравку для псевдослучайного генератора чисел, используемого до перетасовки датасета.

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

kfold = KFold(3, True, 1)

Функция split() может быть вызвана на классе, в котором в качестве аргумента приводится выборка данных. При повторном вызове, split() будет возвращать выборки данных на которых идет обучение и тестовый выборка. В частности, возвращаются массивы, содержащие индексы, в исходный датасет, в можно указываются ссылки как на обучаемую выборку, так и на тестовую выборку на каждой итерации.

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

#перечисление выборок датасета for train, test in kfold.split(data): print('train: %s, test: %s' % (train, test))

Мы можем связать все это вместе с нашим датасетом, используемым в примере из предыдущего раздела.

# scikit-learn k-fold кросс-валидация from numpy import arrayfrom sklearn.model_selection import KFold # датасет data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6]) # подготовьте кросс валидацию kfold = KFold(3, True, 1) # перечисление выборок датасета for train, test in kfold.split(data): print('train: %s, test: %s' % (data[train], data[test]))

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

train: [0.1 0.4 0.5 0.6], test: [0.2 0.3] train: [0.2 0.3 0.4 0.6], test: [0.1 0.5] train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]

Реализация перекрестной проверки k-fold в scikit-learn предоставляется в качестве компонентной операции в рамках более широких методов, таких как гиперпараметры модели поиска сетки и оценка модели на наборе данных.

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

Вариации на кросс-валидацию

Существует ряд вариаций процедуры перекрестной проверки k-fold.

Три часто используемых варианта:

  • Обучение / Тест выборка: Самая крайность, это когда k = 2 (не 1) так, что одна выборка идет на обучение и одна и тест для оценки модели.
  • LOOCV: Другая крайность, когда k равен общему размеру наблюдений в датасете. По-английски это называется leave-one-out cross-validation, или LOOCV для краткости.
  • Стратифицированная выборка (stratified): разделение данных на складки может регулироваться такими критериями, чтобы каждая выборка имела одинаковую пропорцию наблюдений с заданным категоричным значением, например значением класса. Это называется стратифицированной перекрестной проверкой.
  • Повторяющаяся выборка (repeated): k-fold перекрестная валидация повторяется n раз, и датасет перетасовывается на каждой итерации, что приводит к иной выборки данных.

Библиотека scikit-learn предоставляет набор реализации перекрестной проверки

Подведем итог


В этом уроке вы узнали про процедуру перекрестной проверки k-fold для оценки качества моделей машинного обучения.

В частности, вы узнали:

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

Полезные ссылки:

  • sklearn.model_selection.KFold() API
  • sklearn.model_selection: Model Selection API

Кросс-валидация (Cross-validation)

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

В основе метода лежит разделение исходного множества данных на k примерно равных блоков, например k = 5 . Затем на k − 1 , т.е. на 4-х блоках, производится обучение модели, а 5-й блок используется для тестирования. Процедура повторяется k раз, при этом на каждом проходе для проверки выбирается новый блок, а обучение производится на оставшихся.

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

На практике чаще всего выбирается k = 10 (10-ти проходная перекрестная проверка), когда модель обучается на 9/10 данных и тестируется на 1/10. Исследования показали, что в этом случае получается наиболее достоверная оценка выходной ошибки модели.

Кросс-валидация

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

Определения и обозначения

Пусть [math] X [/math] — множество признаков, описывающих объекты, а [math] Y [/math] — конечное множество меток.

[math]T^l = <(x_i, y_i)>_^, x_i \in X, y_i \in Y[/math] — обучающая выборка,

[math]Q[/math] — мера качества,

[math]\mu: (X \times Y)^l \to A, [/math] — алгоритм обучения.

Разновидности кросс-валидации

Валидация на отложенных данных (Hold-Out Validation)

Обучающая выборка один раз случайным образом разбивается на две части [math] T^l = T^t \cup T^ [/math]

Hold-out.png

После чего решается задача оптимизации:

[math]HO(\mu, T^t, T^) = Q(\mu(T^t), T^) \to min [/math] ,

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

Полная кросс-валидация (Complete cross-validation)

  1. Выбирается значение [math]t[/math] ;
  2. Выборка разбивается всеми возможными способами на две части [math] T^l = T^t \cup T^ [/math] .

CompleteCrossValidation.png

Здесь число разбиений [math]C_l^[/math] становится слишком большим даже при сравнительно малых значениях t, что затрудняет практическое применение данного метода.

k-fold кросс-валидация

  1. Обучающая выборка разбивается на [math] k [/math] непересекающихся одинаковых по объему частей;
  2. Производится [math] k [/math] итераций. На каждой итерации происходит следующее:
    1. Модель обучается на [math] k — 1 [/math] части обучающей выборки;
    2. Модель тестируется на части обучающей выборки, которая не участвовала в обучении.

    Каждая из [math]k[/math] частей единожды используется для тестирования. Как правило, [math]k = 10[/math] (5 в случае малого размера выборки).

    K-fold-validation.png

    [math]T^l = F_1 \cup \dots \cup F_k, |F_i| \approx \frac, \\ CV_k = \frac \sum_^ Q(\mu(T^l \setminus F_i),F_i) \to min [/math] .

    # Пример кода для k-fold кросс-валидации: # Пример классификатора, cпособного проводить различие между всего лишь двумя # классами, "пятерка" и "не пятерка" из набор данных MNIST import numpy as np from sklearn.model_selection import StratifiedKFold from sklearn.datasets import fetch_openml from sklearn.base import clone from sklearn.linear_model import SGDClassifier mnist = fetch_openml('mnist_784', version=1) X, y = mnist["data"], mnist["target"] y = y.astype(np.uint8) X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] y_train_5 = (y_train == 5) # True для всех пятерок, False для всех остальных цифр. Задача опознать пятерки y_test_5 = (y_test == 5) sgd_clf = SGDClassifier(random_state=42) # классификатор на основе метода стохастического градиентного спуска (Stochastic Gradient Descent SGD) # Разбиваем обучающий набора на 3 блока # выработку прогнозов и их оценку осуществляем на каждом блоке с использованием модели, обученной на остальных блоках skfolds = StratifiedKFold(n_splits=3, random_state=42) for train_index, test_index in skfolds.split(X_train, y_train_5): clone_clf = clone(sgd_clf) X_train_folds = X_train[train_index] y_train_folds = y_train_5[train_index] X_test_fold = X_train[test_index] y_test_fold = y_train_5[test_index] clone_clf.fit(X_train_folds, y_train_folds) y_pred = clone_clf.predict(X_test_fold) n_correct = sum(y_pred == y_test_fold) print(n_correct / len(y_pred)) # print 0.95035 # 0.96035 # 0.9604 

    t×k-fold кросс-валидация

    1. Процедура выполняется [math]t[/math] раз:
      1. Обучающая выборка случайным образом разбивается на [math]k[/math] непересекающихся одинаковых по объему частей;
      2. Производится [math] k [/math] итераций. На каждой итерации происходит следующее:
        1. Модель обучается на [math] k — 1 [/math] части обучающей выборки;
        2. Модель тестируется на части обучающей выборки, которая не участвовала в обучении.

        [math]T^l = F_ \cup \dots \cup F_ = \dots = F_ \cup \dots \cup F_, |F_| \approx \frac [/math] ,

        Кросс-валидация по отдельным объектам (Leave-One-Out)

        Выборка разбивается на [math]l-1[/math] и 1 объект [math]l[/math] раз.

        LeaveOneOut.png

        [math]LOO = \frac \sum_^ Q(\mu(T^l \setminus p_i),p_i) \to min [/math] , где [math]p_i = (x_i, y_i)[/math] .

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

        Недостатком LOO является большая ресурсоёмкость, так как обучаться приходится [math]L[/math] раз. Некоторые методы обучения позволяют достаточно быстро перенастраивать внутренние параметры алгоритма при замене одного обучающего объекта другим. В этих случаях вычисление LOO удаётся заметно ускорить.

        Случайные разбиения (Random subsampling)

        Выборка разбивается в случайной пропорции. Процедура повторяется несколько раз.

        CompleteCrossValidation.png

        Критерий целостности модели (Model consistency criterion)

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

        ModelConsistencyCriterion.png

        Метод может быть обобщен как аналог [math] CV_ [/math] .

        См. также

        • Общие понятия
        • Модель алгоритма и ее выбор
        • Мета-обучение

        Примечания

        Источники информации

        1. Скользящий контроль — статья на MachineLearning.ru
        2. Model assessment and selection

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *