この演習課題ページでは,Ranking SVMの実装であるSVM-rankの使い方を説明します.この演習ページの目的は,SVM-rankを用いてモデルの学習,テストデータに対するランク付けが可能になることです.
この演習ページでは以下のツールを使用します.
ダウンロードしたらファイルを解凍し,コンパイルしてください. 以下はその一例です.
$ mkdir svm_rank # 解凍するファイルを入れるフォルダを作成
$ mv svm_rank.tar.gz svm_rank #ダウンロードしたアーカイブを今作成したフォルダに移動
$ cd svm_rank
$ tar xzvf svm_rank.tar.gz #ファイルを解凍
$ make
正しくコンパイルができていれば, svm_rank_learn と svm_rank_classify という2つのファイルが生成されているはずです.
作成したsvm_rank_learn と svm_rank_classifyを適当な場所にコピーします.この演習ページでは, h29iro/bin/にコピーした前提でコードを進めます.
h29iro/data/svmrank_sample/ にサンプルファイルを置いています.これは,SVM-rankのページで配布されている以下のファイルをコピーしたものです.
このサンプルファイルには,training.dat(訓練データ)と test.dat(テストデータ)が含まれています.
訓練データ(../data/svmrank_sample/train.dat)の中身はこのようになっています
3 qid:1 1:1 2:1 3:0 4:0.2 5:0 # 1A
2 qid:1 1:0 2:0 3:1 4:0.1 5:1 # 1B
1 qid:1 1:0 2:1 3:0 4:0.4 5:0 # 1C
1 qid:1 1:0 2:0 3:1 4:0.3 5:0 # 1D
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2A
2 qid:2 1:1 2:0 3:1 4:0.4 5:0 # 2B
1 qid:2 1:0 2:0 3:1 4:0.1 5:0 # 2C
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2D
2 qid:3 1:0 2:0 3:1 4:0.1 5:1 # 3A
3 qid:3 1:1 2:1 3:0 4:0.3 5:0 # 3B
4 qid:3 1:1 2:0 3:0 4:0.4 5:1 # 3C
1 qid:3 1:0 2:1 3:1 4:0.5 5:0 # 3D
詳しいフォーマットの中身は,SVM-rankのページを参照してください. 各行1列目の数値が,その文書のクエリqidに対する重要性を表しており,SVM-rankはこの値を元にpairwise preference集合を生成し,学習データとします. たとえば,上記訓練データは,下記のpairwise preference集合を訓練データとして与えていることになります.
1A>1B, 1A>1C, 1A>1D, 1B>1C, 1B>1D, 2B>2A, 2B>2C, 2B>2D, 3C>3A, 3C>3B, 3C>3D, 3B>3A, 3B>3D, 3A>3D
(SVM-rankのページより引用)
また, 3列目以降の x:y という文字列は特徴量を表しており,x次元目の値がyであることを示しています.
たとえば,1行目のデータは,クエリ$q_1$に対して, $f_1 = 1.0, f_2=1.0, f_3=0.0, f_4=0.2, f_5=0.0$という特徴ベクトルを持った文書1Aの重要性が3であることを示しています.
In [1]:
! ../bin/svm_rank_learn -c 0.03 ../data/svmrank_sample/train.dat ../data/svmrank_sample/model
正しく学習できていれば, ../data/svmrank_sample/model というファイルが生成されているはずです.
In [2]:
!cat ../data/svmrank_sample/model
先ほど学習したモデルを使って,実際にテストデータに対してランキングを行うには,svm_rank_classifyを利用します.
In [3]:
!cat ../data/svmrank_sample/test.dat
なお,テストデータ中の1列目の値は,正解順位(正確には重要度)です. テストデータに対する精度(テストデータ中のペアの順序関係をどれだけ正しく再現できたか)を計算する際に利用されます.
In [4]:
! ../bin/svm_rank_classify ../data/svmrank_sample/test.dat ../data/svmrank_sample/model ../data/svmrank_sample/prediction
テストデータに対する実際のランキングはpredictionファイルを確認します.
In [5]:
!cat ../data/svmrank_sample/prediction
実際にテストデータに対してランキングを作成する場合は,この値の降順にランク付けします. (この例だと,[$d_1, d_2, d_3, d_4$]がSVM-rankが出力したランキング)
サンプルファイルとは別のテストデータを用意し,サンプルファイルの訓練データで学習したモデルをそのテストデータに適用してみよ. また,訓練データを観察し,どのような特徴量をもった文書が上位にランク付けされそうか自分で推測し,テストデータに対するランキング結果がその自分の推測と近いかどうか考察せよ.
演習課題1で扱った文書コレクションおよびクエリに対して,適宜特徴量を自分で考え,訓練データ・学習データを用意せよ. そして,SVM-rankを適用し,テストデータに対するランキング結果を分析することでどのような特徴量が重要と判定されたか考察せよ.
講義で扱ったMMR,もしくはIA-SELECTを実装せよ.そして,演習課題1で扱ったコーパス・クエリに対してアルゴリズムを適用することで,多様化しない場合のランキングと多様化したランキングがどのように異なっているか考察せよ.
いずれかの方法で,ipython notebookのページ(.ipynbファイル)とそのhtml版を提出すること.
受け付けます
.