PRankを実装しました

ランキング学習の一手法であるPRankを実装しました.
PRankはPerceptronに似たアルゴリズムであり,実装も非常に簡単です.

解説

ランキング学習及びPRankの解説は,先日のDSIRNLPで発表された以下の記事が詳しいです.
DSIRNLP#1で「ランキング学習ことはじめ」を発表しました - シリコンの谷のゾンビ

PRankは,1文書の特徴量と対応するランク情報のみを用いてパラメータ更新を行うPointwise手法の一種です.
(2文書のペアを用いてパラメータ更新を行うのがPairwise,1つのクエリに対するランキング情報を全て用いてパラメータ更新を行うのがListwise手法)
PRankでは,重みベクトルとランキング順位数と同じ数のしきい値を用意し,重みベクトルと特徴ベクトルとの内積の値を初めて超えるしきい値の番号を予測値として出力します.
予測が間違っていた場合重みベクトルとしきい値の両方を更新し,よりよい予測を実現します.
Perceptronにしきい値という概念を導入し,順序関係を持つ多値分類アルゴリズムへと拡張したのがPRankという見方も可能です.

実験結果

以下のような簡単なテストデータを作成して,実験を行ないました.

4 1:1 2:4 3:6
4 1:2 2:3 3:5
3 1:3 2:4 3:4
3 1:6 2:1 3:5
2 1:5 2:4 3:3
2 1:4 2:3 3:3
1 1:8 2:2 3:1
1 1:7 2:5
0 1:10 2:2
0 1:12 2:3 3:1

データはlibsvm形式で記述しています.
(各行がひとつの文書を表し,一番左の数値が <特徴id>:<特徴値> <特徴id>:<特徴値>...という形式)
特徴id 1の特徴は,rankingが低いほど多く,id 3の特徴はrankingが高いほど多いデータになっています.

実験結果は,学習されたパラメータは以下の通り.

重みベクトル : -18 -6 29
しきい値 : -88 -27 29 78 inf

想定通りの挙動を示しています.
もう少し大きなデータセットで試してみたいですね.