Как разделить набор данных для перекрестной проверки, кривой обучения и окончательной оценки?

70

Какова подходящая стратегия для разделения набора данных?

Я прошу обратную связь на следующий подход ( а не на отдельных параметров , таких как test_sizeили n_iter, но если я X, y, X_train, y_train, X_test, и y_testсоответствующим образом и , если последовательность имеет смысл):

(расширяя этот пример из документации scikit-learn)

1. Загрузите набор данных

from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target

2. Разделить на тренировочный и тестовый набор (например, 80/20)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. Выберите оценщик

from sklearn.svm import SVC
estimator = SVC(kernel='linear')

4. Выберите итератор перекрестной проверки

from sklearn.cross_validation import ShuffleSplit
cv = ShuffleSplit(X_train.shape[0], n_iter=10, test_size=0.2, random_state=0)

5. Настройте гиперпараметры

применение итератора перекрестной проверки к обучающему набору

from sklearn.grid_search import GridSearchCV
import numpy as np
gammas = np.logspace(-6, -1, 10)
classifier = GridSearchCV(estimator=estimator, cv=cv, param_grid=dict(gamma=gammas))
classifier.fit(X_train, y_train)

6. Алгоритм отладки с кривой обучения

X_trainслучайным образом разбивается на тренировку и набор тестов 10 раз ( n_iter=10). Каждая точка на кривом обучение-бального среднее из 10 баллов , где обучалась модель и оценивала на первом я обучающие примерах. Каждая точка на кривой оценки перекрестной проверки представляет собой среднее из 10 оценок, в которых модель обучалась на первых i обучающих примерах и оценивалась на всех примерах набора тестов.

from sklearn.learning_curve import learning_curve
title = 'Learning Curves (SVM, linear kernel, $\gamma=%.6f$)' %classifier.best_estimator_.gamma
estimator = SVC(kernel='linear', gamma=classifier.best_estimator_.gamma)
plot_learning_curve(estimator, title, X_train, y_train, cv=cv)
plt.show()

Кривая обучения

plot_learning_curve () можно найти в текущей версии разработчика scikit-learn (0.15-git).

7. Окончательная оценка на тестовом наборе

classifier.score(X_test, y_test)

7а. Проверка перебора в выборе модели с вложенной перекрестной проверкой (с использованием всего набора данных)

from sklearn.cross_validation import cross_val_score
cross_val_score(classifier, X, y)

Дополнительный вопрос: имеет ли смысл заменить шаг 7 вложенной перекрестной проверкой? Или следует ли рассматривать вложенный cv как дополнительный к шагу 7

(кажется, что код работает с перекрестной проверкой k-fold в scikit-learn, но не с shuffle & split. Поэтому cvнеобходимо изменить выше, чтобы код работал)

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

classifier.fit(X, y)

РЕДАКТИРОВАТЬ: Теперь я согласен с cbeleites, что шаг 7a не имеет особого смысла в этой последовательности. Так что я бы не принял это.

tobip
источник
Какое правило оценки точности вы используете? Если это точность классификации, такое неправильное правило оценки отменит большую часть работы, которую вы проделали.
Фрэнк Харрелл
Я использовал значение по умолчанию, которое действительно является точностью классификации. Я знаю, что, например, F1 будет более подходящим. Но здесь мне просто интересно, используются ли сплиты нормально.
февраля
3
Я почти уверен, что F1 - это новое имя для старой концепции. Я считаю, что придумывать новые имена для старых вещей контрпродуктивно. Что еще более важно, это неправильное правило оценки, которое приведет к выбору неправильных функций, а также добавит много шума во весь процесс.
Фрэнк Харрелл
3
... в любом случае F1 разделяет проблемы точности, на которые ссылается @FrankHarrell: они основаны на подсчете долей тестовых случаев с жесткой классификацией. Чтобы получить одно из правильных правил оценки Фрэнка, вам нужно переключиться на вероятностный вывод SVM, а затем, например, использовать оценку Бриера (среднеквадратическую ошибку) вместо точности. Я думаю, вы также можете получить версию F1 для MSE. Такие меры действительно должны быть лучше для этапа настройки. Для информирования об окончательном исполнении вам также могут понадобиться типичные способы (например, точность, F1) выражения производительности для вашего сообщества.
cbeleites
1
@ ta.ft: неправильный подход или нет, зависит от того, что вы считаете неправильным: поиск по пропорциям в сетке имеет серьезный риск скимминговой дисперсии, если у вас нет смехотворно большого числа независимых случаев. Таким образом, для многих ситуаций утверждение, что поиск по сетке дает оптимальную модель, неверно. Однако, если вы делаете правильную вложенную проверку, внешняя проверка дает достоверную оценку производительности выбранной «оптимальной» модели. Так что это не так. У вас просто нет гарантии, что при поиске по сетке получена оптимальная модель. Что касается литературы, я обновлю свой ответ.
cbeleites

Ответы:

41

Я не уверен, что вы хотите сделать на шаге 7а. Как я понимаю, сейчас это не имеет смысла для меня.

Вот как я понимаю ваше описание: на шаге 7 вы хотите сравнить эффективность удержания с результатами перекрестной проверки, охватывающей шаги 4–6 (так что да, это будет вложенная установка).

Основные моменты, почему я не думаю, что это сравнение имеет большой смысл:

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

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

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

    Для данных, с которыми я работаю, обе ошибки могут легко привести к недооценке доли неправильных классификаций на порядок!

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

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

ИМХО измерение кривой обучения - это еще одна проблема. Я бы , вероятно , иметь дело с этим отдельно, и я думаю , что вам нужно , чтобы более ясно , что вам нужно кривое обучение для (вам нужно кривые обучений для определения в наборе данных данной задачи, данных и методу классификации или кривое обучение для этого набора данных данной проблемы, данных и метода классификации), а также множество дальнейших решений (например, как справиться со сложностью модели как функцией размера обучающей выборки? Оптимизировать все заново, использовать фиксированные гиперпараметры, принять решение о функция для исправления гиперпараметров в зависимости от размера тренировочного набора?)

(Мои данные обычно имеют так мало независимых случаев, чтобы измерить кривую обучения достаточно точно, чтобы использовать ее на практике - но вам может быть лучше, если ваши 1200 строк фактически независимы)


Обновление: Что не так с примером scikit-learn?

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

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

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

Я постараюсь дать интуитивное объяснение, почему оптимизация может быть в беде:

  • Говоря математически / статистически, проблема с пропорциями заключается в том, что измеренные пропорции подвержены огромным отклонениям из-за конечного размера тестовой выборки (в зависимости также от истинных характеристик модели, ):p^np
    Var(p^)=p(1p)n

    Вам нужно смехотворно огромное количество случаев (по крайней мере, по сравнению с количеством случаев, которые я обычно могу иметь), чтобы достичь необходимой точности (смещение / чувство отклонения) для оценки отзыва, точности (чувство производительности машинного обучения). Это, конечно, относится и к коэффициентам, которые вы рассчитываете из таких пропорций. Посмотрите на доверительные интервалы для биномиальных пропорций. Они потрясающе большие! Часто больше, чем истинное улучшение производительности по сравнению с сеткой гиперпараметров. И с точки зрения статистики, поиск по сетке - это серьезная проблема множественного сравнения: чем больше точек сетки вы оцениваете, тем выше риск найти некоторую комбинацию гиперпараметров, которая случайно выглядит очень хорошо для расщепления поезда / теста, которое вы оцениваете. Вот что я имею в виду под дисперсией скимминга.

  • Интуитивно, рассмотрим гипотетическое изменение гиперпараметра, которое медленно приводит к ухудшению модели: один тестовый пример движется к границе решения. «Жесткие» показатели эффективности пропорции не обнаруживают это до тех пор, пока дело не пересекает границу и не переходит на другую сторону. Затем, однако, они сразу же назначают полную ошибку для бесконечно малого изменения гиперпараметра.
    Чтобы выполнить числовую оптимизацию, вам нужно, чтобы показатель производительности был хорошим. Это означает, что ни переходная (не непрерывно дифференцируемая) часть показателя производительности пропорционального типа, ни тот факт, что, кроме этого скачка, фактически обнаруженные изменения не обнаруживаются, не подходят для оптимизации.
    Правильные правила оценки определяются таким образом, который особенно подходит для оптимизации. Они имеют свой глобальный максимум, когда прогнозируемые вероятности соответствуют истинным вероятностям для каждого случая принадлежности к рассматриваемому классу.

  • Для SVM у вас есть дополнительная проблема, заключающаяся в том, что не только показатели производительности, но и модель реагируют таким скачкообразным образом: небольшие изменения гиперпараметра ничего не изменят. Модель изменяется только тогда, когда гиперпараметры изменяются настолько, что некоторые случаи перестают быть опорным вектором или становятся опорным вектором. Опять же, такие модели сложно оптимизировать.

Литература:


Обновление II: дисперсия скимминга

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

scikit.learnговорит, что у них 1797 есть digitsданные.

  • Предположим, что сравниваются 100 моделей, например, сетка × для 2 параметров.10×10
  • предположим, что оба параметра (диапазоны) вообще не влияют на модели,
  • т.е. все модели имеют одинаковую истинную производительность, скажем, 97% (типичная производительность для digitsнабора данных).

  • Выполните моделирования "тестирования этих моделей" с размером выборки = 1797 строк в наборе данных104digits

    p.true = 0.97 # hypothetical true performance for all models
    n.models = 100 # 10 x 10 grid
    
    n.rows = 1797 # rows in scikit digits data
    
    sim.test <- replicate (expr= rbinom (n= nmodels, size= n.rows, prob= p.true), 
                           n = 1e4)
    sim.test <- colMaxs (sim.test) # take best model
    
    hist (sim.test / n.rows, 
          breaks = (round (p.true * n.rows) : n.rows) / n.rows + 1 / 2 / n.rows, 
          col = "black", main = 'Distribution max. observed performance',
          xlab = "max. observed performance", ylab = "n runs")
    abline (v = p.outer, col = "red")
    

Вот распределение для лучшей наблюдаемой производительности:

моделирование дисперсии скимминга

Красная линия обозначает истинную производительность всех наших гипотетических моделей. В среднем, мы наблюдаем только 2/3 истинной частоты ошибок для, казалось бы, лучшей из 100 сравниваемых моделей (для моделирования мы знаем, что все они работают одинаково с 97% правильных прогнозов).

Это моделирование, очевидно, очень сильно упрощено:

  • В дополнение к дисперсии размера тестовой выборки есть, по крайней мере, дисперсия из-за нестабильности модели, поэтому мы недооцениваем дисперсию здесь
  • Параметры настройки, влияющие на сложность модели, обычно охватывают наборы параметров, где модели нестабильны и, следовательно, имеют высокую дисперсию.
  • Для цифр UCI из примера исходная база данных имеет ок. 11000 цифр написано 44 человека. Что если данные сгруппированы в соответствии с тем, кто написал? (То есть легче распознать цифру 8, написанную кем-то, если вы знаете, как этот человек пишет, скажем, цифру 3?). Тогда эффективный размер выборки может составлять всего 44.
  • Настройка гиперпараметров модели может привести к корреляции между моделями (фактически, это будет считаться хорошим поведением с точки зрения численной оптимизации). Сложно предсказать влияние этого (и я подозреваю, что это невозможно без учета фактического типа классификатора).

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

cbeleites
источник
@cbleites: Если поиск по сетке не может быть подходящим методом для поиска оптимальной модели, какой метод тогда выбрать?
февраля
1
@ ta.ft: два подхода: а) включить как можно больше внешних знаний о вашем приложении и данных в моделирование, чтобы значительно сократить количество моделей, которые нужно сравнивать (= выбирать гиперпараметры вместо оптимизации). В целом, может быть лучше перейти на классификатор, который имеет внутренне значимые гиперпараметры, т. Е. Где вы можете узнать из приложения и типа данных, каким должен быть (приблизительно) гиперпараметр. б) сравнить несколько оставшихся моделей по правильному правилу оценки. Например, оценка Бриерса имеет гораздо лучшие дисперсионные свойства для многих классификаторов
cbeleites
1
Вы также можете отказаться от оптимизации вообще (через решения (а)). Если вы получили достаточно хороший классификатор и можете утверждать, что у вас нет шансов доказать превосходство другого классификатора с учетом доступного размера выборки (например, выполнить некоторые демонстрационные вычисления МакНемара, найдите необходимый размер выборки для сравнений пропорций для гипотетического лучшего классификатора - есть Вероятность того, что они будут смехотворно большими даже для смехотворно больших гипотетических улучшений), можно утверждать, что оптимизация не имеет никакого смысла, а просто создает риск переоснащения.
cbeleites
Я не согласен с вами по поводу "дисперсии скимминга". Если у вас есть много точек в сетке для оптимизации гиперпараметров, точка может случайным образом повезти в одном сгибе резюме; но если у вас, скажем, 10-кратное резюме, маловероятно, что набор параметров случайно повезет во всех 10-кратных резюме.
РНК,
1
@RNA: вероятность быть «счастливой» во всех сгибах напрямую связана с общим числом случаев (во всех 10 сгибах), и обычно рассматривается только среднее значение по всем этим сгибам. Я обновил ответ с помощью симуляции гипотетического выбора лучшей из 100 моделей (скажем, 2 гиперпараметра с 10 шагами в каждой), что уже связано со значительным смещением для примера сценария (частота ошибок слишком мала на 1/3) , Многие люди здесь редко имеют под рукой несколько тысяч независимых случаев - например, у меня редко есть даже 44 человека, которые написали цифры для полного набора данных цифр UCI.
cbeleites