Pls
- 1. PLSとは
因⼦ X を説明変数として直接回帰に⽤いず、
潜在変数 t を説明変数として従属変数 y への回帰を⾏う⽅法である
潜在変数 t とは . . .
多変量のX⾏列から情報を集約し少数の変数に置き換えたもの
→つまり、潜在変数 t は X の線形結合のこと
PLS 1
𝑡 = 𝑥$ 𝑤$ + 𝑥' 𝑤' + ・・・ = 𝐗𝐰
- 2. 2
PLS 2
PLSの基本式は以下の2式である
𝐗 = * 𝐭, 𝐩, + 𝐄 = 𝐓𝐏1
+ 𝐄
2
,3$
𝐲 = * 𝐭, 𝐪, + 𝐟 = 𝐓𝐪 + 𝐟
2
,3$
ローディング
係数
残差
よってPLSでは、
yとtの相関を⼤きくすることと同時に、tの分散を⼤きくし、Xに含まれる情報を
なるべく多量に⽤いることを⽬的とする
yとtの共分散を最⼤にするようなwを求める
- 3. 3
PLS 3
Lagrangeの未定乗数法より
G = 𝐲8
𝐭 − µ 𝐰
'
− 1 = 𝐲𝐖𝐱 − µ 𝐰
'
− 1 制約条件: 𝐰 = 1
= * * 𝑦? 𝑥?@ 𝑤@ − 𝜇(* 𝑤@
'
C
@3$
− 1)
C
@3$
E
?3$
Gを𝑤@ について偏微分すると
𝜕𝐺
𝜕𝑤@
= * 𝑦? 𝑥?@ − 2𝜇𝑤@ = 0
E
?3$
* 𝑦? 𝑥?@ = 2𝜇𝑤@
E
?3$
- 4. 4
* 𝑦? 𝑥?@ = 2𝜇𝑤@
E
?3$
PLS 4
両辺に𝑤@ をかけてkについて総和をとる
* * 𝑦? 𝑥?@ 𝑤@
C
@3$
= 2𝜇 * 𝑤@
'
= 2𝜇
C
@3$
E
?3$
制約条件= 𝐲8
𝐭
よって
𝑤@ =
∑ 𝑦? 𝑥?@
E
?3$
2𝜇
ベクトルwのノルムは1なので、 𝐰 =
𝐗1
𝐲
| 𝐗1 𝐲 |
(wが求まるとtも求まる)
- 6. 残差 E の⼆乗和(G1)が最⼩という条件で p を求める⼿法
最⼩値を取る → 極⼩値を取る
G を p1, p2 で偏微分して0
まとめると・・・
𝐺1 = * 𝐸?
'
= *(𝑋(?)
− 𝑝$ 𝑡$
(?)
− 𝑝' 𝑡'
(?)
)'
E
?3$
OP$
OQR
= −2 ∑ 𝑡$
(?)
(E
?3$ 𝑋? − 𝑝$ 𝑡$
(?)
− 𝑝' 𝑡'
(?)
)=0
OP$
OQS
= −2 ∑ 𝑡'
(?)
(E
?3$ 𝑋? − 𝑝$ 𝑡$
(?)
− 𝑝' 𝑡'
(?)
)=0
PLS 6
- 7. PLS 7
𝑡$
$
𝑡$
'
… 𝑡$
E
𝑡'
$
𝑡'
'
… 𝑡'
E
𝑡$
$
𝑡'
$
𝑡$
'
⋮
𝑡$
E
𝑡'
'
⋮
𝑡'
E
𝑝$
𝑝'
=
𝑡$
$
𝑡$
'
… 𝑡$
E
𝑡'
$
𝑡'
'
… 𝑡'
E
(
𝑋($)
𝑋(')
⋮
𝑋(E)
)
両辺に左から tTt の逆⾏列 (tTt)-1 を掛ける
𝐭1
𝐭𝐩 = 𝐗1
𝐭
𝐩 =
𝐗1
𝐭
𝐭1 𝐭
- 8. 8
q は y の残差 f の要素の⼆乗和が最⼩になるように求める
PLS 8
𝐪 =
𝐲1
𝐭
𝐭1 𝐭
- 9. • X2 : X の中で1成分のPLSモデルでは説明できない部分
• y2 : y の中で1成分のPLSモデルでは説明できない部分
2
T
22
T
11 EptptX ++= 22211 ftty ++= qq
T
112 ptXX −= 112 qtyy −=
ただし、w2 の⼤きさ(ノルム)は1
t2 は X2 の線形結合
222 wXt =
PLS 9
第2成分
- 10. 10
y2 と t2 の共分散 y2
Tt2 を最⼤化するよう t2 を計算する
y2 との関連性が⼤きい t2 を抽出したい
1成分の時と同様にして、
2
T
2
2
T
2
2
yX
yX
w = 22 Xwt =
2
T
2
2
T
2
2
tt
tX
p =
2
T
2
2
T
2
2
tt
ty
=q
PLS 10
- 11. pls = PLSRegression( n_components=x )
from sklearn.cross_decomposition import PLSRegression
関数はこれを使う
成分数
実⾏しよう
pls.fit( X, Y )
説明変数 ⽬的変数
回帰係数が得られる
pls. coef_
計算値も得られる
pls.predict( X )
pls.fit で得られた
回帰係数を⽤いて
⼊⼒変数から
計算値を算出してくれる
決定係数𝑅'
も得られる
pls.score( X, Y )
PLS 11
- 12. クロスバリデーションから予測値を求める
from sklearn.model_selection import cross_val_predict
predicted = cross_val_predict( pls , X , Y, cv=2 )
分析⽅法を⼊⼒ 説明変数 ⽬的変数
クロスバリデーションの
⽅法を選択
defaultはk-fold
𝑅𝑐𝑣'
を求める
from sklearn.metrics import r2_score
rcv2 = r2_score(t_test, predicted)
オートスケーリング
していない
元データの⽬的変数
なぜか?
推測値
オートスケーリングした状態だと
元データで求められる値よりも
⼩さくなってしまうため
PLS 12
- 13. オートスケーリングの式
Autoscale_Data = { data ー 平均値 } / 標準偏差
推測値をオートスケール前のデータと⽐較したい
predicted = { 欲しいdata ー 元のtrainデータの平均値 } / 元のtrainデータの標準偏差
欲しいdata = { predicted×元のtrainデータの標準偏差} + 元のtrainデータの平均値
欲しいdata = { predicted × y_train.std() } + y_train.mean()
PLS 13
つまり