Kaggleランキング ポイントの仕組み

# Kaggleランキング ポイントの仕組み
![kaggle_ranking.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/d41f9589-c18c-ca05-df22-c62eb4eb796d.png)

この記事は、AI道場「Kaggle」への道 by 日経 xTECH ビジネスAI① Advent Calendar 2019のアドベントカレンダー14日目の記事です。

Kaggleには獲得メダルの色と数によって決定されるGrand master/Master/Expert/Contributor/NoviceのTierの他にランキングという仕組みがあります。Tierに比べあまり重視されることはない印象ですが、どのような仕組みになっているか解説します。(※コンペティションのみ)

Kaggle notebook
https://www.kaggle.com/d1348k/learn-aboout-competition-points

github
https://github.com/uratatsu/kaggle_ranking

## Kaggleポイントとは
Kaggleのコンペティションには金/銀/銅のメダルの他にCompetition pointsというものがあり、コンペティションの順位確定時に参加者にポイントが付与されます。ポイントは以下の数式により算出されます。

## ポイントの仕組み
```math
 \Biggl[\frac{100000}{\sqrt{N_{teammates}}}\Biggl]\Bigl[Rank^{-0.75}\Bigl]\bigl[\log_{10} (1+\log_{10} (N_{teams})) \bigl]\biggl[e^{-t/500}\biggl]
 ```
まずは基礎点として100,000点配られます。ここから参加チーム数、順位、自チーム人数によって、0~1の係数がかかって最終的な獲得ポイントが決まります。

### 順位による効果
```math
\Bigl[Rank^{-0.75}\Bigl]
 ```
当然ですが、最も大きい影響があるのはそのコンペティションのprivateにおける順位です。![kaggle_points_rank.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/679dbc81-23a3-b771-358d-343812733536.png)
順位に応じて、係数が上記グラフのように減衰します。

|順位|係数|
|---|---|---|
|1st| 1.0| 
|2nd | 0.5946| 
|3rd | 0.4387 |
|10th | 0.1778 |
|50th | 0.05318 |
|100th | 0.03162 |

1位と2位の差が非常に激しく、2位だと1位の60%ほどのポイント獲得率になります。10位で約18%、100位だと3%しかもらえません。



### 参加チーム数による効果
```math
\bigl[\log_{10} (1+\log_{10} (N_{teams})) \bigl]
 ```
そのコンペティションに参加しているチームの数によって、この項が変わります。
参加チーム数が多いほど、かけられる係数は大きくなりますが、下のグラフを見てわかるように、10,000人参加(今までの最高は8802チーム)したとしても0.7程度です。1,000チーム参加した場合には0.6程度なので、参加人数が10倍になってもポイントは1.16倍程度にしかなりません。
![kaggle_points_teams.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/bb68af1f-c151-9121-8a6e-a6b5fbf1acad.png)

[Kaggle運営の考え方](http://blog.kaggle.com/2015/05/13/improved-kaggle-rankings/)が公式ブログに書いてあるのですが、100チーム参加のコンペと1,000チーム参加のコンペで勝つために必要なスキルはそこまで変わらないという考え方によるそうです。以前はlog10(x)をつかっていたので、100チームと1000チームで1.5倍の差があったそうです。


### チーム人数による効果
```math
 \frac{1}{\sqrt{N_{teammates}}}
 ```
チームメイトの人数には上記の数式によって計算された係数がかかります。

![kaggle_points_teammates.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/9e8be7dc-23b9-58ff-3382-9922fbd71192.png)

2人で7がけ、4人で半分程度です。思ったより、チーム人数による減衰は少ない印象があります。


|人数|係数|
|---|---|
|1|1.0 |
|2|0.7071 |
|3|0.5774 |
|4|0.5|
|5|0.4472 |
|8|0.3536 |


### 経過日数による効果
```math
\biggl[e^{-t/500}\biggl]
 ```
最後の項が経過日数による減衰です。
![kaggle_ranking_days.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/e1a048f4-111e-2237-5fbd-e22ca67b989e.png)

346日、1年弱で半減します。


### 順位とチーム人数の関係
この中で、コントロール可能なものはチームメイトの人数と順位のみになります。
チームを組むと獲得ポイントは減少しますが、一般にチームマージを行うと順位が上がる傾向にあるため、上位のほうの順位による獲得ポイントの上昇が大きいところでは、チームを組んで最終順位を上げたほうが獲得ポイントが大きくなる場合があります。順位とチーム人数の関係のヒートマップです。
![kaggle_ranking_heatmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250105/d65a1aea-60a1-a1c5-a0ed-7d95726819dc.png)


例えば、2位の人が誰かとチームマージして1位になる場合、59.5% → 70.7%となるので獲得ポイントは上がります。

まぁなんていうかこんなこと考えながらチームマージするのは虚無なので普通は必要ないと思いますが。。Kaggle Ranking top30とか超上位の人にとっては重要なのかもしれません。

## ポイント獲得例
```python
def calculate_points(teammates, rank, teams, days):
    points = 100000 * 1/np.sqrt(teammates) * np.power(rank, -0.75) * np.log10(1+np.log10(teams)) * np.exp(days/500)
    return points
```
この計算式でいくつかの事例を計算してみると、以下のような獲得ポイントになります。

|順位|参加チーム数|チームメイト数|メダル|獲得ポイント|
|---|---|---|---|---|
|1|1000|1|Gold|60206|
|1|1000|5|Gold|26925|
|5|1000|1|Gold|18006|
|25|1000|1|Silver|5385|
|75|1000|1|Bronze|2362|
|100|1000|1|Bronze|1904|

ソロ優勝のインパクトはとてつもなく、その1つでkaggle competitions ranking 32位相当(※2019年12月14日時点)になります。ちなみに先頭の画像にある現在kaggle competitions ranking ダントツ1位のbestfitting氏はソロゴールドが20個(!)、ソロ優勝が3個(!!)あり、他の追随を許していません。

## おわりに
なんとなくチーム人数や順位で変わることはわかっていましたが、減衰率を可視化してみると意外に面白かったです。ポイントの付け方をどうとらえるかはいろいろあると思いますが、計算方法の正しい理解の助けになれば幸いです。