본문 바로가기
공부/R & Python

15-3. Partial Least Square

by 드인 2020. 3. 6.

15-3. Partial Least Square


1) Partial Least Square Regression (PLS)

- 주성분분석의 component최소자승회귀법의 component의 비교

                                                Latent variable (LV)

- PLS는 공정변수들의 변동을 설명하는 벡터 t를 구하는데 X의 정보만을 이용하는 것이 아니라 타겟변수 y의 정보를 동시에 고려

- PLS에서의 component는 PCR와 다르게 X의 정보만을 이용하는 것이 아니라 타겟변수(Y)와의 상관성을 고려하여 도출된다.

- Chemometrics, Marketing분야의 고차원데이터, 독립변수간 상관성 높은 데이터에 적용

 

- t(components)는 X들의 벡터의 선형조합으로 산출하는데 이 때 가중치로서 벡터 xj를 벡터 y에 projection한 weight를 이용한다. 이는 NIPALS Algoruthm으로 산출된다.

 

- PLS를 수행하기 위한 추가 패키지 설치

install.packages('pls')
library(pls)

PLS 수행을 위한 패키지 : "pls"

 

data(gasoline)
help("gasoline")

pls 패키지에 탑재된 데이터 gasoline 사용

여기서 data(gasoline)은 데이터를 load한다는 의미

 

- 데이터 설명 - 가솔린 데이터* (근적외선 흡광도, 60개의 가솔린 표본)

- 독립변수의 차원 : 401

- 타겟변수(Y) : 옥탄가(octane numbers)

 

- 데이터 요약 설명 (타겟변수 Y : 옥탄가)

par(mfrow=c(1,1))
hist(octane, col=3)
summary(octane)

- 옥탄가의 최소값 83.4, 최대값 89.6

- 히스토그램은 옥탄가의 분포를 보여줌

 

- 훈련데이터와 검증데이터 (50개 / 10개)

gasTrain <- gasoline[1:50, ]
gasTest <- gasoline[51:60, ]

 

- 주성분분석에서는 최적 성분수?

ga.pca<-prcomp(gasoline$NIR,center=T,scale.=F)
ga.pca
summary(ga.pca)

plot(ga.pca,type="l") 

최소 5개정도의 PC는 사용

 

- PLS함수 : plsr

help(plsr)

- PLS함수 : plsr(타겟변수~독립변수, ncomp= , data= )

gas1 <- plsr(octane ~ NIR, ncomp = 10, data = gasTrain, validation = "LOO")

옵션사항 : 

ncomp : 잠재변수의 수

validation=c("none", "CV", "LOO")

CV : cross-validation

LOO : leave-one-out

 

octane~NIR

NIR에 401차원의 값이 들어있음


summary(gas1)

 

- PLS결과 (1개의 잠재변수 -> 10개의 잠재변수)

- PLS모형에서의 최적 잠재변수의 수 :

plot(RMSEP(gas1), legendpos = "topright", pch=46, cex=1.0, main="Cross-validation for # of LV")

- 최적 PLS모형의 실제값과 예측값 산점도

plot(gas1, ncomp = 2, asp = 1, line = TRUE, cex=1.5,main="Measured vs Predicted", xlab="Measured" )

- 잠재변수 수에 따른 전체분산의(독립변수들) 설명정도

explvar(gas1)

2개의 잠재변수가 => 분산 전체의 85.58% 설명

 

- 검증데이터의 RMSEP계산

ypred<-predict(gas1, ncomp = 2, newdata = gasTest)

y<-gasoline$octane[51:60]
 
sqrt((sum(y-ypred)^2)/10)

 

[출력 결과]

[1] 0.2442074

 

RMSEP(gas1, newdata = gasTest)

- PLS 예측값 내보내기

out1<-cbind(y, ypred)

write.csv(out1,file="out1.csv", row.names = FALSE)

PLS 예측값 내보내기