RでGAPLSを実装してみる

1.背景と目的
〇背景
・PLSは各変数を主成分軸に射影し、主成分軸との相関を取る線形回帰手法です。
 このため、変数選択と同様に偽相関の影響を避け頑健なモデルを構築することが出来ます。
・そうは言っても、やはり明示的に変数選択も実施したい、という欲求はあります。
 特に、市場分析や研究、品質管理などの業務においては、モデルの妥当性を他者に納得してもらう必要があります。
・そこでよく用いられるのが、GAPLSです。本手法は、遺伝的アルゴリズムを用いてどの変数の組合せが最も好適なモデルかを計算するものです。
Python版のコードは、例えば下記のページなどで無料公開されています。
datachemeng.com

・一方で、R版のpackageはなかなか見つかりません。例えばこんな情報がありますが、有料なので少し敷居が高い。
univprof.com

〇目的
・無料で使えるGAPLSのR用packageを紹介することです。

2.総括
・package: gaselectが使えます(無料で公開済みでした。和訳版がなかったんですね)。
・英語版のhelpを参考に、要点と使い方(sample code)を載せておきます。

3.各論
〇sample code

#GAの定義(世代ごとのサンプル数、世代数、説明変数の束縛条件など)
ctrl <- genAlgControl(populationSize = 100, numGenerations = 15, minVariables = 5,
                      maxVariables = 18, verbosity = 1)

#最適化手法:SRCVかRDCVを選択できます(後述)。
evaluatorSRCV <- evaluatorPLS(numReplications = 2, innerSegments = 7, testSetSize = 0.4,
                              numThreads = 1)

evaluatorRDCV <- evaluatorPLS(numReplications = 2, innerSegments = 5, outerSegments = 3,
                              numThreads = 1)

# X,yの定義
set.seed(12345)
#X,yは好きなデータベースでかまいません。ただし、Xはmatrix形式に変換する必要があります。
X <- as.matrix(X)
y <- y
y

#SRCV, RDCVを基準に、それぞれGAにて計算を行います。
resultSRCV <- genAlg(y, X, control = ctrl, evaluator = evaluatorSRCV, seed = 123)
resultRDCV <- genAlg(y, X, control = ctrl, evaluator = evaluatorRDCV, seed = 123)

#それぞれ、最上位~5位の組み合わせを示します。
subsets(resultSRCV, 1:5)
subsets(resultRDCV, 1:5)

・結果例(結果自体には全く意味がありません。こんな風に表示されることだけご理解いただければOK)

> subsets(resultRDCV, 1:5)
$`1`
 [1] "A7"  "A12" "A15" "A18" "A20" "A22" "A25" "A26" "A28" "A29" "A30" "A31" "A52"
[14] "A56" "A58"

$`2`
 [1] "A9"  "A12" "A15" "A20" "A22" "A25" "A28" "A29" "A30" "A31" "A34" "A44" "A45"
[14] "A49" "A50" "A52" "A56" "A58"

$`3`
 [1] "A2"  "A8"  "A12" "A15" "A20" "A22" "A25" "A26" "A28" "A29" "A30" "A31" "A42"
[14] "A44" "A45" "A52" "A56" "A58"

$`4`
 [1] "A7"  "A12" "A15" "A18" "A20" "A22" "A25" "A26" "A28" "A29" "A30" "A31" "A43"
[14] "A49" "A50" "A52" "A56" "A58"

$`5`
 [1] "A6"  "A7"  "A12" "A14" "A15" "A20" "A22" "A25" "A26" "A28" "A29" "A30" "A31"
[14] "A52" "A56" "A58"


〇説明
・genAlgControl関数では、GAの条件を定義しています。
 -population size:1世代ごとの候補数
 ーnumGenerations:何世代分試行するか
 ーmin / maxvariables:説明変数の最小 / 大値
 -verbosity:冗長性(0 ~ 2で設定)
・genAlg関数では、Cross Varidationの方法を規定しています。
 SRCVはSingle Repeated, RDはRepeated Doubleに対応。
 outerSegments > 1の時はRDとなり、この場合はtestSetSizeを記載する必要はありません(書くとエラー出ます)
 余談ですが、最近はRDの方が予測精度に優れている、という情報を見かけることがあります。
・subset関数は変数選択の結果を出力するものです。
 ここではそれぞれベスト5の選択結果を見ています。
・yとXはなんでも構いませんが、Xはmatrixである必要があります。
 Data.frame形式とかだとerrorがでるので、その場合は一度as.matrix()で変換して下さい。

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