Aidemy 2020/12/3
#はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、ランキング学習の3つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・pyltrについて
・LambdaMARTについて
#pyltr
##pyltrとは
・__pyltr__はChapter2で出てきたランキング学習のデータセットLETOR専用の分析パッケージである。
・pyltrは__呼び出すだけ__でChapter2で行なったようなデータの前処理が行える。また、評価指標や学習モデルも使える。
##データの格納
・LETORデータセットは列ごとに__「正解ラベル(0,1,2)」「クエリID」「46次元の特徴ベクトル」が格納されているが、pyltrを使うことで、データを分割するときにこれらの列番号を参照する必要がなくなる。
・分割の方法は「pyltr.data.letor.read_dataset(ファイル名)」__で行える。具体的なコードは以下の通り。
##LambdaMART
・pyltrには、LambdaMART__という__モデル__が用意されている。このモデルは「LambdaRank」「MART」という2つのモデルからなり、高い精度を誇るものである。このうちLambdaRankは__RankNet__という概念の拡張である。
・ここでは理論的な部分を説明する。RankNetでは、文書$d_i,d_j$とそのスコア$s_i,s_j$について、確率$P{ij}$を$$P{ij}=P[d_i \succ d_j]=\frac{1}{1+e^{-\sigma(s_i-s_j)}}$$を満たすように定める。これを使って、コスト関数$C$を$$C = - \bar{P_{ij}} \log P_{ij} - (1 - \bar{P_{ij}}) \log (1 - P_{ij})$$として定め、これを$s$について最小となるようにするのが目的である。LambdaRankはこのコスト関数の式が$$C_{ij}=\log(1 + \exp( - (s_i - s_j) ) ) |\Delta Z|$$であるという点のみ異なる。
・__MART__は__勾配ブースティング決定木__と呼ばれるものである。通常の決定木と違う点は、複数の学習機を組み合わせた__アンサンブル学習__であり、かつ以前に学習機が間違えたデータに対して大きな重み付けを行う__ブースティング__がある点である。式としては、目的関数$O(\theta)$について、誤差に関する項$L(\theta)$とモデルの複雑さに関する項$\Omega(\theta)$の和で表される。これにより、__正確でないモデル__と__複雑すぎて汎化されないモデル__にペナルティを与えることができる。
・具体的な使い方については、次項で確認する。
##ハイパーパラメータのチューニング・ランキングの生成
・pyltrでは、validationデータ__を使ってLambdaMARTのハイパーパラメータをチューニングできる。
・まずはvalidationに必要なデータや評価指標を設定する。方法は、「pyltr.models.monitors.ValidationMonitor()」で行う。引数にはXとyのvalidation(vali_X,vali_y)を指定し、評価指標については「metrics」で指定する。今回は「pyltr.metrics.NDCG(k=10)」を使う。また「stop_after」__で、何回連続で最良解が得られれば処理を打ち切るかを指定する。
・ここまで終わったら、__「pyltr.models.LambdaMART()」でモデルを作成し、「model.fit()」__で学習させることができる。
##評価指標の選択
・前項では__NDCG__を使用したが、それ以外の評価指標も使える。
例としては、DCG__(pyltr.metrics.DCG)、ExpertedRR(pyltr.metrics.ERR)、AP(pyltr.metrics.AP)、AUC-ROC(pyltr.metrics.AUCROC)__がある。まとめると次のようになる。
#まとめ
・__pyltr__はデータセットLETOR専用の分析パッケージである。これを使うことで、簡単にLETORの前処理やモデルを呼びだすことができる。
・pyltrには、LambdaMART__というモデルが用意されている。「pyltr.models.monitors.ValidationMonitor()」で、このモデルのハイパーパラメータを設定し、「pyltr.models.LambdaMART()」__でモデルを呼び出すことができる。
今回は以上です。最後まで読んでいただき、ありがとうございました。