예측에 R prcomp 결과를 사용하는 방법은 무엇입니까?


25

800 obs가있는 data.frame이 있습니다. 40 개의 변수 중 하나이며 Principle Component Analysis를 사용하여 내 예측 결과를 향상 시키려고합니다 (지금까지는 15 가지 수동 변수에서 Support Vector Machine과 가장 잘 작동 함).

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

가장 중요한 매개 변수를 얻을 것이라고 생각했지만이 정보를 찾지 못했습니다. 내가 보는 것은 PC에서 표준 편차 등입니다. 그러나 이것을 예측에 어떻게 사용합니까?


2
plsPCR ( Principal Component Regression ) 도구가있는 R 라이브러리 (Partial Least Squares )도 있습니다.
Stepan S. Sushko

답변:


35

문제의 본질이 확실하지 않지만 나중에 모델을 작성할 때 예측 변수 그룹에서 주요 패턴을 추출하는 수단으로 PCA를 사용했다고 말할 수 있습니다. 귀하의 예에서 이들은 주요 구성 요소 (PC)에서 PCAAnalysis$x찾을 수 있으며에서 발견 된 변수의 가중치를 기반으로합니다 PCAAnalysis$rotation. 이 프로세스의 장점 중 하나는 PC가 직교하므로 모델 예측 변수 간의 다중 공선 성 문제를 제거한다는 것입니다. 두 번째는 예측 변수에서 대부분의 분산을 캡처하는 더 작은 PC 하위 집합을 식별 할 수 있다는 것입니다. 이 정보는 summary(PCAAnalysis)또는에서 찾을 수 있습니다 PCAAnalysis$sdev. 마지막으로, 예측을 위해 PC의 서브 세트를 사용하려는 경우 tol매개 변수를prcomp 후행 PC를 제거하기 위해 더 높은 수준으로.

이제이 predict.prcomp()기능을 사용하여 새 데이터를 PCA 좌표 기반으로 "투사"할 수 있습니다 . 데이터 세트를 "훈련"데이터 세트라고 부르기 때문에 각 PC 좌표의 계산을 위해 유효성 검사 데이터 세트를 PCA 기반으로 투영하는 것이 좋습니다. 아래는 PCA를 다양한 홍채 종의 4 가지 생체 측정에 맞추는 예입니다 (어느 정도 상관되어 있음). 다음으로, 나는 세 종의 홍채 각각에 대해 이러한 측정의 유사한 조합을 갖는 새로운 꽃 데이터 세트의 생체 값을 투영합니다. 최종 그래프에서 투영 된 PC가 원본 데이터 세트와 유사한 플롯 영역에 있음을 알 수 있습니다.

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도움 에 대한 링크가 정확했습니다 .
Marc in the box

11

질문에 첨부 한 summary () 명령의 정보를 통해 각 주성분이 포착하는 분산의 비율 (예 : 분산 비율)을 볼 수 있습니다. 또한 누적 비율이 출력으로 계산됩니다. 예를 들어, 데이터 세트에서 분산의 75 %를 캡처하려면 23 대의 PC가 있어야합니다.

이것은 확실히 추가 분석에 대한 입력으로 일반적으로 사용하는 정보가 아닙니다. 오히려 일반적으로 필요한 것은 회전 된 데이터이며 prcomp에 의해 생성 된 객체에 'x'로 저장됩니다.

간단한 예로 R 코드를 사용합니다.

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

그런 다음 SVM 또는 일부 회귀 모델에 대한 입력과 같은 추가 분석에 newdat의 데이터를 사용할 수 있습니다. 또한 자세한 내용은 https://stackoverflow.com/questions/1805149/how-to-fit-a-linear-regression-model-with-two-principal-components-in-r 을 참조하십시오.


1
@JTT 감사합니다. 이제 newdat를 사용하여 SVM 모델을 만드는 경우 모델이이 새로운 회전 된 유니버스에서 입력을받는다고 가정합니다. 즉, 테스트 데이터를 모델에 적용하기 전에 회전해야합니다. 이 올바른지? 그렇다면 그렇다면 동일한 회전으로 테스트 데이터 프레임을 어떻게 회전합니까?
tucson

3
가장 쉬운 방법은 predict()테스트 데이터에 방법 을 사용하는 것입니다. 위의 예를 사용 predict(pr, USArrests)하면와 동일한 행렬을 반환합니다 pr$x. 테스트 데이터의 경우 USarrest를 테스트 데이터 이름으로 바꾸십시오. 동일한 방법으로 직접 작업을 수행 할 수 있지만 예측 방법은 테스트 데이터 세트의 올바른 스케일링을 자동으로 처리하므로 더 쉽습니다.
JTT

1
예측은 어떻게 작동합니까? 모든 주성분을 사용합니까? 귀하의 답변에서 분산의 80 %를 커버하기 위해 2 개의 성분 만 선택했습니다. 예측은 무엇입니까?
tucson

1
이 기능 predict()은 기본적으로 모든 구성 요소를 사용합니다. 그러나 반환되는 컴포넌트의 수를 제한 할 수 있습니다 (예 :`predict (pr, USArrests) [, 1 : 2]). 그게 당신을 위해 일할 것입니까?
JTT

예측하기 전에 새 데이터를 중앙에 배치하고 확장해야합니까? 또는 ?를 사용 predict()하여 초기 매개 변수를 자동으로 지정 prcomp()합니까?
데일 쿠베
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.