PCA и k-кратная перекрестная проверка в пакете каретки в R

16

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

Однако в caretпакете R данные обучения, которые вы передаете в train()функцию, уже обработаны PCA. Поэтому , когда алгоритм выполняет K-кратное кросс проверки, набор кросс проверки уже были обработаны с помощью РСА preProcess()и predict()и фактически используется в PCA «фитинг».

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

mchangun
источник
1
Интересный вопрос. Приводит ли профессор Нг причины, по которым «PCA следует выполнять только на данных обучения, а затем использовать сопоставление для преобразования наборов перекрестной проверки и тестирования»? Моя интуиция заключается в том, что воздействие должно быть минимальным, поскольку предполагается, что данные train / cv / test поступают из одного и того же распределения, а PCA не включает выходную / зависимую переменную (и).
Миура
1
@miura Да, он делает. При выполнении PCA нам необходимо определить минимальное число k измерений в выходных векторах, необходимое для достижения желаемой «сохраняемой дисперсии». Этот параметр k теперь является (в моем понимании) дополнительным параметром нашего алгоритма, который нам нужен. Если мы выполняем PCA и на наборе перекрестной проверки, мы фактически обучаем часть нашего алгоритма на наборе CV, тем самым уменьшая значение перекрестной проверки.
mchangun
Я думаю, что вы путаете PCA и MDS, но в обоих методах вы не устанавливаете желаемую сохраняемую дисперсию. Но вы можете рассчитать его по настройке, которую они вносят, чтобы уменьшить до k измерений. Вам не нужно подгонять его, потому что первое измерение всегда будет уменьшать больше дисперсии, чем второе, а второе больше, чем третье ...
11

Ответы:

18

Я не видел лекцию, поэтому не могу комментировать сказанное.

Мои 0,02 доллара: если вы хотите получить хорошие оценки производительности с помощью повторной выборки, вам действительно следует выполнять все операции во время повторной выборки вместо предыдущей. Это действительно верно для выбора функций [1], а также для нетривиальных операций, таких как PCA. Если это добавляет неопределенности к результатам, включите его в повторную выборку.

Подумайте о регрессии основного компонента: PCA, за которым следует линейная регрессия некоторых компонентов. PCA оценивает параметры (с шумом) и количество компонентов также должны быть выбраны (разные значения приведут к разным результатам => больше шума).

Скажем, мы использовали 10-кратное резюме со схемой 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

или схема 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

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

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

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

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

@mchangun: Я думаю, что количество компонентов является параметром настройки, и вы, вероятно, захотите выбрать его, используя оценки производительности, которые можно обобщить. Вы можете автоматически выбрать K так, чтобы было объяснено как минимум X% дисперсии, и включить этот процесс в повторную выборку, чтобы мы учитывали шум в этом процессе.

Максимум

[1] Ambroise, C. & McLachlan, G. (2002). Смещение отбора при экстракции генов на основе данных по экспрессии генов микрочипов. Труды Национальной академии наук, 99 (10), 6562–6566.

topepo
источник
21

Не обрабатывайте данные перед запуском trainфункции! Используйте preProcess аргумент для функции train, и предварительная обработка будет применяться к каждой итерации повторной выборки.

например , не делайте этого:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

сделай это!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))
Zach
источник
1
Если я выполняю prProcess, как вы предлагаете, нужно ли предварительно обрабатывать новые данные, когда я хочу использовать модель для прогнозов? На данный момент я только делаю: pred <- predict(knnFit2, newdata) где newdataне масштабируется. Достаточно ли умен Карет, чтобы знать, что ему нужно предварительно обработать его, newdataпрежде чем использовать его для прогнозов?
Мчангуна
7
@mchangun нет. Caret сохраняет параметры предварительной обработки и будет предварительно обрабатывать новые данные в вызовеgnett.Caret. это довольно гладко!
Зак