ProbSpace 論文の被引用数予測コンペ反省メモ
ProbSpaceにて開催された、論文被引用数コンペティションに参加しました。いま公開されている上位陣の回答を読んで、我が身を振り返りながら、反省点、なるほどポイントを書き連ねていきます。
概要と目的変数の設定
今回のコンペは、Arxivに投稿されている論文の各種情報から、その論文の被引用数を予測するというものでした。特筆すべきポイントは、以下の2点。
(a) 与えられた訓練データのうち、ラベル(正解の引用数)が付与されたデータは全体の1/10程度。ラベルなしデータを有効に使えるか?
(b) doi_citesという低精度の被引用数情報が訓練データには与えられている。
(a)については、半教師あり学習を要請するような印象で、私はこれを機に学ぶか!と半教師あり学習のレビューを読みはじめました。最初の20ページ読んだ印象では、半教師あり学習で回帰問題は難しそうです。
特にラベルを仮に付与するwrapper methodsでは、その成立条件に「同じクラスターに属するデータに同じラベルがつけられる」ということがあり、連続値をとるラベルのクラスターとは?となります。実際のところ上位陣でもうまくいっている方はいないようでした。今回では、クラスター分けは特徴量作成(半教師あり学習でのpre-training methods?)には有効かもしれませんが、連続的な仮ラベルを付与するほどではないかもしれません。
私はCOREGというco-training手法を試して、ラベル付きデータを2万点ほど増やしてみましたが、スコアは悪化しました。(下の目的変数の変更を行っていれば、まだよかったかも)
(b) doi_citesについては、これをそのまま提出してもそこそこ良いスコアが出るほどラベルとの相関が高いパラメーターでした。(doi_citesだけで0.73くらい、今回の一位の方のスコアが0.49くらい)しかしながら一部のデータにおいてはdoi_citesとラベルの値との乖離が大きい場合があり、doi_citesという特徴量に頼りきりで予測すると、ここの誤差が効いてきてしまうようでした。(私は気づきもしなかった)
そこで、一位の方のコメントにもある通り今回の高スコアへの鍵ともなった手法が、ラベルとdoi_citesの差を目的変数として設定することでした。これにより、doi_citesの予測誤差を学習させることに切り替わり、(目的変数の分布もガウスっぽくなってよくなったこともあるのか?)高スコアに繋がったようです。ちなみにこれを知って自分でもやってみましたが、確かにCVスコアが向上しました。
特徴量生成
与えられているパラメーターには、論文のタイトルとアブストが含まれていました。この文章のベクトル化やクラスター分けを行い、特徴量に変換して学習に用いることは、私も(どこかしらからパクリつまみ食いし)やっていました。テキスト系の特徴量生成については、たぶんそこまで劣っていないと思います。
上位の方が、パラメーターcommentsからページ数、fig数を抽出して特徴量を作成し、これが良い特徴量だったと述べられています。私はページ数とか効きそうだな〜と思ったものの、commentsの大多数が空欄であることをどう対処したら良いかわからず、nan値をゼロや平均値で埋めてしまい、なにこれゴミやんけ、と捨ててしまいました。で、これ改めて調べてみると、lightgbmやXGBoostではnan値は一旦無視して学習してくれるらしく、nanはnanのままにしておけばよかったのでした。
また機械学習モデルに常識を期待して「これくらいわかってくれるだろう」という期待というか思い込みはせず、(少なくとも今回のような場合は)特徴量はいっぱい思いつくだけ作ってあげて甘やかせるべきということも学んだような気がします。
最後に、当たり前ですが、今回一切スタッキングなどやっておらず、竹槍一本で突貫し敗れたので、次はもっと竹槍を用意して突貫しようと思います。