0.48を目指すための意見交換

はじめに

数日前から参加し始めましたが,0.49からスコアが伸び悩んでいるので意見交換がしたいなと思い,トピックを作りました.

アイデアの交換などができたらと思っているので,いろいろコメントもらえたら嬉しいです!

本コンペの特徴?

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

自分自身はこの説明を読んだ当初,低精度被引用数(以降'doi_cites')を擬似的な目的変数として重みを調整しながら学習させるのかなと考えていました.

しかし,投稿されているトピックに目を通したところ'doi_cites'は説明変数に使用し,学習に使用するのは本来の目的変数である'cites'が存在するデータのみを用いていました.

実際,自分自身も説明変数に'doi_cites'を追加したところ,CV, LBともに大幅に改善されました.

相関

とりあえず'doi_cites'と'cites'の相関を計算すると0.944でした.

対数変換(log1p)したものを図示したものが以下の図で,相関があることが見て取れます.

343833e9-d96e-4078-ba26-3cad75107b87.png

気が付いた点

学習データに使用できる'cites'の最小値が1である.

しかし世の中には,一度も引用されない論文が大量にあるはずなので,故意的に引用数が0の論文は除外されている.

学習データに使用できるデータ,テストデータ,それ以外のデータ('cites'はないが,テストデータにないもの)の各々の'doi_cites'の分布は以下のようになりました.

ca68bb60-20f2-447f-ab82-f1fd988a1008.png

学習データとテストデータである青と緑の分布はほぼ一致していますが,それ以外のデータであるオレンジの分布は,'doi_cites'が小さいものの比率が非常に多くなっているようです.

このことから,'cites'のないデータには,真の'cites'の値が0のものが大量に含まれている可能性があるかもと考えています.

また,テストデータは,ある程度コンペが盛り上がるように意図的に学習データに似たような分布のデータが選択されている可能性があるのかなと思っています.

考察

学習データ,テストデータ,その他のデータの割合は,15117, 59084, 836407となっているため,大量にあるその他のデータをうまく活用したいところですが,目的変数と相関の強い'doi_cites'の分布が上に示したように異なっているので,擬似目的変数を新たに作成して学習データとして利用するにも,工夫が必要かなと思っています.

例えば,'doi_cites'の分布が同様な分布になるようにサンプリングして利用するなど.

関連する文献

少し調べましたが,多くの文献が論文の引用数を利用していました.

このあたりがとても読みやすかったです.

論文の引用情報を用いた論文被引用数予測

最後に

本コンペは,引用数の情報がないようなものなので('comments'にたまに記載されているけど,数が非常に少ない),特徴量作りにかなり苦戦しています.

また,'doi_cites'は'doi'の情報を利用して計算しているようなので,'doi'を/で分割した先頭部分を使って特徴量作るのは,あまり意味がないのかなと思っているのですが,どうなのでしょうか?

そうなると,残ったデータで直感的に論文の被引用数に大きく影響を与えるのは,著者情報である気がしています.

しかし,著者名は表記揺れがあったりするので,このあたりをどう工夫するべきかを迷っています.

Aws4 request&x amz signedheaders=host&x amz signature=b1472c1a20b969c84eef0ba213248f3bf8e18ac68279585980f5b50f7769d27b
takaito

画像がうまく表示されないので,どうしたら表示できるか教えてもらえると幸いです.

Aws4 request&x amz signedheaders=host&x amz signature=0e6cdf0c4515bef20c180180d24d178fdb3b25b88f993dc1ba3b546e94709227
ProbSpace_official

takaito様

画像がうまく表示されないことで、ご不便おかけしております。
システム上のバグに起因すると考えられ、原因については現在調査中になります。

また、画像を参照しているコードより"=300x"を削除することで正常に画像が表示されることが報告されておりますため
お手数おかけしますが、しばらくの間は応急措置として、ご対応いただけますと幸いです。

処置前:
![343833e9-d96e-4078-ba26-3cad75107b87.png](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/1178db9fbdddd5572a5ff985df0738f4/images/UserImage_147/343833e9-d96e-4078-ba26-3cad75107b87.png =300x)

処置後("=300x"を削除):
![343833e9-d96e-4078-ba26-3cad75107b87.png](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/1178db9fbdddd5572a5ff985df0738f4/images/UserImage_147/343833e9-d96e-4078-ba26-3cad75107b87.png)
343833e9-d96e-4078-ba26-3cad75107b87.png

どうぞよろしくお願いいたします。

Aws4 request&x amz signedheaders=host&x amz signature=b1472c1a20b969c84eef0ba213248f3bf8e18ac68279585980f5b50f7769d27b
takaito

ProbSpace_official 様

解決方法の提示,ありがとうございました. 無事,画像を表示することができました!

Aws4 request&x amz signedheaders=host&x amz signature=0e6cdf0c4515bef20c180180d24d178fdb3b25b88f993dc1ba3b546e94709227
ProbSpace_official

takaito様

ご確認ありがとうございます。
他にも不具合等ございましたらいつでもお気軽にご連絡ください。

引き続き、どうぞよろしくお願いいたします。

Aws4 request&x amz signedheaders=host&x amz signature=6b9c09be70c0f1025561ef463ba4f281333aa937c2665b6e2b8d4fbb717e4dae
szdr

モデリングに関して、自分はしばらくLightGBM使っていたのですが、CatBoostに切り替えたところ精度がそこそこ上がりました

また、LightGBMモデルとCatBoostモデルのアンサンブルも(わずかに)効果がありました

Aws4 request&x amz signedheaders=host&x amz signature=1c799258bd2951888a5026433d2fc5961b10528ab49ea4958cfd2f0d788d845a
takaito

szdr さん

コメントありがとうございます.

自身もCatBoost使ったらスコアが向上しましたが,0.48には届きませんでした.

LightGBMモデルとのアンサンブルでは効果が得られずでした.

根本的な特徴量作りが甘いと思うので,スコア追いつけるように頑張りたいと思います!

Aws4 request&x amz signedheaders=host&x amz signature=a5bbc4d32b4c09718467154c2e8cf9e7147c169f5fa762f8fa494c92c1b8c264
pop-ketle

弱教師あり学習について


自分は、弱教師あり学習が特徴らしい?コンペということで、citesがないデータに対して、まずcitesを予測するモデルを作成し、trainデータのcitesの欠損値を埋めることで、使用可能なデータを増やす(いわゆるpseudo labeling的な)ことを取り組みとしてここしばらく試していましたが、あまり上手くいきませんでした。
仕方ないので、とりあえず弱教師あり学習は無視してcitesが存在するデータのみを用いる以前の方法に戻ることにしようかな...と考えています。弱教師あり学習である点を活かした特徴量やモデルづくりをできている人がいるのかかなり気になります。

doi_citesについて


じゃあ、本コンペ、弱教師あり学習の目玉であるはずの低精度被引用数、doi_citesってなんなんだ?という話になってくるかと思います。
自分のモデルでもdoi_citesのimportanceはかなり高く出ていて、また、本ディスカッション上でもあげられていますが、doi_citesとciteの相関はそれなりに高いものとなっています。

そこで、doi_citesがどのように生成されたものなのかを考えるのが鍵なのかなと考えて、今は少し思案中です。 軽くEDAをしたところ、doi_citesとdoiは一対一の関係にあるっぽいことがわかったので、doiの情報を何かもっと活かせないかと考えているのですが、ベン図を作成してみたところ、trainとtestでdoiの重なりはあまりなさそうなので、ここからどうしようかなといった感じです。

![b9a2ba9d-f100-45bd-b608-44c0496c3d0b.png](https://probspace-stg.s3-ap-northeast-1.amazonaws.com/uploads/user/e7e7ee222c5c4416a53b63a57d562dd9/images/UserImage_151/b9a2ba9d-f100-45bd-b608-44c0496c3d0b.png =200x)

# ベン図でtrainとtestの比較
columns = ['submitter', 'authors', 'title', 'journal-ref', 'doi', 'report-no', 'categories', 'license', 'update_date']
n_figs = len(columns)
n_cols = 4
n_rows = n_figs // n_cols + 1
fig, axes = plt.subplots(figsize=(n_cols * 3, n_rows * 3), ncols=n_cols, nrows=n_rows)
for c, ax in zip(columns, axes.ravel()):
    venn2(
        subsets=(set(train[c].unique()), set(test[c].unique())),
        set_labels=('Train', 'Test'),
        ax=ax
    )
    ax.set_title(c)

plt.savefig(f'./venn.png')
plt.show()

おまけ


titleとabstractに対して、自然言語処理的な特徴量生成を行えると思いますが、自分が軽く触った限り、あんまりいい特徴量を生成できていません。ここら辺の情報は結構大きいものとなる気はしているのですが、他の人はどんな感じなのか少し気になります。

Aws4 request&x amz signedheaders=host&x amz signature=1c799258bd2951888a5026433d2fc5961b10528ab49ea4958cfd2f0d788d845a
takaito

pop-ketle さん

コメントおよび,分析結果の共有ありがとうございます!

'doi_cites'によって,'doi'はすでに役目を終えているのかなと思っていたのであまり分析できてないのですが,どうなのでしょうか?

テキスト部分に関してですが,abstractの書き方とかは影響を与えそうですが,titleは本当に影響があるのかは疑問があって,自分はけっこう適当に分散表現作って一応使っている程度です.

例えば,

「Long Short-Term Memory」 → 以降の論文はたいてい,タイトルはLSTMと書いてあって関係性を分散表現から特定できない

「Attention Is All You Need」 → attentionとタイトルについている論文が果たして本当に引用数が同じくらいなのか

ある特定のワードが爆発的に使われ始めた最初の論文とかをTag付けしたかったのですが,ちょっと難しかったです(汗)

Aws4 request&x amz signedheaders=host&x amz signature=a5bbc4d32b4c09718467154c2e8cf9e7147c169f5fa762f8fa494c92c1b8c264
pop-ketle

確かにdoi_citesによって、doiはすでに役目を終えている部分も大きそうですが、もしdoiから分野を特定できれば嬉しいなと思っていたり(かなり無理筋な気はしてますが)。

doiからdoi_citesが導き出される過程を推察できれば、citesの予測にも活かせそうとは思っているんですがなかなか期待通りには行っていないのが現状です。

titleに対しては私も同じことを考えていました。
ただ、流行りっぽいワードが入ってれば引用されやすかったり、タイトルからある程度分野を予測して、流行りの分野かどうかみたいなのはできたりはするのかなとはおもっていたり。
abstractの分散表現については、効いていないこともないのですが、持っているはずの情報量の割には、自分の期待ほどは影響ないので難しいところですね。

Aws4 request&x amz signedheaders=host&x amz signature=1c799258bd2951888a5026433d2fc5961b10528ab49ea4958cfd2f0d788d845a
takaito

pop-ketle さん

確かに分野が特定できれば,分野の規模からある程度,引用数の上限だったりは特定できそうですよね!

流行りワードに関しては初期のものは引用されやすく,最後の方のものは引用が少ないみたいなことは自分も考えているのですが,どのようにそのようなワードを決めたりするかなどがなかなか決められないのと,この仮説自体が合っていない可能性もあるので,とりあえず,試してみたいですね!

Aws4 request&x amz signedheaders=host&x amz signature=c35213f64aa3d4940a404b36c110ce82aa550e36839caf630d0ad57da8f0cb27
szdr

弱教師あり学習について

citesありのデータだけで学習したモデルでcitesなしtrainデータを予測&pseudo labelを振って学習データに突っ込むのはうまくいきませんでした。

分類問題では、ある程度自信を持って予測できているデータ(予測確率>=0.99など)のみをpseudo label振って学習データに突っ込むのがよくある方法とのことで、今回のような回帰問題でも取り入れられないか考えてみました。

具体的には、citesありデータを対象にCatBoostの 損失=RMSEWithUncertainty で学習し、予測分散が小さいデータだけpseudo labelを振って学習データに突っ込むということをしました。 https://towardsdatascience.com/tutorial-uncertainty-estimation-with-catboost-255805ff217e

結果として、Public Score: 0.487558 (pseudo labelなし) → 0.486965 (pseudo labelあり)とスコア改善に繋がりはしたものの、劇的な向上は得られませんでした。

Aws4 request&x amz signedheaders=host&x amz signature=1c799258bd2951888a5026433d2fc5961b10528ab49ea4958cfd2f0d788d845a
takaito

szdr さん

pseudo labelするために,予測分散が小さいデータだけ使うのは初耳でした!有益な情報ありがとうございます!

自身の考察が正しいかどうかはわかりませんが,citesなしのテストデータ以外のデータは'doi_cites'の分布が明らかに異なるので,うまくサンプリングしたりすることで,結果が向上したりする可能性もあるのかなと思いました.

pseudo labelするのであれば,現段階のCV, LBのスコアがかなり大事だと思うので,0.48乗ったら自分も試してみたいなと思います!

Icon9
skywalker

共有ありがとうございます。 0.49の壁が厚いと感じています。

doiはこちらのトピックで紹介されていたデータと紐づけて特徴として使用しています。 https://prob.space/competitions/citation_prediction/discussions/pn11-Postbc1b4fff9039ae354198

モデルは同じくCatBoostが一番精度が高かったですが、NNモデル作ってStackingすると効果ありました。 TabNetも試したみましたが効果があまり感じられなかったですね。

Aws4 request&x amz signedheaders=host&x amz signature=1c799258bd2951888a5026433d2fc5961b10528ab49ea4958cfd2f0d788d845a
takaito

skywalker さん

doiに関して自分も上記のトピックを参考に特徴量作ったのですが,あまり重要度が高くないので効いているのか...

NNは特徴量をスケーリングしたりが大変でいつも後回しにしてしまうのですが,Stackingで効果的だとのことでやる気が出ました!

話題のTabNetも試しているようですごいなと思います.

これでかなり効果的だったとコメントがあったら自分も試してみようかと思いましたが,パラメータの設定が難しいみたいな話も聞くので,真心込めて特徴量を頑張って作りたいなと思います.

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。