Какова подходящая стратегия для разделения набора данных?
Я прошу обратную связь на следующий подход ( а не на отдельных параметров , таких как 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 не имеет особого смысла в этой последовательности. Так что я бы не принял это.
Ответы:
Я не уверен, что вы хотите сделать на шаге 7а. Как я понимаю, сейчас это не имеет смысла для меня.
Вот как я понимаю ваше описание: на шаге 7 вы хотите сравнить эффективность удержания с результатами перекрестной проверки, охватывающей шаги 4–6 (так что да, это будет вложенная установка).
Основные моменты, почему я не думаю, что это сравнение имеет большой смысл:
Это сравнение не может обнаружить два основных источника результатов овероптимистической проверки, с которыми я сталкиваюсь на практике:
утечка данных (зависимость) между обучающими и тестовыми данными, которая вызвана иерархической (то есть кластеризованной) структурой данных и которая не учитывается при расщеплении. В моей области у нас обычно есть несколько (иногда тысячи) показаний (= строк в матрице данных) одного и того же пациента или биологической копии эксперимента. Они не являются независимыми, поэтому разделение валидации необходимо проводить на уровне пациента. Тем не менее, такая утечка данных происходит, вы будете иметь это как в разделении для набора удержания, так и в перекрестном разделении проверки. Выдержка будет таким же оптимистичным, как и перекрестная проверка.
Предварительная обработка данных выполняется во всей матрице данных, где вычисления не являются независимыми для каждой строки, но многие / все строки используются для расчета параметров для предварительной обработки. Типичными примерами могут быть, например, прогноз PCA до «фактической» классификации.
Опять же, это повлияет как на вашу задержку, так и на внешнюю перекрестную проверку, поэтому вы не сможете ее обнаружить.
Для данных, с которыми я работаю, обе ошибки могут легко привести к недооценке доли неправильных классификаций на порядок!
Если вы ограничены этой подсчитанной долей типа производительности тестовых случаев, для сравнения моделей необходимо либо чрезвычайно большое количество тестовых случаев, либо смехотворно большие различия в истинной производительности. Сравнение двух классификаторов с неограниченными данными обучения может быть хорошим началом для дальнейшего чтения.
Однако, сравнивая качество модели, утверждения о внутренней перекрестной проверке для «оптимальной» модели и внешней перекрестной проверки или отложенной проверки имеют смысл: если расхождение велико, сомнительно, сработала ли ваша поисковая оптимизация по сетке (возможно, у вас дисперсия скиммера из-за высокой дисперсии показателя эффективности). Это сравнение легче в том, что вы можете обнаружить проблемы, если у вас внутренняя оценка смехотворно хороша по сравнению с другой - если это не так, вам не нужно сильно беспокоиться о своей оптимизации. Но в любом случае, если ваше внешнее (7) измерение производительности является честным и надежным, у вас по крайней мере будет полезная оценка полученной модели, независимо от того, является ли она оптимальной или нет.
ИМХО измерение кривой обучения - это еще одна проблема. Я бы , вероятно , иметь дело с этим отдельно, и я думаю , что вам нужно , чтобы более ясно , что вам нужно кривое обучение для (вам нужно кривые обучений для определения в наборе данных данной задачи, данных и методу классификации или кривое обучение для этого набора данных данной проблемы, данных и метода классификации), а также множество дальнейших решений (например, как справиться со сложностью модели как функцией размера обучающей выборки? Оптимизировать все заново, использовать фиксированные гиперпараметры, принять решение о функция для исправления гиперпараметров в зависимости от размера тренировочного набора?)
(Мои данные обычно имеют так мало независимых случаев, чтобы измерить кривую обучения достаточно точно, чтобы использовать ее на практике - но вам может быть лучше, если ваши 1200 строк фактически независимы)
Обновление: Что не так с примером scikit-learn?
Прежде всего, здесь нет ничего плохого во вложенной перекрестной проверке. Вложенная проверка имеет первостепенное значение для оптимизации, управляемой данными, и перекрестная проверка является очень мощным подходом (особенно если повторяется / повторяется).
Затем, если что-то не так, зависит от вашей точки зрения: пока вы выполняете честную вложенную проверку (сохраняя данные внешнего теста строго независимыми), внешняя проверка является надлежащей мерой производительности «оптимальной» модели. В этом нет ничего плохого.
Но при поиске в сетке этих показателей производительности пропорционального типа для настройки гиперпараметра SVM могут и не получатся некоторые вещи. По сути, они означают, что вы не можете (вероятно?) Полагаться на оптимизацию. Тем не менее, если ваше внешнее разделение было выполнено правильно, даже если модель не самая лучшая из возможных, у вас есть честная оценка производительности модели, которую вы получили.
Я постараюсь дать интуитивное объяснение, почему оптимизация может быть в беде:
Говоря математически / статистически, проблема с пропорциями заключается в том, что измеренные пропорции подвержены огромным отклонениям из-за конечного размера тестовой выборки (в зависимости также от истинных характеристик модели, ):p^ n p
Var(p^)=p(1−p)n
Вам нужно смехотворно огромное количество случаев (по крайней мере, по сравнению с количеством случаев, которые я обычно могу иметь), чтобы достичь необходимой точности (смещение / чувство отклонения) для оценки отзыва, точности (чувство производительности машинного обучения). Это, конечно, относится и к коэффициентам, которые вы рассчитываете из таких пропорций. Посмотрите на доверительные интервалы для биномиальных пропорций. Они потрясающе большие! Часто больше, чем истинное улучшение производительности по сравнению с сеткой гиперпараметров. И с точки зрения статистики, поиск по сетке - это серьезная проблема множественного сравнения: чем больше точек сетки вы оцениваете, тем выше риск найти некоторую комбинацию гиперпараметров, которая случайно выглядит очень хорошо для расщепления поезда / теста, которое вы оцениваете. Вот что я имею в виду под дисперсией скимминга.
Интуитивно, рассмотрим гипотетическое изменение гиперпараметра, которое медленно приводит к ухудшению модели: один тестовый пример движется к границе решения. «Жесткие» показатели эффективности пропорции не обнаруживают это до тех пор, пока дело не пересекает границу и не переходит на другую сторону. Затем, однако, они сразу же назначают полную ошибку для бесконечно малого изменения гиперпараметра.
Чтобы выполнить числовую оптимизацию, вам нужно, чтобы показатель производительности был хорошим. Это означает, что ни переходная (не непрерывно дифференцируемая) часть показателя производительности пропорционального типа, ни тот факт, что, кроме этого скачка, фактически обнаруженные изменения не обнаруживаются, не подходят для оптимизации.
Правильные правила оценки определяются таким образом, который особенно подходит для оптимизации. Они имеют свой глобальный максимум, когда прогнозируемые вероятности соответствуют истинным вероятностям для каждого случая принадлежности к рассматриваемому классу.
Для SVM у вас есть дополнительная проблема, заключающаяся в том, что не только показатели производительности, но и модель реагируют таким скачкообразным образом: небольшие изменения гиперпараметра ничего не изменят. Модель изменяется только тогда, когда гиперпараметры изменяются настолько, что некоторые случаи перестают быть опорным вектором или становятся опорным вектором. Опять же, такие модели сложно оптимизировать.
Литература:
Gneiting, T. & Raftery, AE: Строго правильные правила оценки, прогнозирования и оценки, Журнал Американской статистической ассоциации, 102, 359-378 (2007). DOI: 10.1198 / 016214506000001437
Brereton, R .: Хемометрика для распознавания образов, Wiley, (2009).
указывает на скачкообразное поведение SVM как функции гиперпараметров.
Обновление II: дисперсия скимминга
То, что вы можете себе позволить с точки зрения сравнения моделей, очевидно, зависит от количества независимых случаев. Давайте сделаем несколько быстрых и грязных симуляций о риске скимминговой дисперсии здесь:
scikit.learn
говорит, что у них 1797 естьdigits
данные.т.е. все модели имеют одинаковую истинную производительность, скажем, 97% (типичная производительность для
digits
набора данных).Выполните моделирования "тестирования этих моделей" с размером выборки = 1797 строк в наборе данных104
digits
Вот распределение для лучшей наблюдаемой производительности:
Красная линия обозначает истинную производительность всех наших гипотетических моделей. В среднем, мы наблюдаем только 2/3 истинной частоты ошибок для, казалось бы, лучшей из 100 сравниваемых моделей (для моделирования мы знаем, что все они работают одинаково с 97% правильных прогнозов).
Это моделирование, очевидно, очень сильно упрощено:
В целом, однако, как небольшое количество независимых тестовых случаев, так и большое количество сравниваемых моделей увеличивают смещение. Кроме того, статья Коули и Тэлбота дает эмпирическое наблюдаемое поведение.
источник