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

25

У меня есть data.frame с 800 obs. 40 переменных, и хотел бы использовать Принцип компонентного анализ, чтобы улучшить результаты моего предсказания (который до сих пор является лучшим с работой опорных векторов на некоторых 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 ?
Тусон
Теперь я добавил больше объяснений к своему ответу. Надеюсь, теперь вам стало понятнее. Да, вы были правы в своей ссылке на predict.prcompпомощь.
Марк в коробке
11

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

Это, конечно, не та информация, которую вы обычно используете в качестве входных данных для дальнейшего анализа. Скорее, вам обычно нужны повернутые данные, которые сохраняются как «х» в объекте, созданном 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 для получения дополнительной информации.

JTT
источник
1
Спасибо @JTT. Так что, если я теперь использую newdat для создания модели SVM, я полагаю, что моя модель принимает данные в этой новой повернутой вселенной, что означает, что мне нужно будет также повернуть мои тестовые данные, прежде чем применять их к модели. Это верно? И если да, то как вы поворачиваете тестовый фрейм data.frame с таким же поворотом?
Тусон
3
Самый простой способ - использовать predict()метод для тестовых данных. Используя приведенный выше пример, predict(pr, USArrests)вернет ту же матрицу, что и pr$x. Для тестовых данных замените USarrests на имя тестовых данных. Вы можете сделать то же самое вручную, но это проще, поскольку методы прогнозирования автоматически заботятся о правильном масштабировании набора тестовых данных.
JTT
1
Как прогнозировать работу? Использует ли он все основные компоненты? В своем ответе вы выбрали только 2 компонента, чтобы покрыть 80% отклонений. Что предсказывает делать?
Тусон
1
Функция predict()использует по умолчанию все компоненты. Тем не менее, вы можете ограничить количество возвращаемых компонентов, например, «предикат (pr, USArrests) [, 1: 2]. Будет ли это работать для вас?
JTT
Вам нужно центрировать и масштабировать новые данные до прогнозирования? Или делает predict()это автоматически, учитывая начальные параметры с prcomp()?
Дейл Куб