Перехресна перевірка PCA та k-кратна в упаковці каре в R


16

Я щойно переглянув лекцію з курсу машинного навчання на курсі. У розділі, де професор обговорює PCA для попередньої обробки даних у контрольованих навчальних програмах, він каже, що PCA слід виконувати лише на навчальних даних, а потім відображення використовується для перетворення перехресних перевірок і тестових наборів. Дивіться також PCA та розділ поїздів / тестів .

Однак у caretпакеті R дані про навчання, які ви train()передаєте у функцію, вже обробляються PCA. Отже, коли алгоритм виконує перехресну валідацію k-кратно, набір крос-валідації вже оброблений за допомогою PCA через preProcess()і predict()фактично використовується в PCA "примірці".

Чи правильно я розумію ситуацію? Тобто процедура перехресної перевірки з PCA (або, фактично, з будь-яким методом масштабування / центрування) є "неправильною", оскільки попередня обробка даних виконується як на крос-валідації, так і на навчальному наборі? І якщо так, то який би великий вплив це мало на результати?


1
Цікаве запитання. Чи дає професор Нг причини, чому "PCA слід виконувати лише на даних тренувань, а потім картографування використовується для перетворення крос-валідації та тестових наборів"? Моя інтуїція полягає в тому, що вплив повинен бути мінімальним, оскільки передбачається, що дані поїздів / cv / тестів надходять з одного розподілу, а PCA не включає змінну (-ів) від виходу / залежності.
miura

1
@miura Так. Виконуючи PCA, нам потрібно вирішити для мінімальної кількості k розмірів k у вихідних векторах, необхідних для досягнення бажаної "нерозподіленої дисперсії". Цей параметр k зараз є (на мій розуміння) додатковим параметром нашого алгоритму, який нам потрібен. Якщо ми також виконуємо PCA на наборі перехресної перевірки, ми фактично навчаємо частину нашого алгоритму на наборі резюме, зменшуючи таким чином значення перехресної перевірки.
мчангун

Я думаю, що ви плутаєте PCA та MDS, але в обох методах ви не встановлюєте бажану збережену дисперсію. Але ви можете обчислити його за рахунок коригування, яке вони приносять для зменшення до k розмірів. Вам не потрібно його підходити, оскільки перший вимір завжди зменшить більше дисперсії, ніж другий, а другий - більше, ніж третій ...
llrs

Відповіді:


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.


21

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

наприклад , не робіть цього:

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"))

1
Якщо я виконую prProcess, як ви пропонуєте, чи потрібно попередньо обробляти нові дані, коли я хочу використовувати модель для прогнозів? На даний момент я лише роблю: pred <- predict(knnFit2, newdata) де newdataне масштабується. Чи достатньо розумний Карет, щоб знати, що йому потрібно попередньо обробити, newdataперш ніж використовувати його для прогнозів?
mchangun

7
@mchangun ні. caret зберігає параметри попередньої обробки та попередньо обробляє нові дані під час виклику predict.caret. це досить гладко!
Зак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.