RでPLSのnumber of components(潜在変数)を自動最適化する方法


1.背景と目的
〇背景
・PLSは各変数を主成分軸に射影し、主成分軸との相関を取る線形回帰手法です。変数選択と同様に偽相関の影響を避け、頑健なモデルを構築することが出来ます。
・一般的な使い方は様々なページで公開されています。
bitwalk.blogspot.com

・一方で、PLSでは最終的にnumber of componentsを選択する必要があります。例えば、一般的な使い方をした場合こんな感じで、CV後のRMSEPが最小となる所を選ぶ必要があります。ただ、ここも出来れば自動化したいですよね。(せっかく主観を排除したモデルを作っても、最終判断に人の手が入るのは避けたい。客観的にしたい)

f:id:uni2108:20180901160826p:plain
Cross Validation実施例(使用データには特に意味はありません)

〇目的
・無料で使えるnumber of componentsの最適化手法を紹介することです。

2.総括
・package: plsのselectNcomp関数を使いましょう。
・英語版のhelpを参考に、要点と使い方(sample code)を載せておきます。

3.各論
〇sample code

library(pls)

compounds.plsr <- plsr(y~., data=data, validation="CV")
ncomp.onesigma <- selectNcomp(compounds.plsr, method = "onesigma", plot = TRUE, ylim = c(.1, 1))
ncomp.onesigma

predict(compounds.plsr)[, , ncomp.onesigma]
#本来[, , number of components]ですが、ここでは最適化したものを代入しています
plsr.predicted.y <- predict(compounds.plsr)[, , ncomp.onesigma]
plsr.r2 <- cor(y, plsr.predicted.y)**2
plsr.r2

#実測-予測比較グラフの描画
plot(y, plsr.predicted.y,
xlab="Observed value",
ylab="Predicted value",
main="PLSR")
abline(a=0, b=1)

#係数の出力においても、同様にnumber of componentsは最適化済みのものを設定します
compounds.plsr$coefficients[, , ncomp.onesigma]

 
〇説明
・実際に使用すると、こんな結果が出力されます。onesigmaをmethodとして用いた場合、RMSEPが最小値に対し1σ以内となる、最小のnumber of componentsを選択します。もう一つはrandomizationという手法で、number of componentsを増やしてもRMSEPが有意に減少しなくなった所を選びます。
f:id:uni2108:20180901165628p:plain

4.技術分野
機械学習+語学