Jak korzystać z wyników R prcomp do prognozowania?

25

Mam data.frame z 800 obs. z 40 zmiennych i chciałbym zastosować zasadową analizę komponentów do poprawy wyników mojej prognozy (która do tej pory najlepiej działa z maszyną Vector Support na około 15 ręcznie wybranych zmiennych).

Rozumiem, że prcomp może mi pomóc poprawić moje przewidywania, ale nie wiem, jak korzystać z wyników funkcji prcomp.

Otrzymuję wynik:

> 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

Myślałem, że uzyskam parametry, które są najważniejsze do użycia, ale po prostu nie znajduję tych informacji. Widzę tylko odchylenie standardowe itp. Na komputerach PC. Ale jak mam to wykorzystać do przewidywania?

Tucson
źródło
2
Istnieje również biblioteka R pls(Partial Least Squares), która zawiera narzędzia do PCR ( Principal Component Regression ).
Stepan S. Sushko

Odpowiedzi:

35

Chociaż nie jestem pewien co do natury twojego problemu, mogę ci powiedzieć, że użyłem PCA jako sposobu wydobywania dominujących wzorców w grupie zmiennych predykcyjnych w późniejszym budowaniu modelu. W twoim przykładzie byłyby one znalezione w podstawowych składnikach (PC) PCAAnalysis$xi byłyby oparte na wadze zmiennych znalezionych w PCAAnalysis$rotation. Zaletą tego procesu jest to, że komputery PC są ortogonalne, a zatem usuwa się problemy wielokoliniowości między predyktorami modelu. Po drugie, możesz być w stanie zidentyfikować mniejszy podzbiór komputerów, które wychwytują większość wariancji twoich predyktorów. Informacje te można znaleźć w summary(PCAAnalysis)lub w PCAAnalysis$sdev. Na koniec, jeśli jesteś zainteresowany wykorzystaniem podzbioru komputerów PC do przewidywania, możesz ustawić tolparametr wprcomp na wyższy poziom, aby usunąć końcowe komputery.

Teraz możesz „rzutować” nowe dane na współrzędne PCA za pomocą predict.prcomp()funkcji. Ponieważ nazywasz swój zestaw danych „zestawem szkoleniowym”, może to mieć sens, aby następnie wyświetlić zestaw danych walidacyjnych na podstawie PCA w celu obliczenia ich odpowiednich współrzędnych PC. Poniżej znajduje się przykład dopasowania PCA do 4 pomiarów biometrycznych różnych gatunków tęczówki (które są do pewnego stopnia skorelowane). Następnie projektuję wartości biometryczne nowego zestawu danych kwiatów, które mają podobne kombinacje tych pomiarów dla każdego z trzech gatunków tęczówki. Z końcowego wykresu zobaczysz, że ich rzutowane komputery znajdują się w podobnym obszarze wykresu, co oryginalny zestaw danych.

Przykład z wykorzystaniem iriszestawu danych:

### 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()

wprowadź opis zdjęcia tutaj

Marc w pudełku
źródło
Dziękujemy za podanie tak wielu szczegółów. Niestety przykładowy kod jest dla mnie zbyt tajemniczy. Widzę, że używasz przewidywania. Gdzie jest instrukcja przewidywania prcomp? jest tutaj: stat.ethz.ch/R-manual/R-pched/library/stats/html/prcomp.html ?
tucson
Do mojej odpowiedzi dodałem teraz więcej wyjaśnień. Mam nadzieję, że teraz jest to dla ciebie bardziej zrozumiałe. Tak, masz poprawny link do predict.prcomppomocy.
Marc w pudełku
11

Informacje z polecenia Summary (), które załączyłeś do pytania, pozwalają zobaczyć np. Proporcję wariancji, którą przechwytuje każdy główny składnik (Proporcja wariancji). Ponadto skumulowana proporcja jest obliczana na produkcję globalną. Na przykład musisz mieć 23 komputery, aby uchwycić 75% wariancji w zestawie danych.

Z pewnością nie są to informacje, których zwykle używasz jako danych wejściowych do dalszych analiz. Raczej zwykle potrzebujesz obróconych danych, które są zapisywane jako „x” w obiekcie utworzonym przez prcomp.

Użycie kodu R jako krótkiego przykładu.

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

Następnie możesz wykorzystać dane w newdat do dalszych analiz, np. Jako dane wejściowe do SVM lub jakiegoś modelu regresji. Aby uzyskać więcej informacji , patrz np. Https://stackoverflow.com/questions/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r .

JTT
źródło
1
Dziękuję @JTT. Więc jeśli teraz używam newdat do stworzenia modelu SVM, przypuszczam, że mój model pobiera dane wejściowe w tym nowym obróconym wszechświecie, co oznacza, że ​​będę musiał obrócić moje dane Testowe przed zastosowaniem ich do modelu. Czy to jest poprawne? A jeśli tak, w jaki sposób obracasz ramkę danych testowych z tym samym obrotem?
tucson
3
Najprostszym sposobem jest użycie predict()metody dla danych testowych. W powyższym przykładzie predict(pr, USArrests)zwróci tę samą macierz, co pr$x. W przypadku danych testowych zamień USarrests na nazwę danych testowych. Możesz zrobić to samo ręcznie, ale jest to łatwiejsze, ponieważ metody prognozowania automatycznie dbają o prawidłowe skalowanie zestawu danych testowych.
JTT
1
Jak działa przewidywanie? Czy korzysta ze wszystkich głównych składników? W swojej odpowiedzi wybrałeś tylko 2 komponenty, aby pokryć 80% wariancji. Co robi przewidywanie?
tucson
1
Funkcja predict()korzysta domyślnie ze wszystkich składników. Można jednak ograniczyć liczbę zwracanych komponentów, np. „Przewidywana (pr, USArrests) [, 1: 2]. czy to byłoby dla Ciebie ok?
JTT
Czy chcesz wyśrodkować i skalować nowe dane przed prognozowaniem? Czy robi predict()to automatycznie, biorąc pod uwagę początkowe parametry za pomocą prcomp()?
Dale Kube,