5th Place Solution
はじめに
コンペを開催してくださった運営の皆様、共にコンペに参加し、コンペを盛り上げてくださった参加者の皆様に感謝を申し上げます。
個人的に初めて真面目に取り組んだコンペであり、非常に楽しみながら参加することができました。
使用したデータ
citesを含むデータのみで予測モデルを学習(pseudo-labeling無し)。
ただし後述のFaxtTextのモデル学習には約90万件ある全データの前処理済みtitle, abstractを用いた。
予測モデルの概要
CatBoostモデルをrandom_seed=0~4でrandom_seed_averaging、交差検証は通常のKFold(n=5, shuffle=True)
(途中までLight gbmを使用していたが、CatBoostに切り替えた途端スコアが向上した)
【CatboostのParameter】
params = {
'depth' : 8,
'learning_rate' : 0.03
'od_type': 'Iter',
'od_wait': 300,
'iterations' : 10000,
'loss_function' :'RMSE',
'use_best_model': True
}
テキストデータの前処理
・大文字を小文字化
・URLを削除
・改行(\n)を空白に変換
・LaTex("$"で囲まれた箇所)を削除
・[ ]で囲まれた箇所を削除
・nltkを利用しenglishのstopwordを削除
効いた特徴量
【数値データ】
・doi_cites
・authorの数
・commentsから抽出したpage数(参考: https://www.guruguru.science/competitions/16/discussions/556029f7-484d-40d4-ad6a-9d86337487e2/ )
・日付データのunixtime
・num_created
・titleとabstそれぞれのBERT特徴量、及びFastText特徴量(TruncatedSVDでtitleは5次元、abstは10次元に次元削減)(参考: https://prob.space/competitions/citation_prediction/discussions/columbia2131-Post0cf3bc9feaa1640eee20 )
- BERTはSciBERTから得た特徴量とSentenceBERTのallenai-specterから得た特徴量の平均値を取ったものを次元削減
- FastTextは全データ(約90万件)のtitleとabstractを統合をしたデータセットを用いてepoch=5, lr=0.01, dim=300で学習させたモデルから得た特徴量を使用して次元削減
・「authors, title, comments, abstract, doi, journal-ref, report-no」のそれぞれの文字数
【カテゴリカルデータ】
(カテゴリカルデータはほぼ全ての特徴量でone-hot-encoding, count-encoding, Catboost用にそのままの形で入力する、の3パターンを併用した)
・日付データのyear
・categoriesのcrosstab(参考: https://www.guruguru.science/competitions/16/discussions/4e8bbf3e-af2c-47bb-9620-51e3b00336b6/ )
・categoriesの1番目のカテゴリー、2番目のカテゴリー
・上記1, 2番目のカテゴリーから「.〇〇」を削除したもの
- arXivのページ(https://arxiv.org/ )を見るとastro-phのような大カテゴリーを選んでからastro-ph.GAなど小カテゴリーの論文を探す形になっているので、大カテゴリー自体の情報も重要だと考え追加した。
・doiを「/」で区切ったPrefix
・licence
使ったが効いていたか微妙な特徴量
【数値データ】
・commentsから抽出したfigure数
・jounal-refからのBERT特徴量(SVDで2次元に次元削減)
【カテゴリカルデータ】
・submitter
・commentsに「accepted」という単語を含むか判定
・FastTextでtitleの言語判定をし英語かそれ以外かを判定(参考: https://www.guruguru.science/competitions/16/discussions/f463dac2-4233-42d2-8629-ca99a9689987/ )
・idを「. または /」で区切ったPrefix(feature importanceはそれなりに高かったがリークしていただけかも)
・初期データのisnull
・authors_parsedから抽出したfirst_authorの所属情報(university/college, collaboration, project, その他, の4種類にそれらの文字列を含むかどうかで分別)
うまくいかなかったこと
・authorsの氏名を用いた特徴量作成(カーディナリティが高すぎた)
・pseudo-labeling(スコアが伸びなかったうえ、BERTの特徴量抽出も全件やるとかなり時間がかかるため深く検討する前にやめた)
・モデルのアンサンブル(途中まではCatboostとLightgbmのアンサンブルのスコアがよかったが、終盤ではCatboost単体の方が高スコアだった。またCatboostの木の深さを変えたモデルのアンサンブルもうまくいかなかった)
・Stratified Kfold(citesのビニングや、citesとdoi_citesの乖離具合を表したラベルを用いて実施したがイマイチだった)
・Spacyによるテキストデータのlemma化(時間がかかるうえあまりスコアに寄与しなかった)
まとめ
お気づきの方もいらっしゃるかもしれませんが、コード作成や特徴量の作成方法などほぼ全てにおいてatmacup#10を参考にしながらコンペを進めました。(https://www.guruguru.science/competitions/16/ )
特に今回はカテゴリカルデータの扱いが重要そうであったので、atmacup主催のgotoさんの講座(https://www.guruguru.science/competitions/16/discussions/95b7f8ec-a741-444f-933a-94c33b9e66be/ )や、columbia2131さんのatmacup#10でのディスカッション(https://www.guruguru.science/competitions/16/discussions/4e8bbf3e-af2c-47bb-9620-51e3b00336b6/ )を取り入れて特徴量を作成した後、Catboost(seed_averaging無し)を使うだけでLBで0.490を切るスコアを出すことができていました。
そこからさらにSciBERT(https://prob.space/competitions/citation_prediction/discussions/columbia2131-Post0cf3bc9feaa1640eee20 )やSentenceBERT、FastTextを用いた特徴量を追加し、seed_averagingをしたことで0.486台に乗ることができました。
また、実験管理はfkubotaさんの方法(https://zenn.dev/fkubota/articles/f7efe69fd2044d )を参考に、1実験1notebookで進めました(まだ真似しきれていない部分が多数ありますが)。これにより再現性を確保しながら実験を進められたと思います。
上記より、独自で工夫できた点というのはあまりありませんが、どなたかの参考になれば幸いです。
(また個人的に、テーブルコンペでのNNモデルの作り方、モデルのStakkingのやり方を学びたいので、どなたか情報をいただけましたら大変喜びます)
繰り返しになりますが、本コンペを開催していただきました運営の皆様に感謝いたします。