にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

生きるため,ロジスティック回帰を思い出してみた

生きるため,ロジスティック回帰を思い出してみた

モチベーション

 ちょっと私生活や業務で「これってロジスティック回帰とか使えば割と簡単に解決できるんじゃね?」と思うことがあった.
 具体的には,
- (朝起きたときの)不快感は何をやったら解決できるのか
- 日々の集中不足的症状は何のサプリを飲んだら解決されるものなのか(個人差が大きいものなので,定量的に自分専用に解析したい)
- 営業が成功・失敗したときに何が原因なのか.
 などを日々の日記をつける感覚で解決できるものなのではないかと妄想した.

ロジスティック回帰とは

 私の認識が正しければ,という注釈がつくが,ある事象事象の組み合わせのときに,あることが起り易さ(尤度)を予測するものである.
 数式やプログラムは細かいので,別途論文をググる力と,数式を読む力があれば,何とかなるので,そちらを参考にしてほしい.
 Wikipediaは初心者お断りかのように,わけのわからん数式を連射するのであまりおすすめしない.
 私はこのSlideShareSlideShareがすごくわかりやすかった.
 ガチで数式を追い求めたい人は,専門書であるPRML読めとはいわないが,大学のパワーポイントの資料がネット上で公開されているので,読むとわかる(気がする).

ロジスティック回帰分析に例えば必要なデータ

 素性(feature)と呼ばれる,事象,要素と,その素性によって結果がどうなったかが知る必要がある.
 例えば私がやろうとしていることは,私事でとても恥ずかしいのであるが下記のようなものである.
- 知りたい結果:その日,発展可能な感じで一日過ごせたか(一日酔っ払っていたとかはなしにしたいため)
- 素性1:朝,濃い目のコーヒーを飲んだ
- 素性2:5人以上とコミュニケーションした
- 素性3:夜アルコールを飲んだ
- 素性4:昨日運動した
- 素性5:フォスファチジルセリンを飲んだ
- 素性6:チロシンを飲んだ
- 素性7:シンメトレルを飲んだ
- 素性8:小説を読んだ
- 素性9:旅行に行った
- 素性10:漫画を読んだ
- 素性11:英語を勉強をした
- 素性12:プログラムを何か書いた
- 素性13:論文を読んだ
- 素性14:ビジネス書を読んだ
- 素性15:夜更かしをした

今のところ思いつくのは以上のようなことである.素性は,まだまだ追加できる.(関係がありそうな素性を追加してはだめ.詳細は多重共線性より把握可能)

ロジスティック回帰分析でわかるよいところ

 ロジスティック回帰分析で学習すると,各素性に対して重みと呼ばれる数字がつく.
 この重みをwとするとexp(w)がオッズ比になり,どれくらい結果に影響したのか数値としてわかって,定量的にわかる点である.
 ※もっとも,オッズ比まで正確に出そうとすると,ものすごい量のデータが必要になるが...

データの作りかた

 結果が成功なら1,そうでないなら0とする.それをエクセルのシートのように記入する.

日付,結果,素性1,素性2,素性3 ...  
2014/09/01 1, 1, 0, 1...  
2014/09/02 0, 0, 0, 1...  
...
少なくとも1ヶ月以上のデータはほしい

分析方法

 最近はUbuntuなど,とてもわかりやすいLinuxがある.
liblinear-toolsという便利なソフトウェアがある.簡単に,分析してくれるソフトウェアだ.自力で実装してもよかったのだが,公式の論文に基づくソフトウェアのほうが正確だろう.
 短い期間であるがデータは取ってある.ちょっと書き換えてliblinearが読める形式にしなくてはならない.
データ(第三素性までしか当時は無かった)

1 1:0 2:0 3:0 
0 1:0 2:1 3:0 
0 1:0 2:0 3:0 
0 1:0 2:1 3:0 
1 1:0 2:0 3:0 
0 1:0 2:0 3:0 
0 1:0 2:1 3:0 
1 1:0 2:0 3:0 
1 1:1 2:0 3:1 
1 1:1 2:1 3:1 
0 1:1 2:0 3:0 
1 1:1 2:0 3:0 
1 1:1 2:1 3:1 
1 1:1 2:0 3:1

これをまず,学習する.test01.dataというファイルに名前をつけてデータを入れた.

gimpei@gimpei-virtual-machine:~/QoL$ liblinear-train -s 0 test01.data test01.model 
iter  1 act 1.592e+00 pre 1.547e+00 delta 1.177e+00 f 9.704e+00 |g| 2.872e+00 CG   2
iter  2 act 1.262e-02 pre 1.254e-02 delta 1.177e+00 f 8.113e+00 |g| 2.190e-01 CG   2

精度を評価してみる.

gimpei@gimpei-virtual-machine:~/QoL$ liblinear-predict test01.data test01.model test01.predict 
Accuracy = 71.4286% (10/14)

71%...よくない素性が混じっているか,データが少ないか,そもそも線形分離できるものではないかもしれない.でも,悪い値でもない.

学習された重みを見てみる.

gimpei@gimpei-virtual-machine:~/QoL$ less test01.model 
solver_type L2R_LR
nr_class 2
label 1 0
nr_feature 3
bias -1
w
0.6129864659221892 
-0.5519495890221945 
0.9073358130166518 

上から順に各素性の重みが0.61,-0.55, 0.91といっている.
オッズ比に直すと, 1.840431399, 0.57694981, 2.459603111である.
人と多く会うと,気分はよくないんだな~とか,前日に酒を飲んでいると翌日気分がよいんだな~とかわかったりする.ガチでコミュ症なので人とかかわらないほうが人生の目的が達成できそうだ.
オッズ比はここがわかりやすい.
こういった(サンプル数が少ないが)定量的な解析をすることで,ちょっと自分自身に生きる道しるべを示してくれるものでもあったりする.

パラメータ検定

 その重みがどれくらい信頼できるかは,こちらを参考にするとよいと思う.今回はデータ量が少ないってわかっているから無視しました.