日々の勉強の備忘録としてつらつら書いています

kfsky_blog

Probspace「論文の被引用数予測」振り返り(31位)

こんにちは、kfskyです。
前回は、「Solafune」での夜間光データから土地価格を予測の振り返りをしました。今回はProbSpaceで開催されていた「論文の被引用数予測」コンペティションに参加した結果を振り返ろうと思います。

コンペ内容

コンペティションとしては、論文のジャーナル・カンファレンスなどのデータから引用数の予測精度を競うコンペティションでした。
データとしては、論文の著者や、論文のアブストラクトなど文章データが多いなど、自然言語処理を使った特徴量から目的変数を予測する必要がありました。
また、主催者からもあるように、目的変数が欠損しており、代わりに代替変数が付与されているデータでした。

今回のコンペでは、学習データの一部に目的変数(被引用数)が含まれておらず、代わりにDigital Object Identifier(DOI)により計算された低精度被引用数が代替変数として付与されています。
現実世界の問題においては必ずしも充分な量の教師データを用意できるとは限らず、そのような場合においては弱教師あり学習が1つの有効な手段となります。
本コンペを通して弱教師ありにおけるモデル開発に親しんでいただければ幸いです。

https://prob.space/competitions/citation_predictionより

解法

今回のソースはこちらのリンクにあります
【特徴量作成作成】

title, abstractBERTを用いて特徴量を作成。titleに関してはPCAで15次元まで使用。 abstractでは寄与率が90%を超えるまで使用 
journal-ref, doi外部データを用いて、出版先などを判定して、特徴量として学習
versions以下の特徴量を追加(トピック参照
 ・論文が投稿された時刻(unixtime)
 ・論文が最後に更新された時刻(unixtime)
 ・最後の更新と投稿された時刻の差分
 ・論文が何回更新されたか
categoriesword2vecで特徴量作成
CountEncoder"submitter", "categories", "publisher"で実装
LabelEncoder"submitter", "categories", "publisher"で実装
StringLength__'title', 'abstract','comments' の文字数をカウント

モデル

今回はLightGBM, CatBoostのBlendingで行いました(kfold=5)
今回は評価指標がRMSLE(root mean squared Logarithmic error)でした。LightGBMではパラメータ(object)にないので、自身で目的変数を変換しないといけません。
$$ RMSLE = \sqrt{\frac{1}{n}\sum_{i=0}^n (\log (t_i+1)-\log (y_i+1))^2}$$
なので、ラベル tに対して 1 を足して log を適用した t′=log(t+1) をラベルとして RMSEで学習させる必要があります。
今回は以下のコードのようにしました。(こちらのリンクが非常にわかりやすいです。)

# 目的変数を設定
target_data = "cites"
# 学習データから目的変数のSeriesをtrain_ysに格納
train_ys = train_df[target_data].values
# 1 を足してlog を適用
train_ys = np.log1p(train_ys)

結果

結果は、31位で今回は銅圏内には入ることができませんでした。。。(確認してみると、30位までに入れば銅メダルだったので、非常に悔いが残る結果でした。)
上位の方の解法を見ると、目的変数である「cite」を予測するのではなく、低精度被引用数である「doicites」との差(cites-doicites)を目的変数にし、予測後にdoicitesを加えるという手法を取られていました。理由としては、cites(本来の目的変数)で予測を行うと、doicitesとの相関から外れたものをうまく予測できないからとのことでした。

感想

メダル圏内には届かず残念な結果でしたが、自然言語処理のやり方などを学ぶことのできたコンペティションでした。
現在は他のコンペティションが開催されているので、そちらではメダル圏内に入れるように頑張ろうと思います。

最後に、運営の皆様や、参加者の皆様に心より御礼申し上げます。

kfsky現在のProbSpaceでの結果