Найти тему
LabelMe

Как избежать неточных показателей оценки при перекрестной проверке

Оглавление

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

Правильно настроить и использовать его - не так просто, как может показаться. Поэтому мы хотим поделиться способом, который упростит процесс перекрестной проверки. Для этого нам потребуется алгоритм SMOT (Synthetic Minority Oversampling Technique). Это метод увеличения числа примеров миноритарного класса.

Часть 1: неверный путь

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

-2

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

Метод, описанный выше, - это неправильный способ использования SMOTE или любой другого алгоритма недостаточной дискретизации/передискретизации из пакета ‘imblearn’. Он может выдать неточный результат перекрестной проверки, который может сильно отличаться от оценки теста или оценки по невидимым данным.

Часть 2: истинный путь

С неправильным примером разобрались. Теперь посмотрим на правильный способ использования SMOTE для перекрестной проверки.

-3

В приведенном выше фрагменте кода мы использовали SMOTE как часть конвейера. Этот конвейер не является конвейером Scikit-Learn, а конвейером «imblearn». Поскольку в SMOTE нет метода fit_transform, мы не можем использовать его с конвейером Scikit-Learn.

Часть 3: проверка

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

Чтобы понять, случайность это или нет, мы проведем небольшой эксперимент. Сгенерируем 500 синтетических наборов данных с дисбалансом классов, используя метод make_classification пакета Scikit-Learn.

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

Здесь мы определили функцию с именем «model», которая принимает входные функции (X), классы (y) и логическое значение «smote» (указывает, должен ли SMOTE быть частью конвейера) в качестве аргументов.

Сначала мы разделяем данные на обучающие и тестовые наборы, затем на основе аргумента «smote» мы включаем SMOTE в конвейер (SMOTE будет частью конвейера, если «smote» имеет значение True) и вычисляем оценки перекрестной проверки и тестирования.

Здесь мы сгенерировали синтетический набор данных по одному за раз, передали его в функцию «model», вычислили результаты перекрестной проверки и тестирования с включением SMOTE в конвейер и без него, сохраняя результаты во фрейме данных. Ниже прикрепляем скрин транспонированного кадра выходных данных.

-4

Давайте подробнее проанализируем и оценим полученные результаты:

На этих записях фрейма данных видно, что в большинстве случаев "SMOTE_IN_PIPELINE_PERCENT_DIFF" очень низок по сравнению с "SMOTE_OUTSIDE_PIPELINE_PERCENT_DIFF". Обратимся к статистике, чтобы убедиться в точности наблюдений.

-6

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

-7

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

-8
Оставшиеся записи с процентной разницей после удаления выбросов
Оставшиеся записи с процентной разницей после удаления выбросов

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

-10

Как видно на графиках, что столбцы процентной разницы выглядят, как бы выразиться, - довольно гауссово. Мы рассчитаем доверительный интервал (с 95% -ным уровнем достоверности) средних процентных различий.

-11

Заключение

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

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

  • Выбранный набор данных имеет характеристики в пределах диапазонов, используемых для проведения эксперимента. То есть количество выборок должно быть от 10 000 до 50 000. Например, вы не можете оценить параметры всего населения, просто исследуя «женщин» в возрастном диапазоне «20–30 лет».
  • Используемая модель - логистическая регрессия. В нашем эксперименте не оценивается влияние других алгоритмов на общие результаты. Следовательно, мы не можем обобщить эти наблюдения на все алгоритмы. Эксперимент должен проводиться с использованием нескольких алгоритмов, чтобы исключить влияние алгоритма на результат.

Другие наши статьи: