Rでパレート優越ソート
{rPref}パッケージの使い方についてのメモ。
必要に追われて調べたときに日本語資料がほぼみつからなかったので、自分の備忘ついでに書く
はじめに:パレート優越性と多目的最適化問題
「パレート最適(性)」は厚生経済学などで用いられる概念として有名である。
経済学自体を専門的に学んだひとでなくても、書籍や記事などを通じて知っている人は多い概念だといえよう
一応パレート最適という概念について述べておく。
有限個の資源配分の選択肢が与えられているとする。どの選択肢をえらぶかによって、社会を構成する各主体の効用が変化(増減)するとする。
ある選択肢を別の選択肢にきりかえることで、ある主体の効用を低下させることなく、他の主体の効用を改善することができるとき、そのような改善の仕方を「パレート改善」と呼ぶ。
これ以上パレート改善できることができないような資源配分が達成されているとき、その選択肢は「パレート最適」であると呼ぶ(素人による簡単な解説おわり)。
さて、このパレート最適性の概念は多目的最適化問題にも応用することができる。
仮想ケースとして、最大化したい指標がK( K≧2)個あるとしよう。
つまり指標がとあり、ある最適化モデルiの評価がという形で表せるとする。
このとき、他のモデルjを選べば、他のすべての指標の値を低下させることなく、ひとつ以上の指標の値を改善することができるとする。
このようなケースをモデルiはモデルjに優越されている(Model i is dominated by model j)と表現する。
さて、多次元最適化の実際の話をすると、複数の最適化対象指標があるときに、
すべての指標において他の解より優れているような解(ユートピア解というらしい)がある場合というのは稀である。
なので、実用的には"パレート最適となるような解集合"を特定するというのが最適化問題におつける目標となる。
解どうしのパレート優越性を先述のような形で評価できるので、パレート優劣な解をもたない解の集合がパレート最適集合となる。
また単に最適集合を求めるだけでなく、パレート優劣性による序列評価のさらなる転用として「ランク」付けができる。
集合に属する解の各々に対して、「この解にパレート優越する解はいくつあるか」を評価することができる。
各解に対して、「該当の解にパレート優越する解の個数+1」をランクとすると、すべての解にランクがつき、ランクによる分類&ソートが可能となる。
(いうまでもなく、最適集合はランク=1の集合。「完全上位互換」がいない奴らの集合体)
最適集合だけでなく準最適集合、準々最適集合のようなものも最適化問題のアウトプットとしてほしいときはランク=2,3の解を拾ってこればよい。
解のパレート最適集合をつないでできる曲線のことを、経済学で頻出するfrontierの概念になぞらえてパレート最適フロントとよぶ。
さて、前置きが長くなったが、{rPref}パッケージはこのようなパレート優越性の評価・ソート・分類を行ってくれるパッケージである。
本記事では一通りの使い方を記していく。
<参考URL>
- rPrefパッケージのCRAN
- rPrefパッケージのvignette
- rPrefパッケージの可視化についての公式Doc
- Satoshi, Kato氏がrPrefについて触れている資料*1
基本的な使い方
rPrefは、大まかにいって
- 条件式指定
- psel()関数によるパレート優越性の評価・分類・ソートの実行。
- (必要なら 可視化 or データ確認)
といった流れでつかう。
せっかくなので, 2021年シーズンに通算900分以上出場して20本以上シュートを打ったJリーグの選手のなかで
- 決定率
- 90分あたりシュート数
- 枠内率
のみっつの指標でパレート優越ソートすることを試みる。
##条件指定 fw_cond1 <- high( Goal_Rate ) * high(Shots_p90) * high(Target_Rate) ##ソート・分類実行 fw_pref1 <- psel(fw_smr , fw_cond1, show_level =T, top = nrow( fw_smr))
この3指標でパレート最適ソートをしたところ最適集合に含まれるランク=1の選手は12人であった。
この12人は「完全上位互換」がいないという意味で第一グループに含まれる
この結果をみてもわかるように、パレート優越ソートによる抽出結果としての最適集合は、利用した指標のうち一つに最上位レベルのものがあった場合、別の指標の数値がよくなくても選ばれてしまうという点は実用上の欠点として理解したほうがよい。
たとえば前年ベストイレブンであるにも関わらず低空飛行を続けた鹿島のエヴェラウドは、90分あたりのシュート数がリーグトップレベルのためここに含まれているものの、枠内シュート率や決定率はおそろしく低く、少なくとも今年に関して彼を「優秀なFW」と判断するのはあまり適切ではないように思える。
しかし「完全上位互換」が何人いるかで序列化するパレート優越ソートでは、シュート数で彼を上回る人間がいないだけでエヴェラウドはトップグループに含まれてしまう。
(あと、シュート数は少ないけど決定力と枠内率はそこらへんのFWを凌駕する菊池流帆が「やぁ」って顔をのぞかせている)
L. ダミアンや前田大然、D.オリベイラや古橋、上田といった選手はカバーできているものの、このような「ノイズ」も入ってくる。
このような性質を考えれば、あくまでもパレート優越ソートは「足切り」のための手法として理解したほうがいいだろう。
カスタマイズ
条件指定関数
対象の変数をどういう形で最適化するかを指定
- rPref::high(A)→ Aが高ければ高いほど高評価
- rPref::low(A)→ Aが低ければ低いほど低評価
- rPref::true(A) →条件A=TRUEであるものをFALSEよりも高評価
複数条件指定系
- "A * B"は、AとBが最適化対象の対等な次元として組あわせられることを示す(基本はコレつかう)
- "A & B"は, まずAで評価したのちにBで評価する、という形で対象指標間に序列を導入する。
抽出方法指定系
- top: 上位n件を抽出
- top_level : 上位nグループを抽出
- at_least:最低でもn件を抽出(n件目と同じ序列のものまですべて抽出)
- and_connected(=TRUE or FALSE):top/top_level/at_leastが複数指定されたときのみ意味をもつ。たとえばpsel(.., and_connected=T,top_level=3 , top=10)なら「上位10件かつ上位3グループに含まれるもの」を抽出。FALSEならOR条件。
範囲指定系
その他
- {dplyr}のgroup_by()に対応していてグループ化してからソート・抽出することが可能
たとえば、各クラブの空中戦勝率&地上戦勝率の地空デュエル勝率にもとづいたDFの最適集合を抽出するときは、以下のようなコードとなる
#条件指定 duel_cond <- rPref::true( Position == "D") & high(aDuels_Rate) * high(gDuels_Rate) #クラブを単位としてグループ化したデータにパレート優越ソートを実行し、最上位グループだけ抽出 duel_pref_grp <- psel( group_by( duel_info ,Club), pref = duel_cond, top_level = 1) %>% as.data.frame() #表示 duel_pref_grp %>>% select(Club , PlayerName, aDuels_Rate , gDuels_Rate , .level )
この結果から最後10件だけ抽出すると、以下のようになる
最上位グループが1人しかいないクラブ(上図でいうと東京、横浜、ベガルタ)は空中戦最強と地上戦最強が同じ選手であり、上述のユートピア解が存在している。
FC東京における渡辺剛はユートピア解だ。
空中戦最強と地上戦最強が別のDFであるクラブの場合は、最適集合は2人以上になる。
機械学習パッケージの多次元最適化部分で見つけたので色々調べてみたけど、まぁなんというか、便利ではあるけど意思決定のひとつ前の段階での補助的な手法という印象をもった。
Enjoy!!
*1:見つかった日本語情報はこれくらい, この方がslideshareにあげられている資料をみたけど,かなり勉強になるものばかりだ。