kaggleで初メダルを獲得しました！！！(初心者)

## はじめに
[Google Smartphone Decimeter Challenge](https://www.kaggle.com/c/google-smartphone-decimeter-challenge/overview)に参加し，銅メダルを獲得することができました．(CommonLit Readability Prizeコンペでも銀メダルを頂きました．)
銅メダルを取るまでの流れを記載していきます．**一例として，見て頂ければ幸いです．**

## 目次
+ [バックグラウンド](https://qiita.com/yoneyoneclub/items/2bb22e1e7e0242d696b9#%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89)
+ [inclassコンペへの参加](https://qiita.com/yoneyoneclub/items/2bb22e1e7e0242d696b9#inclass%E3%82%B3%E3%83%B3%E3%83%9A%E3%81%B8%E3%81%AE%E5%8F%82%E5%8A%A0)
+ [現行コンペへのモチベーション](https://qiita.com/yoneyoneclub/items/2bb22e1e7e0242d696b9#%E3%82%B3%E3%83%B3%E3%83%9A%E3%81%B8%E3%81%AE%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
+ [Google Smartphone Decimeter Challenge解法](https://qiita.com/yoneyoneclub/items/2bb22e1e7e0242d696b9#google-smartphone-decimeter-challenge%E8%A7%A3%E6%B3%95)
+ [今後に向けて](https://qiita.com/yoneyoneclub/items/2bb22e1e7e0242d696b9#%E4%BB%8A%E5%BE%8C%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6)

## バックグラウンド
簡単に私のバックグラウンド紹介します．

+ 機械系院21卒(機械系ではあったが機械学習には触れていた．[研究内容](https://readyfor.jp/projects/guidecane2))
+ kaggleにアカウントがあるが，Titanic提出後一年ぐらい何もしていない．
+ 社会人になって時間ができたため(業務はデータサイエンス関係ないです)，2021/4より本格的に参加(4ヶ月程度でexpertになったので短い方だと思います．)  
+ [東京大学松尾研](https://gci.t.u-tokyo.ac.jp/gci-2021-summer/)(GCI2020 summer)の講義中の課題として（kaggleではない）コンペに参加していた．  

上三つが重なる方は特に同じ境遇ではないかと思います．
↓kaggle活動記録
![スクリーンショット 2021-08-11 12.15.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/766bcf3d-6d55-4d12-3859-3a39a5f12d2f.png)

## inclassコンペへの参加
幸運なことに新卒入社した会社でkaggleのinclassコンペが開催されており，そちらに4~5月は参加しておりました．比較的短期間でメダルをとることができたのはこのinclassコンペのおかげです．inclassコンペへの参加は幸運であり，再現性に欠ける部分があるかもしれませんが，他記事などでinclassコンペで得た知識を補完できるように紹介できたらと思います．
### inclassコンペとは

コンペをkaggle上で内輪開催して，内輪で勉強するといった趣旨のコンペです．
特長としては  

+ 日本語で開催することができる．
+ ホストとの距離が近い
+ Notebooks，Discussionではメダルが付与される．  
参考：[内輪でやろう！KaggleのInClassコンペ](https://qiita.com/shimopino/items/9b3ddeb220601901cffc)  

inclassコンペへの参加は現状，「Kaggler-ja」というKaggleでの情報共有を行うSlackに参加して情報を得ることが良いかと思います（inclassへの参加の正攻法はわからずです．．．）

### inclassコンペへの参加を通して
上記のinclassコンペが社内で開催されており，そちらに参加し，様々な学びを得ました．
inclassに参加はできませんが，Notebooks，Discussionの使い方などは確認できるので参考になります．
一例:https://www.kaggle.com/c/used-car-price-forecasting/overview
特にメダルを取る上で重要なことは以下だったと感じております．  参考URLでも十分inclassで得た知識は補完できると思います．

+ kaggleの運用(1日5sub,最終2sub選択，5subのリセットは朝9時,数ヶ月で運用される,Private/Public Leaderboardなど)   
 [運用に関してはこちらを参考に](https://qiita.com/rinascimento741/items/2d27ea4b917065110a98)
+ Notebooks，Discussionの使い方
[Notebooks，Discussionの使い方に関してはこちらを参考に](https://qiita.com/sudominoru/items/0290b09c6a9cfabd7d20)

**ここまでがinclassコンペでの活動になります．以降は一般的な現行コンペへの参加記事です！**

## コンペへのモチベーション（現行コンペへの参加）
2~3ヶ月続くコンペにおいて，**特に初参加の場合**はモチベーションを保つことができるかが重要であると考えておりました．また，初心者といえども，時間をかけて毎日更新すればメダルは必ず取れると考えておりました．そこで，

+ 5人チームを組む
+ Twitterで参加者をフォローする
+ Notebooks，Discussionでメダルを狙う
+ 自身の興味ある分野（少しでも知識がある分野）を選択する

を意識しました．

#### チームを組む（今回は最大5人）．
5人チームを組む上で重要視したのはランク上位になることです．ランク上位になるの難しいのでは？と感じるかもしれませんが，コンペ序盤に上位になることはさほど難しくありません．(実際にこのスコアはコンペ終盤では，はるかメダル圏外)実際に私のツイートです．コンペの内容はほとんどわかっておりませんでしたが，公開されているcodeをコピペして少しパラメータを変えるだけで銀メダル圏内に入れました．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">うぉぉお〜〜〜〜（なんもわからん） <a href="https://t.co/acuMvf0dE1">pic.twitter.com/acuMvf0dE1</a></p>&mdash; こめ (@toooyone) <a href="https://twitter.com/toooyone/status/1396457552318124032?ref_src=twsrc%5Etfw">May 23, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
上位ということを口実にコンペに誘いました．（コンペの内容がよくわかってないことは黙ってました．笑）
最終的には5人チームを組むことができ，（チーム組んで頂いた方には感謝しかないです．チームに誘うのはハードルが高いですが，メダルを取れば恩返しできます！:sunny:声かけるのみです！！！）
チームを組むことでコンペの内容を気軽に相談でき，アイデアを共有できます．
また，順位が上がった時に報告して”すごいやん”と言ってくれるメンバーの存在はモチベーションを保つ上で重要でした．
#### Twitterで参加者をフォローする．
Twitterは優しい世界です．最後の投稿では最初と比べて多くのいいねをもらえました．Twitterは大きな力になりました．ぜひ同じコンペに参加している方をフォローしましょう．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">粘った甲斐があった．．． <a href="https://t.co/HPBZFYDibn">pic.twitter.com/HPBZFYDibn</a></p>&mdash; こめ (@toooyone) <a href="https://twitter.com/toooyone/status/1422939220784541697?ref_src=twsrc%5Etfw">August 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#### Notebooks，Discussionでメダルを狙う
Competitionsとは別にNotebooks，Discussionでもメダルが付与されます．Notebooks，Discussionはコンペ途中でもメダルが付与されるので，序盤は特にnotebookのネタを探して投稿しました．(無事notebook銀メダル獲得)
![スクリーンショット 2021-08-11 15.40.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/56c58657-e3ae-3cf2-ccb7-f5b5f660285e.png)


#### 自身の興味ある分野（少しでも知識がある分野）を選択する  
将来自動運転で交通弱者にアプローチしたいという思いから，GNSSが関係する今回のコンペを選択しました．将来的には機械学習を中心に自動運転に取り組んでいきたいため，GNSSコンペはモチベーションになりました．自動運転に興味ありで，kaggleにも興味ある方はぜひお声掛けください．:flushed:

## Google Smartphone Decimeter Challenge解法
解法に関してはもっと素晴らしい記事がGoogle Smartphone Decimeter Challengeの[discussion](https://www.kaggle.com/c/google-smartphone-decimeter-challenge/discussion)に投稿されておりますので，そちらを参考にしてください．ここでは私の解法の一部を紹介します．

+ Pseudo labeling
+ カルマンフィルター
+ 機種平均
+ 緯度経度外れ値
+ アンサンブル
+ 前後の位置関係から算出した進行方向角度抽出 & imu曲がり角抽出 & snap to grid 
+ 高さで外れ値(この中ではかなり効いた)
+ stop mean (機械学習)

### コンペ序盤
+ Pseudo labeling
+ カルマンフィルター
+ 機種平均
+ 緯度経度外れ値
+ アンサンブル

Pseudo labelingが序盤ではアドバンテージになっていたかと思います．カルマンフィルター，機種平均，緯度経度外れ値処理を複数回繰り返すということをしておりました．序盤の何もわからん状態でもできることは限られていましたが，ランキング上位になることには十分でした．
また，@shu421さんの記事でも言及されておりますが，**Notebooks，Discussionには全てに目を通りておりました**

### コンペ中盤
### 高さで外れ値処理
チームを組んでいくうちにコンペについての概要を把握できるようになってきました．そこでまずはbaselineとして公開されているデータに注目して高さと外れ値に強い相関があることが分かりました．これはdowntown以外の地域（今回のコンペではdowntown(SJC),hightway,tree streetなど地域で分けて後処理することが主流となっておりました．）でも有効でした．
![スクリーンショット 2021-08-11 17.03.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/99ebf828-a8fc-f907-6359-c1f8c9c8ec82.png)


### 前後の位置関係から算出した進行方向角度抽出 & imu曲がり角抽出 & snap to grid  
[snap to grid](https://www.kaggle.com/kuto0633/road-detection-and-creating-grid-points)を参考に実装しました．まずはDowntownにのみ実装することを想定しましたが，すべての地点に置いてsnap to gridするのではなく，baselineの前後の位置関係から算出した進行方向角度を算出し，進行方向角度の大きい地点を抽出します．このままでは曲がり角も抽出してしまうので，imuの閾値が大きい部分は自動車が右左折していると判断し，その部分以外でsnap to gridを実装しました．
![3B204783-6EF2-459A-AAD2-6253DBF0D4AE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/e0f2127d-3b57-78d3-58a3-777b7cd00fbb.jpeg)

### コンペ終盤
downtownはかなり綺麗に処理できていたのですが，他の地域に対して効果的な後処理が実装できずに伸び悩みました．
ここまで非機械学習で取り組んできたので，機械学習を実装したいということと，小手先の閾値変更やアンサンブルだけでは上位に食い込むことができないということを感じておりました．
### stop mean (機械学習)
そこで公開された[notebook](https://www.kaggle.com/katomash/a-car-is-moving-or-not-accuracy-94)を参考に自動車の停止判定を行い，停止中は平均化処理する実装をすべての地域に行いました．
![スクリーンショット 2021-08-11 17.26.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/92128eba-7ed1-1abd-cec3-9eb71f674c80.png)

最終的なPublicLBは以下のようになり，46位でfinishでした．
![スクリーンショット 2021-08-11 17.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/1d720edf-cf63-e364-b19a-d9ebf7654108.png)


### コンペ結果
最終的に70位で銅メダルを獲得できました！:relaxed:
PublicLBにoverfitしていたため，このような結果になりました．
![スクリーンショット 2021-08-11 17.31.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/04bf5ebe-9457-f41a-65d4-47036605055f.png)
どうしてもPublicLBで上位になるために，またやっている感を出すためにただ閾値を変更して提出してPublicLBでスコア向上を目指していました．**閾値の変更はスコアが向上すれば手を動かしてやってる感がでますが，本質から目を逸らし，誤魔化しているだけだったと反省しております．**:cry:
ただ，チームを組むためにという点でスコア向上は有効だと考えておりますので，使い分けが重要だと感じております．

下記サイトにも解法が記載されております．
https://www.kaggle.com/c/google-smartphone-decimeter-challenge/discussion
https://qiita.com/shu421/items/ed255c1ad846c92ba448
https://www.t88.work/entry/2021/08/10/005037
https://kutohonn.hatenablog.com/entry/2021/08/09/102120

## 今後に向けて
実は平行してCommonLit Readability Prizeコンペにもチームとして参加させて頂き，メダルを取ることができ，expertになることが出来ました！！！
![スクリーンショット 2021-08-11 15.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514658/eedd5875-4897-a892-1080-c159f8671eb7.png)
今後はMasterを目指すとともにinclassのホスト(masterになれればしたい),自動運転へ実装やアプリケーションなどを通して社会実装したいと考えております．(LINE botとか一番手軽)
チームのお誘いはいつでもお待ちしております．:raised_hands:
いつでもtwitterなどでお声掛け頂ければ幸いです．（切実）
最後まで読んで頂きありがとうございました．
Twitter:https://twitter.com/toooyone
kaggle:https://www.kaggle.com/tyonemoto
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">無事Expert になれました</p>&mdash; こめ (@toooyone) <a href="https://twitter.com/toooyone/status/1425231340731912195?ref_src=twsrc%5Etfw">August 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##　参考
https://qiita.com/shimopino/items/9b3ddeb220601901cffc
https://qiita.com/sudominoru/items/0290b09c6a9cfabd7d20
https://www.kaggle.com/c/google-smartphone-decimeter-challenge/overview
https://qiita.com/shu421/items/ed255c1ad846c92ba448
https://www.t88.work/entry/2021/08/10/005037
https://kutohonn.hatenablog.com/entry/2021/08/09/102120