barefoot

技術のことを書いていく

業務で感じた「あ!これkaggleで見たやつだ!」

f:id:tenajima:20191221145615p:plain こちらの記事はKaggle Advent Calendar 2019の21日目の記事になります。
昨日の記事はあっきーさんさんのデータに含まれる異常値を検出してみようでした。

kaggleを始めたのが入社してからなのでそろそろ1年半くらい経過します。
kaggleを通して得た知見が実際の業務で「あ!これkaggleで見たやつだ!」ってなった例を紹介します。
これを通して「お、kaggle始めてみようかな」って人が出てくれたり、「あるある~、私はこういうところが役に立った」というつながりが生まれることを期待しています。

余談ですが、僕は某学習教材のマンガすごく好きでした。

はじめに

僕がどんな仕事をしているかが以下の記事に大きく関わってくるので紹介しておきます。
Fringe81という会社でアドネットワークの分析、アルゴリズムの開発や、UniposというHRプロダクトの分析、機能開発を行っています。
1年目が広告プロダクトの方を担当しており、2年目の現在がUniposを担当しています。
使うデータはテーブルデータが多く、kaggleでもテーブルコンペを好んで参加しています。

「あ!これkaggleで見たやつだ!」

評価指標

実務では「これで評価してね」ってのが天から降りてくることはないので、「この問題を解くのに必要な評価指標ってなんだろう?」って考えることからのスタートとなります。
その引き出しをたくさんつくっておけるという点でkaggleでいろんな指標を知っておくのは非常に有用だなと感じています。

AUC

圧倒的によく使っています。
正例と負例の偏りが大きいという場合のデータを扱うことが非常に多いのでAUCはよく参考にしています。

www.kaggle.com

RMSE

回帰問題のときにはよくつかいます。そりゃそうだってかんじかもしれませんが、よく使います。

www.kaggle.com

おまけ

次点でnDCGとF1スコアをたまーに使います。

pandas技

jsonを展開

テーブルの中身にjsonが入ってることというのは実務だとけっこうあることだと思います。
その際にjsonを適切にパースするということはkaggleでやっていたなぁと感じています。

以下のカーネルの初っ端でpandas.io.jsonjson_normalizeを使ったjsonのパースが行われているので是非参考にしてみてください。

www.kaggle.com

groupby

特徴量を作る際にいろんな作り方で特徴量を作っていて、そういったkernelを読んでいくのもすごく参考になります。
kaggleを始めてから知ったgroupby技を2つ紹介します。

import pandas as pd
df = pd.DataFrame({"name": ["hoge", "hoge", "fuga", "fuga", "fuga", "piyo", "piyo"], 
                  "score": pd.np.random.rand(7)})
df
name score
0 hoge 0.462346
1 hoge 0.837340
2 fuga 0.632214
3 fuga 0.599127
4 fuga 0.642452
5 piyo 0.125139
6 piyo 0.072438

いろんな統計量を一気にとるaggメソッド

agg = {"score": ["sum", "mean", "var"]}
df.groupby("name").agg(agg)
score
sum mean var
name
fuga 1.873793 0.624598 0.000513
hoge 1.299686 0.649843 0.070310
piyo 0.197577 0.098788 0.001389

pandas0.25からは次のようなこともできるようになりました。

df.groupby("name").agg(score_sum=("score", "sum"), tenajima=("score", "mean"))
score_sum tenajima
name
fuga 1.873793 0.624598
hoge 1.299686 0.649843
piyo 0.197577 0.098788

groupごとに処理をする

恥ずかしながらこれを最近まで知らなかったのですが、これめちゃくちゃ便利ですね...

for groupby_key, group_df in df.groupby('name'):
    print(f"{groupby_key}の平均値は{group_df['score'].mean()}だよ")
fugaの平均値は0.6245975900622805だよ
hogeの平均値は0.6498428673222854だよ
piyoの平均値は0.0987884793002905だよ

おまけ

ネットワークを考える際に、計算の都合上sourceとtargetのように有向グラフのように考えて計算しなきゃいけないのですが、実際に出したい値としてはsourceとtargetの値が逆でも同じ値という場合にMolecular Predictionコンペの以下のカーネルが参考になったのでおまけとしてあげさせてもらいます。

www.kaggle.com

その他で身についたこと

GCEまわりの扱い

kaggleで計算するときはGCEを使って計算しています。
そのため、リモートでコードを書きやすくするためにVS CodeのRemote Developmentを使える方法を調べていたのが業務でも参考になったり、 複数のインスタンスでチューニングするための環境設定の手間を減らすためにdockerfileを用意しておいたことが業務でも活きた経験があります。

Pipelineの設計について悩んだり実践していたこと

kaggleのコンペは2ヶ月くらい続く中で苦しくならない設計をしないと途中でしんどくなってしまいます。
そのために作ったPipelineや使っているフレームワークは業務でも活きています。
現在はluigiをラップして作られているgokartを使ってPipelineを作っています。また、gokartは業務でも使用しています。

github.com

まとめ

強いデータサイエンティストが集まるkaggleという場所で得られる知識というのはすごくたくさんあるなと日々感じています。
メダルや称号を目指しながら業務でも使えるtipsを得られるこのプラットフォームはすごく素敵なプラットフォームだと思います。
今後もたくさんDiscussionやkernelを読んでいろんなことを自分の身にしていきたいと思います。
そして次のKaggle Days Tokyoに参加できるよう精進していきます!

ここまで読んでいただきありがとうございました。Kaggle Advent Calendarはまだ続きます!
明日はJun Kodaさんです。引き続きお楽しみください!