GBrankの実装GBrankを実装するにあたって、次の2つを実装する必要があります。回帰木GBrankにおける勾配ブースティングの学習まずは回帰木を実装しましょう。回帰木ですが、最初1つの根ノードから始めて、最小二乗誤差が小さくなるように分割を繰り返していけば実装できます。Learning(カステラ本)が参考になると思います。今回は、過学習を防ぐために葉に割り当てられる最小データ数を設定するようにしました。以下Pythonによる実装です。※注意:以下のコードはオラオラっと書いたまま最適化していないので、効率の悪い実装だと思います。scikit-learnの実装とかを参考にするべきだと思います。上で紹介したGBrankのアルゴリズムに従って、GBrankを実装していきます。len(self.trees))学習の際にqid(各データが紐づくID)を指定するようにしました。詳しくはSVM-rankの入力となるsvmlight形式などを参考にしてください。sampling_rateを設定できるようにしました。ノリで0.5としました、どれくらいの値がいいのかよくわかってないです。回帰木およびGBrankの実装の確認をします。回帰木の実装の確認scikit-learnにある回帰問題生成関数のmake_regressionを使って訓練データを生成し、上で実装した回帰木で学習した後、訓練データをそのまま入力として出力を確認します。graphvizを使って木自体の構造も出力しました。5と変えて学習してみました。正しく学習できているかを確認します。以下の図のx軸は入力変数(今回は1次元の入力です)、y軸は出力変数を表します。葉に割り当てられる最小データ数を1とすると過学習(学習データに絶対合わせる)しており、最小データ数を5とすると全然当てはまってないことが分かります。葉に割り当てられる最小データ数が1の時の木構造を見てみます。絶対に訓練データに合わせてやろうという気概が見えます。葉に割り当てられる最小データ数が5の時の木構造も見てみます。やる気が見られないですね。本題のGBrankの実装を確認します。Rankingで使われている簡単なデータセットを用います。3D1列目は各データの関連度(4が一番強くて1が一番弱い)を、2列目のqidは各データの紐づくグループのIDを、3列目以降は特徴ベクトルを表します。各データの順序関係は以下の通りです。3A>3D異なるqid間では比較不可能なことに注意です。それでは、上で実装したGBrankを動かしてみます。qid_lst)実行すると、以下の結果が得られます。3DGBrankの出力自体は実数値なので、例えば2Aと2Cのように関連度が同じ入力だとしても予測では順序関係を与えてしまいます。そのため、正しい順序関係が予測された順序関係に内包されていれば、正しく予測ができていると言えます。勾配ブースティング木を用いたランク学習手法として、今回挙げたGBrank以外にもLambdaMARTがあります。そのうち実装したいですね。ぶっちゃけGBrankの実装よりも回帰木の実装の方がめんどい。6はてなブログをはじめよう!sz_drさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。