Як використовувати результати R prcomp для прогнозування?


25

У мене є data.frame з 800 об. з 40 змінних, і я хотів би використати Принциповий аналіз компонентів для покращення результатів мого прогнозування (який поки що найкраще працює з підтримкою Vector Machine на деяких 15-ти змінених вручну змінах).

Я розумію, що prcomp може допомогти мені покращити мої прогнози, але я не знаю, як використовувати результати функції prcomp.

Я отримую результат:

> PCAAnalysis <- prcomp(TrainTrainingData, scale.=TRUE)
> summary(PCAAnalysis)
Importance of components:
                          PC1    PC2    PC3    PC4    PC5   PC6    PC7    PC8    PC9   PC10   PC11   PC12   PC13   PC14
Standard deviation     1.7231 1.5802 1.3358 1.2542 1.1899 1.166 1.1249 1.1082 1.0888 1.0863 1.0805 1.0679 1.0568 1.0520
Proportion of Variance 0.0742 0.0624 0.0446 0.0393 0.0354 0.034 0.0316 0.0307 0.0296 0.0295 0.0292 0.0285 0.0279 0.0277
Cumulative Proportion  0.0742 0.1367 0.1813 0.2206 0.2560 0.290 0.3216 0.3523 0.3820 0.4115 0.4407 0.4692 0.4971 0.5248
                         PC15   PC16   PC17   PC18  PC19   PC20   PC21   PC22   PC23   PC24   PC25   PC26   PC27   PC28
Standard deviation     1.0419 1.0283 1.0170 1.0071 1.001 0.9923 0.9819 0.9691 0.9635 0.9451 0.9427 0.9238 0.9111 0.9073
Proportion of Variance 0.0271 0.0264 0.0259 0.0254 0.025 0.0246 0.0241 0.0235 0.0232 0.0223 0.0222 0.0213 0.0208 0.0206
Cumulative Proportion  0.5519 0.5783 0.6042 0.6296 0.655 0.6792 0.7033 0.7268 0.7500 0.7723 0.7945 0.8159 0.8366 0.8572
                         PC29   PC30   PC31   PC32   PC33   PC34   PC35   PC36    PC37                 PC38
Standard deviation     0.8961 0.8825 0.8759 0.8617 0.8325 0.7643 0.7238 0.6704 0.60846 0.000000000000000765
Proportion of Variance 0.0201 0.0195 0.0192 0.0186 0.0173 0.0146 0.0131 0.0112 0.00926 0.000000000000000000
Cumulative Proportion  0.8773 0.8967 0.9159 0.9345 0.9518 0.9664 0.9795 0.9907 1.00000 1.000000000000000000
                                       PC39                 PC40
Standard deviation     0.000000000000000223 0.000000000000000223
Proportion of Variance 0.000000000000000000 0.000000000000000000
Cumulative Proportion  1.000000000000000000 1.000000000000000000

Я думав, що отримаю параметри, які є найважливішими для використання, але я просто не знаходжу цю інформацію. Все, що я бачу, - це стандартне відхилення тощо на ПК. Але як це використовувати для прогнозування?


2
Існує також бібліотека R pls(Partial Least Squares), в якій є інструменти для ПЛР ( регресія головного компонента ).
Степан Сергійович Сушко

Відповіді:


35

Хоча я не впевнений у характері вашої проблеми, я можу вам сказати, що я використовував PCA як засіб вилучення домінуючих шаблонів у групі змінних прогнозів у подальшому побудові моделі. У вашому прикладі вони знайдуться в основних компонентах (ПК) PCAAnalysis$x, і вони ґрунтуються на зважуванні змінних, знайдених у PCAAnalysis$rotation. Однією з переваг цього процесу є те, що ПК є ортогональними, і таким чином ви усуваєте проблеми мультиколінеарності між модельними прогнозами. По-друге, це те, що ви, можливо, зможете виявити менший підмножина ПК, які фіксують більшість дисперсій у ваших прогнозах. Цю інформацію можна знайти в summary(PCAAnalysis)або в PCAAnalysis$sdev. Нарешті, якщо вам цікаво використовувати підмножину ПК для прогнозування, ви можете встановити tolпараметр уprcomp на більш високий рівень, щоб видалити останні комп'ютери.

Тепер ви можете "проектувати" нові дані на основу координат PCA за допомогою predict.prcomp()функції. Оскільки ви називаєте свій набір даних "навчальним" набором даних, це може мати сенс потім запроектувати набір даних перевірки на вашій PCA для обчислення їх відповідних координат ПК. Нижче наводиться приклад встановлення PCA до 4 біометричних вимірювань різних видів райдужної оболонки (які певною мірою співвідносяться). Після цього я проектую біометричні значення нового набору даних квітів, які мають подібні поєднання цих вимірювань для кожного з трьох видів райдужної оболонки. З підсумкового графа ви побачите, що їхні проектовані ПК лежать у схожій частині ділянки, як і оригінальний набір даних.

Приклад використання irisнабору даних:

### pca - calculated for the first 4 columns of the data set that correspond to biometric measurements ("Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width")
data(iris)

# split data into 2 parts for pca training (75%) and prediction (25%)
set.seed(1)
samp <- sample(nrow(iris), nrow(iris)*0.75)
iris.train <- iris[samp,]
iris.valid <- iris[-samp,]

# conduct PCA on training dataset
pca <- prcomp(iris.train[,1:4], retx=TRUE, center=TRUE, scale=TRUE)
expl.var <- round(pca$sdev^2/sum(pca$sdev^2)*100) # percent explained variance

# prediction of PCs for validation dataset
pred <- predict(pca, newdata=iris.valid[,1:4])

###Plot result
COLOR <- c(2:4)
PCH <- c(1,16)

pc <- c(1,2) # principal components to plot

png("pca_pred.png", units="in", width=5, height=4, res=200)
op <- par(mar=c(4,4,1,1), ps=10)
plot(pca$x[,pc], col=COLOR[iris.train$Species], cex=PCH[1], 
 xlab=paste0("PC ", pc[1], " (", expl.var[pc[1]], "%)"), 
 ylab=paste0("PC ", pc[2], " (", expl.var[pc[2]], "%)")
)
points(pred[,pc], col=COLOR[iris.valid$Species], pch=PCH[2])
legend("topright", legend=levels(iris$Species), fill = COLOR, border=COLOR)
legend("topleft", legend=c("training data", "validation data"), col=1, pch=PCH)
par(op)
dev.off()

введіть тут опис зображення


Дякуємо, що надали стільки деталей. На жаль, приклад коду для мене занадто виразний. Я бачу, ви використовуєте передбачення. Де передбачити посібник для prcomp? це тут: stat.ethz.ch/R-manual/R-patched/library/stats/html/prcomp.html ?
tucson

Зараз я додав більше пояснень до своєї відповіді. Сподіваємось, вам зараз зрозуміліше. Так, ви поправились у своєму посиланні на predict.prcompдопомогу.
Марк у коробці

11

Інформація з команди, що додається до питання, що ви додали до питання, дозволяє вам побачити, наприклад, пропорцію дисперсії, яку захоплює кожен головний компонент (Пропорція дисперсії). Крім того, сукупна частка обчислюється у виробництві. Наприклад, вам потрібно мати 23 ПК, щоб зафіксувати 75% дисперсії у вашому наборі даних.

Це, звичайно, не є тією інформацією, яку ти зазвичай використовуєш для подальших аналізів. Скоріше, вам зазвичай потрібні поворотні дані, які зберігаються як "x" в об'єкті, створеному prcomp.

Використання коду R в якості короткого прикладу.

pr<-prcomp(USArrests, scale = TRUE)
summary(pr) # two PCs for cumulative proportion of >80% 
newdat<-pr$x[,1:2]

Потім ви можете використовувати дані в newdat для подальшого аналізу, наприклад, як вхід до SVM або якоїсь регресійної моделі. Також див., Наприклад, /programming/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r для отримання додаткової інформації.


1
Дякую @JTT. Тож якщо я зараз використовую newdat для створення моделі SVM, я вважаю, що моя модель бере вклад у цю нову обертову всесвіт, а це означає, що мені потрібно буде також повернути свої тестові дані, перш ніж застосовувати їх до моделі. Це правильно? І якщо так, то як ви обертаєте тестовий data.frame з тим же обертанням?
tucson

3
Найпростіший спосіб - використовувати predict()метод для тестових даних. Використовуючи приклад вище, predict(pr, USArrests)повернеться та сама матриця, що і pr$x. Для тестових даних замініть американські арешти на ім'я даних тестів. Можна зробити те ж саме вручну, але це простіше, оскільки методи прогнозування автоматично переймаються правильним масштабуванням набору тестових даних.
JTT

1
Як працює прогнозування? Чи використовуються в ньому всі основні компетентні особи. У своїй відповіді ви вибрали лише 2 компоненти, щоб покрити 80% дисперсії. Що робить прогноз?
tucson

1
Функція predict()за замовчуванням використовує всі компоненти. Однак ви можете обмежити кількість компонентів, що повертаються, наприклад, `predict (pr, USArrests) [, 1: 2]. Це могло б працювати для вас?
JTT

Чи потрібно центровувати та масштабувати нові дані до прогнозу? Або це predict()робить автоматично задані початкові параметри prcomp()?
Дейл Кубе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.