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.技術分野
機械学習+語学

Google翻訳を有効に使う方法

1.背景と目的

○背景

機械学習の恩恵を強く受けている分野の一つは、翻訳です。つい数年前まで機械翻訳と言えば、まったく頓珍漢な誤訳ばかりを出力するというのが常識でした。それが今では、ほぼ9割がた読解可能な翻訳結果を出せるようになっています(私は同僚との英語メール、レポートの作成を行うとき、原案を機械翻訳に任せ、微修正のみ自分で行っています。その方が圧倒的に早く済むからです)。

・しかし、だからと言って闇雲に機械翻訳を使えばよい、というものでもありません。如何に進歩したといっても、機械翻訳が苦手なパターンというのはあります。

 

○目的

機械翻訳を「誰もが」うまく使う方法を紹介します。

 

2.総括

機械翻訳は、一度実施した英文を「逆変換」してチェックせよ

・日本語のこそあど言葉、オノマトペは「親切に」使うこと

・日本語の主語と述語ははっきりさせること

・日本語の時制はきちんとそろえること

 

3.各論

 ○題材

・ここでは、以下の文を英訳することを考えます。当然ながら、日本人の我々にとっては何の変哲もない文章です。

北海道産動物舎で過ごしているコノハズクが巣立ちをしました。

2018年8月16日にふ化した個体で、8月30日に1羽が巣立ちしました。

 2016年に繁殖した個体は、8月5日に巣立ちしていますので、ほぼ一ヶ月近く遅い巣立ちでした。

 ホワホワとした羽が特徴ですので、ぜひ探してみてください。

 ※旭山動物園ブログ 「旭山にゅーす・ぶろぐ」2018.9.2より

 ○和訳手順

①そのままGoogle翻訳に突っ込む

・とりあえずコピペ、翻訳した結果がこちらです。英語が得意でない人の場合、このままだと果たしてあっているのかどうかがよくわかりません。

Konohazuku spent in Hokkaido animal husband nested.

An individual hatched on August 16, 2018, 1 bird was nested on August 30.

Individuals breeding in 2016 were nested on August 5, so it was a late nest nearly a month.

Feather feathers are characteristic, so please try looking.

Google翻訳より 

 ②逆翻訳する

・さて、次が重要です。出力された英文を、再度日本語に逆翻訳してみましょう。

・赤字で表記した部分が特に変な部分で、翻訳にミスがあることが分かります。

 北海道の動物夫が入れ子にしたコノハズク。

2018年8月16日に孵化した個体は、1羽の鳥が8月30日に入れ子になった。

2016年に飼育された個体は8月5日にネストされたので、1ヵ月近くの遅い巣だった

羽の羽が特徴的ですので、見てみてください。

Google翻訳より

 ③誤訳部分の抽出、修正

・上の誤訳部分を見ると、翻訳できていないのは以下の3点です。

 -巣立ち、巣立つ

 -ほわほわ

 -主語と述語の消失、取り違え

・では、巣立ちという言葉だけを翻訳してみると…なるほど、nestだけでは巣立ちという意味にならないのですね。

巣立ち、巣立つ:Leaving (Leave) the nest

 ※Google翻訳より

 ・それから、ほわほわという単語。これは日本語ならではの問題ですが、ここに挙げたように感覚を音で表す言葉をオノマトペといいます。日本語はオノマトペがやたらと多いので、対応する英語がそもそも存在しないことがあります。ではどうするか? もっと一般的なオノマトペに変えればよいのです。

 ほわほわ→ふわふわ:fluffy

Google翻訳より

・そして3点目。日本語は主語や述語がしばしば省略され、また時制がかなりあやふやになります。前後の文脈を知っている人間であれば、無意識にこれらの情報を補足し理解することが出来ます。しかし、機械翻訳にそれをやらせるのはかなり無茶でしょう。ということで、原文の日本語にかけている主語と述語を補い、また時制を統一してやります。

 北海道産動物舎に住んでいた(過去形に変更)コノハズクが巣立ちをしました。

このコノハズクは(主語の補足)2018年8月16日にふ化した個体で、このうち(主語の補足)8月30日に1羽が巣立ちしました。

 2016年に繁殖した個体は、8月5日に巣立ちしました(過去形に変更)ので、今回はほぼ一ヶ月遅くなりました。

 ふわふわとした(オノマトペを簡単なものに変更)羽が特徴ですので、ぜひ探してみてください。

 

④修正+再チェック

・以上を修正し翻訳、再度逆翻訳した結果を示します。

Konohazuku who lived in the animal house of Hokkaido left the nest(この熟語は手動で入力).

This Konohazuku was an individual hatched on August 16, 2018, of which 1 bird left the nest on August 30.

Individuals breeding in 2016 left the nest on August 5, so this time it was almost a month later.

It is characterized by fluffy feathers, please try looking.

Google翻訳、日本語→英語

 

北海道の動物園に住んでいたコノハズクが巣を離れました。

このコノハズクは2018年8月16日に孵化した個体で、8月30日に1羽の鳥が巣を離れました。

2016年に繁殖した個体は8月5日に巣を去ったので、今回はほぼ1ヶ月後でした。

ふわふわの羽毛が特徴的ですので、見てみてください。

Google翻訳、英語→日本語

 ・いかがでしょう? 先ほどの文章に比べ、かなり可読性が増したと思います。個人的な感度としては、最終版の英文であれば「まあわかるな」という程度の文章にはなっています。勿論、同じパラグラフにleft the nestが3回も入ってるのはあまりかっこよくはないですが、そこまで求めるのは酷というものです(こうした所に気を使って英文をかける人は意外と少ない。英語を喋れる人であっても。)。

 

4.終わりに

Google翻訳うまく使うコツは実の所「日本語の書きかた」にかかっていると言っても過言ではありません。実際、ここで述べた修正手順のうち、英語の知識を使ったのは1か所のみです(leaveの過去形はleft)。つまり、学力や英語力によらずだれでも出来る技術なのです

・余談ですが、こうした日本語の書き方が出来るようになると、報告書の質が劇的に向上する、という副産物が生まれます。

機械翻訳をうまく使いこなすと、コミュニケーションの幅がぐっと広がります。是非挑戦してみてください。

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.技術分野
機械学習+語学