新卒2年間の振り返り

5/23が新卒で入った会社の最終出社日でした。せっかくなので新卒時代の振り返りを行います。

目次

  • 新卒時の意思決定
  • 2年間で何をしたか
  • どんな経験を得たか
  • 入社してどうだったか
  • 次のキャリアについて

新卒時の意思決定

私は21年卒として就職活動を行い、最終的に某IT大企業 (以降A社と呼ぶ)に就職しました。 当時はデータサイエンス職を中心に新卒採用を受けていて、現職のみならずWeb系や研究開発職、受託データ分析の会社などから内定をいただいていました。

なぜA社を選んだかについてはここでは詳しく述べませんが、手を挙げれば挑戦させてもらえる環境がありそうであること、高校時代の友人が既にA社に入社していて内部の事情がある程度わかっていることなどから総合的に判断してA社に決めました。特にこれと言ってやりたい事業はなかったため、あえて多様な事業ドメインに関われる大企業に入社して、その後やりたいことを見つけていこうという考えでした。

2年間で何をしたか

私が配属されたのはコンピュータービジョンの研究開発の部署でした。(これはいわゆる配属ガチャです。)
研究開発といっても論文執筆をする人たちもいれば、論文執筆はぜず医療機関からデータをもらって解析するといった応用研究やPoCをするチームがありました。私は後者のプロジェクトに関わっていました。

詳細は述べれませんが私は2年で以下の分野の応用研究やPoCを経験しました。 具体的な分野は以下の通りです。

  • 医療画像解析
  • 3D物体検出
  • SLAM
  • 3次元再構成
  • 単眼深度推定

学生時代に統計学を専攻していて画像データを扱ったことのない自分にとっては結構ニッチな分野のPoCを任されましたが、自分が知らない新しい分野のリサーチを行い動くものを作る経験は楽しかったです。

どんな経験を得たか

PoCを一気通関で行う経験

PoCのテーマ決定はトップダウンでありふわっとしていてゴールが明確ではなくやりにくいことが多かったです。(例えば物体検出を例にあげると、物体検出という技術を使ったPoCを行えばよく、何の物体を検出するか、データとして何を使用するかは自分たちで決める必要がありました。)

上記の制約の中で、自分たちでPoCの詳細なゴールを定めて、そのゴールを達成すべきために必要な評価方法を定義して、その評価方法を満たすためにはどのような検証・データが必要か考えて、その検証項目を満たすべく過不足のないデータ収集を行い、データ収集ができるようなハードウェアを調査し必要なスペックのハードを購入し動作確認を行う、といったPoCの全ての工程に関われたことは大きな経験となりました。

また自分たちは企業の研究開発の部署であるためPoCの詳細なゴールを決定する際には、A社の事業に貢献できるか、その研究テーマはリソース(人、モノ、金)はどれくらい必要か、伸びしろはあるか、競合はどうかなどを常に問われていました。研究テーマを決定する上でここが非常に難しかったのですが、この経験は今後につながるものになると思っています。

コンピュータービジョンに関する知識と経験

学生時代からKaggleなどのデータ分析コンペに参加していましたが、以下の通りテーブルデータの経験しかありませんでした。

  • 称号: Novice
  • メダル: 銀メダル🥈 x1 (Riiid Answer Correctness Prediction)

しかし、2年間コンピュータービジョンの研究開発を行うことで、新たに4つの銀メダルと1つの銅メダルを獲得しKaggle Expertになることができました。

  • 1st and Future - Player Contact Detection
    • 銀メダル🥈 (24/939)
    • データ: 画像、テーブル
  • DFL - Bundesliga Data Shootout
    • 銀メダル🥈 (27/530)
    • データ: 動画
  • Image Matching Challenge 2022
    • 銀メダル🥈 (29/642)
    • タスク: 特徴点マッチング
  • H&M Personalized Fashion Recommendations
    • 銀メダル🥈 (133/2952)
    • データ: テーブル、画像、自然言語
    • タスク: 推薦

上記のようなKaggleの成績が残せたのは、もちろん業務を通しての成長もありますが、業務内での自己研鑽やマシンリソースの提供、インセンティブ制度といった会社のサポートがあってのことだと思っており非常に感謝しています。

その他

研究開発の部署に所属していたこともあり休日でも論文を読むことが習慣となり、2年間で多くの論文を読むことができました。 3D系のコンピュータービジョンの論文を読むことが多く、精読したものの一部については以下にまとめています。
https://www.notion.so/5dc244a8170249e3826915f129d304e4?v=c8fe06ecfce7480fb81f4ff349a8baf5

入社してどうだったか

入社前にやりたいことが明確ではなかった自分ですが、CVの研究開発に関われた2年間は非常に充実していたと思います。これは自分が新しい領域や技術に関われることにやりがいや楽しさを感じる性格であったからだと思います。 またCVが何もわからない自分に丁寧に教えてくださった部署の方々やプライベートを一緒に楽しめる同期など、人にも恵まれた2年間でした。

次のキャリアについて

広告系の会社でデータサイエンティストをやっていきます。想定される業務は以下2点です。

  • TVや広告に関連する何かしらの予測モデル開発
  • AIを用いたメディア・コンテンツ開発

前者はKaggleのテーブルタスクのようなもの、後者は生成AIやLLMを活用したメディア・コンテンツ開発だと理解しています。チームにはKagglerが複数人いて会社としてもKaggleの活動を一部サポートしていただけるようです。また書籍の執筆をされる方もいてアウトプットを推奨する文化があると聞いています。前職では対外的な発表やテックブログの執筆ができなかったため力を入れて頑張りたいことの1つです。

以上が簡単な新卒2年間の振り返りでした。所属は変わってもデータサイエンティストとしてやっていることは大きく変わらない認識です。引き続きよろしくお願いします。

Kaggle Riiidコンペに参加した(銀メダル 105位)

Kaggleで10/6-1/7に開催されたRiiid! Answer Correctness Predictionに参加しました。Mochoppyiとチームを組んで、Public 100位 Private 105位(3406チーム)でした。

Kaggle初メダルです🥈💪!!!

f:id:nori0724:20210108093137p:plain

コンペの概要

TOEIC対策アプリの学習履歴を元に、ユーザーが新しい問題に対して正解するかの確率を予測するテーブルコンペでした。trainデータが1億行以上あること、testデータは公開されておらずTime Series APIが提供されていた点などは他のテーブルコンペとは違うユニークな点でした。testデータが公開されていないので未来の情報は使えず、実運用に近い形のコンペだったように思います。

チームマージまでの流れ

最初の2ヶ月はソロで参加していて銀圏銅圏を行ったり来たりしていました。ちょうどその時に#8 [初心者向] atmaCupが行われていてMochoppyiからチームを組まないかと誘われました。しかし、お互いのsub数の合計がatmaCupのチームマージ条件を満たしておらず、結果Riiidでマージする流れとなりました。

チームマージ前はカーネルで特徴量・モデル作成をやっていたため、特徴量生成に1億行全てのデータを使うことができずスコアは0.775でした。マージ後はMochoppyiの潤沢なメモリ環境のおかげで1億行全てのデータを特徴量生成に使え、モデルの学習にも4000万行のデータを使用することができました。カーネル縛りで銀メダルを取れるほどまだまだ技術がないので、このマージがなければRiiidで戦えてなかったと思います。本当にメモリの余裕は心の余裕でした!感謝!

作成した特徴量

最終的に作成した特徴量は68個です。以下はその一部です。

  • 問題の正答率
  • ユーザーの現時点の正答率
  • ユーザーが各partを解いた累積回数
  • ユーザーが現在のpartを解いた累積回数
  • ユーザーの現在のpartの正答率
  • ユーザーが過去その問題を解いたことがあるかのフラグ
    (参考:An interesting Pattern detected for Repeated Questions)

ちょっと工夫したやつ

  • 上記正答率系特徴量の移動平均(N=10, 30)
  • カテゴリ共起系
    (参考:LDAを用いたカテゴリ変数からの特徴抽出)
  • ユーザーが同じ問題を2回目解く時に、前回の解いた時間からの経過時間
  • timestampの差分
  • 問題の解答の散らばりに着目した特徴
    (例:4択問題で1つの解答に答えが集中している場合その問題は簡単とみなせる。解答が1,2,3,4と散らばっていたらその問題は難しいなど。max, min, std, max - minを算出)
  • Seq2Dec
    (参考:IEEE-CIS Fraud Detection 13th place solution)

カテゴリ共起系や時間の差分を取る特徴量は#7 CA x atmaCup 2nd#8 [初心者向] atmaCupでのディスカッションを参考に作成しました。

使用した特徴量はシンプルなものが多いですが、ユーザーごとの情報をdictionaryで保持してtestのバッチごとに特徴量を更新していくようなコードを書くのは初めてだったのでバグをとるのに多くの時間がかかりました。一からこのコードを書くのは無理だったので、titoさんのnotebookには大変お世話になりました。

www.kaggle.com

モデル・CV戦略

モデルは LightGBMで2種類のweighted averageでした。cv戦略もtitoさんのnotebookを参考にしました。

www.kaggle.com

その他学び

このコンペは提出の時間が9.5時間に制限されていたため、testのループを素早く特徴量を処理するコードを書く必要がありました。普段は気分でコードを書いてたのでコードの高速について学ぶことができたのは貴重な経験となりました。

www.kaggle.com

最後に

今回のRiiidにより初めてKaggleでメダルを取ることができました。Kaggleには過去4回(Sanander, ASHRAE, M5, MoA)参加したことがありましたが、公開notebookのコピペをしてみるが意味が分からず撤退し最後まで完走したことはありませんでした。今回最後まで完走できた要因としては、コンペ開催初日から参加しディスカッションとnotebookを読むことを3ヶ月間毎日コツコツ積み重ねたからだと思います。(11月, 12月に1週間ずつ空きがありますが、この時はatmaCupにフルコミットしていたためです。)

f:id:nori0724:20210108001220p:plain

次参加するコンペはまだ決まってませんが、まずは修論に集中したいと思います。終わり次第コンペを再開し、銀メダル・Expertを目標にやっていきたいと思います。

 

最後に初Kaggle完走までの一喜一憂の記録

 

Signate Student Cupに参加した

Signateで開催されていたStudent Cupに参加しました。結果はPublic 17位(?)・Private27位でした。

f:id:nori0724:20200827225859p:plain

signate.jp

 コンペの概要

昨年までの学生コンペはテーブルデータを扱うものでしたが、今年はNLPのマルチクラス分類でした。具体的には、求人情報に含まれるテキストデータから職務内容が

①データサイエンティスト(DS)
機械学習エンジニア(ML Engineer)
③ソフトウェアエンジニア(Software Engineer)
コンサルタント(Consultant) 

のどの職種に該当するかを分類するものでした。 

取り組み

nlpコンペが初めてであったためフォーラムの@yCarbonさんのNLPベースラインをもとに進めていきました。

signate.jp

特徴量

textへの前処理はなにもしていません。作成した特徴量といえば翻訳を利用した augmentationでドイツ語・フランス語・スペイン語を採用しました(英語->ドイツ語>-英語と翻訳をかけてデータを水増しする手法)。

アイディアは以下のサイトを参考にしました。

copypaste-ds.hatenablog.com

モデル

勾配ブースティング単体は全くだめでした。RoBERTaを試したりPseudo Labeling、XGboostとのアンサンブルをしましたがPublic LBはよくならなかったので最終サブはベースラインのBERTそのままで提出しました。

cv戦略

第5回atma Cupでcamaroさんがディスカッションに公開されていたstratified group k foldを使用しました。不均衡なターゲットの分布に対応しつつ、英語から翻訳で水増しされたデータを同じgroupとしバリデーションデータに含まないようするのが目的でした。

www.guruguru.ml

その他処理

データ内の同一テキストについてもフォーラムが上がってましたが、これに対しては前処理と後処理で対応しました。

【前処理】

  • trainデータに文書&ラベルが同一なものが複数あるもの

    →片方をtrainデータから削除
  • trainデータに同一文書が2つあるが、それぞれラベルが違うもの

    →両方をtrainデータから削除
  • trainデータに同一文書が3つあるが、それぞれラベルが違うもの

    →多数決をとり多い方を採用

【後処理】

  • trainデータとtestデータに同一文書があるもの
    →trainデータのラベルをtestデータに補間

signate.jp

またフォーラムにリーダーボードをhackしてスコアをあげるという方法を@ボーダーコリーさんが公開されていたので適用させました。

signate.jp

最後に

初めてNLPのコンペに出ましたが理論はよくわからないまま数行で実装できるBERTに頼むだけのコンペになってしまいました。しかし、Deepのフレームワークを勉強しNLPの論文を追っかけ将来もそのようなキャリアを築いていきたいかと言われると僕はそうではないので(もちろん最低限はBERTの理論はやる)、データサイエンスの中でも分野を絞って理解を深めていきたいと思えた良いきっかけとなりました。今後は数理統計や数学因果推論あたりをやっていき、Kaggleのテーブルデータが始まったらコンペも再開したいと思います。

 

東京大学グローバル消費インテリジェンス寄附講座(GCI 2020 Summer)に参加した

4/29から始まった東大松尾研主宰のGCIデータサイエンス講座に参加し先日の最終課題提出をもって全ての講義が終わりました。現在は最終課題の審査中で9月初旬に修了通知が伝えられるみたいです。修了通知や優秀生の発表はまだですが簡単にGCIの振り返りをしていきます。

東京大学グローバル消費インテリジェンス寄附講座(GCI 2020 Summer)とは

自分なりにこの講座の目的をまとめると、データサイエンスの講義ではあるがただ文法やscikit-learnを用いた機械学習がわかるだけでなく、それをビジネスへの応用できる人材を育てることであったように思います。実際、プロのデータサイエンティストの方の特別講座があり最終課題では与えられたデータから事業の提案を行いました。

講座とGCIの詳細はHPへのアクセスを。

消費インテリジェンスとは、データの分析を通して消費者を総合的に理解する能力のことです。グローバル消費インテリジェンス寄附講座では、世界規模で高い消費インテリジェンスを発揮してビジネスを動かすことができる CMO (Chief Marketing Officer) を育成します。 グローバルな消費に関するデータが急速に増えている中で、データ分析を通して消費者・生活者を理解する能力が国や企業としても必要とされています。 この問題意識から、東京大学に世界最先端のプラットフォームを創設して、人材育成および学問分野の確立を加速化しようという狙いです。

gci.t.u-tokyo.ac.jp

参加の動機

講座を知ったのは以下のツイートを見たのがきっかけでした。 僕は大学で統計学を専攻していてPythonの使い方も必要最低限は理解していたのですが、東大松尾研の方々や参加学生と横のつながりを深められるのではないかと思い参加を決意しました。

 講義の振り返り

講義は以下のカリキュラムに沿って行われました。Pythonについては今まで雰囲気で学んできたので、初めて網羅的に勉強でき良い復習の時間となりました。week7の教師なし学習ではマーケットバスケット分析とアソシエーションルールについて触れられておりよりマーケティングに特化した講義となっていました。

講義資料はHPからダウンロードできるので興味がある方は是非。

f:id:nori0724:20200820135006p:plain

weblab.t.u-tokyo.ac.jp

コンペの振り返り

講座では3回のデータコンペが開催されました。

  • 第1回:Titanic
  • 第2回:Home Credit Default Risk
  • 第3回:オリジナルデータによる時系列予測

第1, 2回はKaggleのデータを用いたコンペだったのでnotebookが大いに参考になりましたが、第3回はオリジナルデータだったのでかなりハードでした。M5のような需要予測でデータ量が多くGoogle Colabがよくクラッシュしていました...

コンぺの結果は13位→13位→2位でした。(ハイレベルでした..........)

www.kaggle.com

www.kaggle.com

www.kaggle.com

特別講座の振り返り

現場で活躍されているデータサイエンティストの方の特別講座は3回行われました。

  1. 株式会社リュウズオフィス代表取締役 小沼竜太 さん
    ゲーム×データサイエンス
  2. 株式会社ブレインパッド リードデータサイエンティスト 内池もえ さん
    機械学習を「社会実装」するということ
  3. 株式会社アパレルウェブ 代表取締役CEO 千金楽健司 さん
    アパレル×データサイエンス

小沼さんの講座では、データからわかる定量的なことだけでなく一ユーザーとしてゲームをプレイした時の感覚や期待など定性的なことも大切だということが印象的でした。内池さんの講座は、機械学習の社会実装を阻む罠があまりにも多すぎて面白かったです。スライドも共有していただいたのですが、来年以降データサイエンティストになってからもその都度見直したい・覚えておきたい内容でした。千金楽さんの講座はアパレル×データサイエンスで、大学時代アパレル販売員として実際にアルバイトしていた僕にとって非常に興味のある内容でした。アパレルのデータサイエンティストには右脳が必要だという話をされていて、以前ZOZOの方記事を思い出しました。個人的にアパレルは興味のある領域なので今後もアパレル×データサイエンスのトレンドは追っていきたいです。

speakerdeck.com

advanced.massmedian.co.jp

最終課題振り返り

最終課題はKaggleのHome Credit Default Riskのデータを用いて事業提案をするというものでした。コンペでは目的変数は債務不履行になるかどうかを予測するものでしたが、最終課題では何を目的変数にしても良いとのことでした。

以下は参加者の中で既に最終課題を共有してくれた方々のスライドです。データの着眼点、分析、事業提案、プレゼン資料何もかも凄すぎて言葉を失いました(すごい...)

speakerdeck.com

speakerdeck.com

僕の事業提案の方針はというと、

年齢・性別に債務不履行になる確率の算出

→融資利用者数と債務不履行になる確率をもとに分析ターゲット層の決定

→ロジスティック回帰・オッズ比を用いて債務不履行の要因を算出

→事業提案〜

という流れでまとめました。

自分なりの工夫はLightgbmを用いるのではなくロジスティック回帰を用いたことです。Lightgbmでも変数重要度は算出できるのですが、それが目的変数にどのような影響があるのか説明するのが難しいかったので(勉強不足)、今回はロジスティック回帰を採用しました。ロジスティック回帰ではオッズ比が算出されるため「A群に対してB群は債務不履行になる確率が〇〇倍になる〜」という直感的な解釈ができます。連続値に対して「C変数が1単位上がると債務不履行になるリスクが〇〇倍になる〜」という議論もできるのですが、ビジネスの場面ではある程度集団ごとに対してどのような傾向があるか知りたいという仮定から、連続値はクラスタリングしてロジスティック回帰にかけました。またロジスティック回帰を採用した理由として、僕は統計出身なのでp値を算出しどの変数までが有意なのかを適切に議論したいという思いもありました。最終課題は途中までは頑張ったのですがスライド作成はサボったので非公表とします...。これで優秀賞を逃しても仕方ないです。

この最終課題での学びはビジネス応用のためのデータサイエンスの難しさです。チズチズくん(@chizu_potato)のツイートに同意です。

 データコンペで他人より1%でも精度の高いモデルを作ることは難しくもおもしろいのですが、その1%の改善でビジネス的にどんな価値があるのかを考えることは忘れてはいけないと気づかされました。

また、データコンペではあらかじめ目的変数が与えられているのですが、事業提案では目的変数は自由(その時の課題次第)だと思います。データから課題を見つけ、データサイエンスとして解ける問題に落とし込む力の無さは痛感しました。データサイエンスに詳しくない人への分析結果の伝え方とスライドの作り方も含め学びと反省の多い最終課題となりました。

総括

最低限Python機械学習を触ったことがある人でも非常に学びの多い講座であったと思います。特にslackで受講生間で学びを共有したり教え合えたりできたのは良かったと思います。ここで出会った方々の多くは将来データサイエンティストになると思うので講座終了後も交流を続けていきたいです。

最後になりましたがGCI運営の皆様・参加学生の皆様には感謝申し上げます。ありがとうございました。

 

 

 

ProbSpace YouTube動画視聴回数予測コンペに参加した

4/28から行われていたProbSpace主催のYouTube動画視聴回数予測コンペに参加しました。結果はpublic10位・private11位でした。

f:id:nori0724:20200630001511p:plain

prob.space

コンペ概要

このコンペはYouTube APIとして公開されているメタデータを用いて、動画視聴回数を予測するものでした。メタデータの中には、動画コンテンツの質的指標となるlike/dislike・コメント数や、タイトル名・説明文・タグ・投稿時間といった情報が含まれていました。サムネイル画像も取得することができ、テーブル×text×画像といった多様なデータを扱うこのでき点で非常に面白いコンペでした。

チームメンバー

メンバーは内定者同士で交流を深めたいという思いから、内定者slackで参加者を募り、集まった6人を2チームに分け参加しました。両チームともデータコンペ 経験者1名・NLP専門1名・画像専門1名とバランスの良いチームとなりました。

取り組み

特徴量(数値系)

  • 日付に関する特徴量(時間, 曜日, 週末など)
  • 計測日と投稿日の差
  • likes, dislikes, comment_countに関する四則演算, 二乗, log
  • categoryIdごとに視聴回数の平均, 分散, 四分位点などを算出(参考:@hirayuki)
  • channelIdごとに過去のlikes, dislikes, comment_count数を集計, 四則演算, 平均, 分散, 四分位点を算出 

特徴量(text)

  • CountVectorize、TfidfVectorizer, Universal Sentence Encoder でベクトル化したものをTruncatedSVDで7次元に圧縮
  • description, tags, title, channelTitleの単語数
  • ユニーク単語数, その割合
  • httpsの数
  • 日本語かどうかのフラグ(参考:@hirayuki)
  • 頻出単語をもとにそれが含まれているかのフラグ(Music, ted, twitter, アニメなど)
  • 学習済みの言語判定(pycld2)を使って何語かを判定

Universal Sentence Encoder + TruncatedSVDで7次元圧縮した特徴量がコンペ終盤のスコアの上昇(+0.06)に大きく貢献しました。

モデル

上記から算出した255の特徴量を用いて10foldのLightgbmを採用しました。

うまくいかなかったこと・できなかったこと

KaggleのAvito Demand Prediction Challengeのsolutionを参考に画像に関する特徴量を作って見ましたが効きませんでした。また、disableされたlike, dislikeの予測に取り組見ましたがこれもダメでした。しかし、上位陣はこれによりスコアを上げているみたいなのでもう少し丁寧に取り組めば良かったです。コンペ終盤にスコアが0.735→0.724と上昇したため他のモデルとのアンサンブルやスタッキングもできませんでした。

www.kaggle.com

最後に

今までテーブルデータのコンペしか出たことがありませんでしたが、内定者とチームを組むことによりNLPの前処理についてはかなり学ぶことができました。コンペ期間中にチームでZOOM飲みをしたりしコンペを通して交流ができたのは良かったです。順位もこれまでのコンペに比べると良い順位だったと思います。

 

以下は自然言語の前処理がナニモワカラナイ僕が参考にさせていただいたブログです。とてもわかりやすくまとめてあったので共有します。

pira-nino.hatenablog.com

qiita.com


 

岩波データサイエンスvol3, P37式展開に関するメモ

おうち時間で暇なので因果推論を勉強しようと思い岩波データサイエンスvol3を読んでいます。今日はP37の式展開で若干詰まったのでそれに関するメモ書きです。

詰まったところ

P37、XYの期待値をとって(3)を導出するところ。
(以下引用)

\displaystyle{
X = \beta_{X,Y}Z \\
Y= \beta_{X,Y}X + \beta_{Z,Y}Z  \tag{2}
}

のとき、Xと誤差\epsilonは独立であると仮定して、式(2)の最後の式(の誤差項 \epsilonを明示したもの)の両辺にXをかけると、

\displaystyle{
XY= \beta_{X,Y}X^2 + \beta_{Z,Y}XZ+X\epsilon  
}

となります。この式の両辺に期待値をとると、

\displaystyle{
cov(X,Y)= \beta_{X,Y}var(X) + \beta_{Z,Y}cov(X,Z)  \tag{3}
}

という式が得られます。

式変換メモ

使った公式は以下の4つ。

\displaystyle{
\begin{eqnarray}
E( \alpha X) &=& \alpha E(X) \\
E(X+Y) &=& E(X) + E(Y)\\
cov(X,Y)&=& E(XY) - E(X)E(Y) \\
Var(X) &=& E(X^2) - E(X)^2 \\
\end{eqnarray}
}

便宜上先にE(X)E(Y)を求めておく。

\displaystyle{
\begin{eqnarray}
E(X) &=& E(\beta_{Z,Y}Z) \\
 &=& \beta_{Z,Y}E(Z) \\
E(Y) &=& E( \beta_{X,Y}X + \beta_{Z,Y}Z) \\
 &=& \beta_{X,Y}E(X) + \beta_{Z,Y}E(Z)\\
 &=&  \beta_{X,Y}\beta_{Z,Y}E(Z) + \beta_{Z,Y}E(Z)
\end{eqnarray}
}

詰まったところの途中式

\displaystyle{
\begin{eqnarray}
E(XY)&=& E(\beta_{X,Y}X^2 + \beta_{Z,Y}XZ+X\epsilon)  \\
E(XY)&=& \beta_{X,Y}E(X^2) + \beta_{Z,Y}E(XZ)+E(X\epsilon)  \\
cov(X,Y) + E(X)E(Y)&=& \beta_{X,Y}\{Var(X) + E(X)^2\} + \beta_{Z,Y}\{cov(X,Z)+E(X)E(Z)\} \\
cov(X,Y)&=& \beta_{X,Y}Var(X) + \beta_{Z,Y}cov(X,Z) - E(X)E(Y) +  \beta_{X,Y}E(X)^2 + \beta_{Z,Y}E(X)E(Z) \\
cov(X,Y)&=& \beta_{X,Y}Var(X) + \beta_{Z,Y}cov(X,Z) - E(X)\{ E(Y) +  \beta_{X,Y}E(X) + \beta_{Z,Y}E(Z)\} \\
cov(X,Y)&=& \beta_{X,Y}Var(X) + \beta_{Z,Y}cov(X,Z) + E(X)\{ - \beta_{X,Y}\beta_{Z,Y}E(Z) - \beta_{Z,Y}E(Z) +  \beta_{X,Y}\beta_{Z,Y}E(Z) + \beta_{Z,Y}E(Z)\} \\
cov(X,Y)&=& \beta_{X,Y}Var(X) + \beta_{Z,Y}cov(X,Z)
\end{eqnarray}
}

無事に式(3)を導出できました。

最後に

式展開で詰まった以上にはてなに数式を書くことにハマりました・・・

7shi.hateblo.jp

6ヶ月間過ごしたインドでのデータサイエンスインターンを振り返る

タイトル通りインドでデータサイエンティストとしてインターンシップをしてきたのでその振り返りをしたいと思います。こういう経験をしている学生はかなりレアだと思うので、インターンの探し方も含め全てをここにまとめようと思います。

 はじめに

軽い自己紹介をします。岡山大学の大学院生で春からM2になりました。大学では生存時間解析を専門にやっていて、授業でも医学分野の統計手法を中心に勉強しています。インターンでは、MLエンジニアとしてミトラにて高齢者見守りシステムの開発に1年ほど携わったり、BEENOSにてECサイトにおける定着ユーザーの予測、楽天ではデータエンジニアとして新規プロジェクトのデータパイプラインの構築をしたりしてきました。経歴の詳細はこちらでご確認ください。

なぜインドのなのか

数あるインターンシップの中でインドを選んだわけですが、あえてインドにした理由は国としてのポテンシャルとその環境に魅力を感じたからです。

僕が初めてインドという国に興味を持ったのはこのニュースがきっかけです。

www.asahi.com

もともとメルカリには興味があったのですが、そのメルカリがインド人を大量に採用したと聞いて何か狙いがあるのではないかと思い「インド×IT」をテーマに情報収集を始めました。調べてみるとどうやら以下の背景からインドのITは注目されているみたいです。(もちろん諸説あると思います。)

・0を生み出した国、数学に強い
カーストや地理歴要因からオフショアとしてITが盛んだった過去がある
・インドならではの厳しく制約のある環境からリバースイノベーション生み出される
・スタートアップ大国
ネクストチャイナと呼ばれるほどインド市場は急成長している

アメリカのシリコンバレーインターンをすることも考えたのですが、国として成長している環境に飛び込みそれを肌で感じ取ることは貴重な経験なのではないかと考えました。

また自分自身がどのような環境に身を置けば成長できるのか考えました。自分の過去を振り返った結果「やらざるおえない厳しい環境に身を置くこと」が自分の成長に繋がるのではないかと仮説を立てました。(自分の過去のことは詳しくは述べませんが「チームの目標のためにセンター試験2ヶ月前まで部活を両立させた高校生活」や「特に目立たない選手だった僕が大学で部員100人のキャプテンをした経験」から上記の仮説を立てました。)具体的に「やらざるおえない厳しい環境」とはどういう環境か考えたときに、まず言語として日本語で助けてもらえるような環境は甘いと考えました。また、少数精鋭でインターン生ながらも主体的にやらなければいけない環境が最適だと思い、インド系のスタートアップでインターンをすることを決めました。

 

インターンシップの見つけ方

詳細は以下のnoteにまとめているので見てみてください。

note.com

ここでは簡潔にまとめます。インターンを見つけるために実際にしたアクションは以下の①~⑥です。

①海外インターン仲介業者を利用する
②Indiaサロンを活用する
Twitterを活用する
④企業に直接メールを送る
Twitterで現地にいる日本人にDMを送り、アドバイスを受ける
Facebookのコミュニティを活用する

僕がインターンを始めたのは2019年9月ですが、インターンを探し始めたのは2018年8月です。DMやメールを送った数は100通ほど。やりたいこと・身を置きたい環境が明確になっていたためインターン先を確約するまでにかなりの時間を要しました。この頃はインドの電話文化を知らなかったため、チャットベースでやりとりをしていてインド人から返信が来ないことで毎日悩んでいましたいろいろありましたが2019年6月頃正式な受け入れ書類を送ってくれたのがPurelogic Labsという企業になります。

 

会社の詳細

次は実際に僕がインターンをしたPurelogic Labsという企業を紹介します。

  • 創業は2018年のスタートアップ
  • 所在地はインド首都デリーの北西部Rohini
  • 社員数は10人前後
  • 大気汚染に関するビジネスをしている
  • 子会社は3つ
  • ①AQI India:大気汚染のリアルタイムモニタリングアプリを開発
  • ②Prana Air:大気汚染に関するデバイスを販売
  • ③中国の子会社:大気汚染に関するデバイスを製造

f:id:nori0724:20200404231125p:plain

AQI Indiaで開発しているアプリ

f:id:nori0724:20200404180019p:plain

Prana Air

この他に自社のデバイスを利用してMicrosoftインドのタクシー配車アプリのOlaと共同研究をしてたりしていました。

他の企業からもオファーはありましたが、僕がこの企業を選んだ理由は4つあります。

  1. 大気汚染に関するデータが過去数年分溜まっていること
  2. データはありアプリケーションエンジニアもいるが、データサイエンティストがいないこと
  3. 大学の研究室は空間統計学が専門でその知見が生かせられること
  4. 社長はインド人であるがアメリカの大学、中国の大学院を出ていてビジネスのアイディアが豊富にあったこと

上記のような環境では、

自分が持っている 統計学の知識を生かして、社長のアイディアをデータサイエンスの課題に落とし込んだり、データを元に自分から分析できることを提案したりできる!

こんな最高の環境はないのではないかと思い、日本人、データサイエンティストもいないインド系のスタートアップに飛び込むこととなりました。 

(もちろん現実こんな夢物語はなく、入社1週間前にデータベースの故障を知らされ使えるデータは0、入社してみるとエンジニアと称していた人はPMでコードは一切書いておらずエンジニアは全て外注でした...続く)

 

インターンでしたこと

インターンでしたことは大きくまとめると以下の4つです。

  • 課題のヒアリング
  • PM2.5の予測
  • クリギングを用いた空間補間
  • 時系列モデルのデプロイ 

 それでは1つずつ説明していきます。

 課題のヒアリング

インターン開始後はまず会社の課題を社長からヒアリングしデータサイエンスの課題に落とし込む作業をしました。会社の課題はいくつかあって

  • PM2.5の予測がしたい
  • 大気汚染を測定するIoT機器が湿度が高くなると精度が下がるのでAI()で補正したい
  •  自社のデバイスをホテルの客室内に設置しCO2濃度の変化に着目することで在室人数推定をしたい

などがありました。社長の話を聞く限り「AIなら何でもできるだろ」というノリで話していました。ホテルの在室推定は結構面白いと感じそれに取り組もうと思っていたのですが、よくよく聞いてみるとデータが1回試しに取ったものしかなく到底モデリングできる状況ではありませんでした。ここで発生した問題はなぜAIで解けないのか、どんなデータが、どのくらいあればAIがで解けるのかを非エンジニアの社長に英語で説明し説得させることでした。インド人の社長なので(?)自分のビジネスにはかなり自信を持っていました。そんなに英語がうまくない僕に取って英語で非エンジニアの社長に根拠を持って説明することはかなり難しかったです。簡単な例題や説明のスライドを作り何とか説得した結果、とりあえずPM2.5の予測に取り組むことにしました。

 PM2.5の予測

PM2.5の予測のために時系列モデルの作成に取り組もうとしたわけですが、先ほども書いたようにデータベースの故障のため自社のデータは0になっていました。社員に聞くと「新しくデータベースを1から構築しているから3ヶ月後には3ヶ月分データが溜まっている」とのことでした...。この辺りは本当にデータベースが壊れていたのか、そもそもデータがなかったのかは未だにわかっていません。データがあるからこの企業を選んだのでこの事実にはかなり絶望したのですが、時系列の理論を1から学ぶチャンスだとポジティブに捉えることにしました。時系列モデルの理論を勉強するにあたりTJOさんのブログには大変お世話になりました。またudemyのベイズ統計学のコースも視聴しました。

tjo.hatenablog.com

この期間でPython, R, stanを用いて時系列データの前処理、トレンド・季節性の抽出、自己相関の確認、ARIMA・状態空間モデル・LSTMの作成など時系列データの理論から実装までを一通りサクッとインプットすることができました。

理論を勉強したあとはPM2.5オープンデータを用いて時系列モデルの作成に取り組みました。事前知識で大気汚染のメカニズムとして、インドデリーの北側では野焼きが起きている→それが風によりデリー方面に流れてくる→山脈にぶつかることでデリー付近に貯まる。それが原因となり他の地域よりデリーではPM2.5mの値が高くなっているということがわかっていました。そのため特徴量として他のエリアの過去の大気汚染データや未来の風速・風向情報の活用を検討しました。

この時系列モデルを作成する上で課題となったことは2つあります。

  1. 何時間後まで予測をすればいいのか
  2. 評価指標はどのようにしたらよいか

まず1についてですが、社長の主張としては7日後まで予測をしたいとのことでした。これには特に大きい理由はなく他社が7日間予測をやっているからだと思います。もちろん7日間精度良くできればいいのですが、7日後までを正確にモデリングすることは僕にとっては不可能でした。実際、他社の予測結果を確認しても3日後までは精度が良さそうなのですがそれ以降の予測結果は平均を推移しているような様子でした。ここでPM2.5の予測をすることでユーザーは何が嬉しいのかを考えました。インドでは大気汚染がひどくなると息をするだけで不快になりマスクなしでは外を歩くことができません。特に、妊婦や乳幼児の健康に悪影響を与えます。また、洗濯物を干している場合は砂埃をかぶりせっかく洗ったものが汚れてしまいます。これらを考えると長期予測よりも短期的な予測で一日のうちの大気汚染のピークを知り、そのピークの時間帯を避けられるような行動をユーザーに促す方がユーザーにはメリットではないのかと考えました。上記のことからまずは短期的な予測で精度をあげることにフォーカスしました。

次に2について。データコンペなどではあらかじめ評価指標が与えられていますが、いざ自分で予測モデルを組むとなると自ら評価指標を決める必要がありました。回帰のタスクでは評価指標としてRMSEが標準的だと思いますが、精度を比較する基準がなくRMSEがどのくらい小さければ妥当なモデルと言えるのかを設定する必要がありました。そこで僕が用いたのは以下のカテゴリー表です。PM2.5は以下のような6階級で評価されます。1階級あたりの大きさは30であるためRMSEが30以内に収まればカテゴリーとしての予測はできているだろうと考えました。

f:id:nori0724:20200404232012p:plain

上記の検討をもとに、まずは24時間予測でRMSE<30のモデルを作ることにしました。実際に検討したモデルはARIMA、Prophet、状態空間モデル、LSTMです。データの種類(観測地点・季節)・特徴量・trainデータの期間・前処理の方法・パラメータなどを変化させながら泥臭く精度比較をしました。結果、一番RMSEが小さくなったモデルはRMSE=20ほどになりました。LSTMはもう少し勉強して良い特徴量を作れば精度が向上したかも知れませんが、それに時間を費やすよりは次のタスクに移った方が良いと考え予想タスクはひとまずここで終えました。

 クリギングを用いた空間補間

PM2.5の予測の次に取り組んだのはクリギングです。PM2.5の予測に取り組みつつも週に数時間は社長のもとでビジネスの構想を聞き、データサイエンスとして何かできないか何度もヒアリングを繰り返していました。ある時社長の口から出てきたのは大気汚染のデータを収集するIoTデバイスがない場所のPM2.5の値を知りたいということでした。以下は会社のwebアプリのmapなのですが、インド中にデバイスは408設置されていても地域によってはデバイスがないところがあることが課題でした。

f:id:nori0724:20200405000644p:plain

https://www.aqi.in/

これを聞いたときにふとゼミで習ったクリギングを思い出しました。クリギングを用いて空間補間をすればヒートマップのような滑らかな地図を作成することができ課題を解決できるのではないかと思い、自ら提案しこの課題に取り組むこととなりました。この時ちょうど1月の一時帰国のタイミングだったので、研究室に戻り教科書の必要なページをコピーしてインドに持ち帰り理論の勉強からはじめました。また、Rを用いたバリオグラム雲の作成や理論モデルのフィッティング、シェープファイルの処理の方法、Pythonでのクリギングの方法やfoliumを用いた可視化の方法を勉強しました。しかし、クリギングのモデルを作り緯度と経度を与えるとその場所のPM2.5の値を空間補間はできるようになったものの、以下のようにいい感じに地図上に重ね書きすることはできませんでした。

f:id:nori0724:20200405000453p:plain

https://breezometer.com/

他サイトも参考にしたのですがJavaScriptのd3.jsで書かれていたため諦め、インターン期間内にこの課題を解決することができませんでした。研究室に戻りいくらかアドバイスをもらおうと思います。

時系列モデルのデプロイ

クリギングの可視化を諦めたのが2月末くらいで、最後に取り組んだのが時系列モデルのデプロイです。エンジニアリングの経験はほぼなかったため正直ここが一番苦手意識を持っていました。しかし、頼る人はいないため基本的には自分で調べるしか方法はありませんでした。社員の人と話し合った結果、まずは毎日時系列モデルを走らせ予測結果をTwitterに吐きだすBotを作ろうということになりました。

会社のクラウドAWSを使用していたため、まずLambdaを用いてデプロイしcloudwatchで定期実行を試みました。しかし、外部モジュールを実行ファイルと一緒にzipファイルにまとめてアップロードするとことで転けました。調べてみるとzipファイルの容量が大きすぎるのが原因らしく、S3を経由したアップロードを試みました。しかしそれでもなぜかエラーが吐き出されLambdaの使用を諦めました。次にやったのがEC2上に環境構築をしてモデルをデプロイする方法です。ここではProphetのインストールで転けました。anacondaで環境構築をすると上手くいきました。最後はcronで定期実行を設定してモデルのデプロイが完成しました。今のところ不具合なく毎日10 am(IST)に時系列モデルが走り予測結果がツイートされています。

たった1地点でのモデルが動くようになっただけですが、社員の方が喜んでくれ嬉しかったのを覚えています。モデルのデプロイに成功したのが3/20で帰国日が3/22だったので本当にギリギリでした...笑 

最後は、モデルの詳細のドキュメント化、コードのコメントアウトも全て英語に置き換えインターンシップが終了となりました。

インターンのまとめ

以上が僕がインターンで経験した全てになります。

このインターンシップでの収穫は

  • 社長直下で働くことができたこと
  • 企業の課題をデータサイエンスの課題に落とし込むところを経験できたこと
  • 苦手意識があったモデルの設計・運用に挑戦できたこと

が挙げられます。今までのインターンだとモデルを作ってデプロイは他の人に任せたり、分析をした結果・考察をレポーティング&プレゼンで終わっていたのですが、モデルの設計・運用に挑戦できたことは良かったと思います。これは誰も頼る人がいない、自分がやるしかない環境に身をおいたからだと思います。また、データを用いた事業を立ち上げ形にしていく工程を純粋に楽しむことができ将来自分がなりたいデータサイエンティスト像を考えるきっかけとなりました。

一方で今後への課題も見つかりました。

  • 日常英会話ではなく、根拠を持って相手を納得させることができる英語力が必要
  • 自分が何となくで進めたモデルの構築・設計の正解を調べ、必要なスキルを身につけていくこと

 以上2点が挙げられます。まず英語力についてですが、いわゆるビジネスレベルでの英語力が必要だと感じました。6ヶ月間日本人のいない環境でインターンをしたり、インド中を一人で観光できたりはしたので適当に日常会話をするレベルの英語力は身についたと思います。しかし、相手を説得させる英語、そして専門用語をわかりやすく伝える英語はまだまだだと痛感しました。これらを解決するためにさっそく、スタディーサプリのビジネス英語を1日1時間毎日取り組んでいるので3ヶ月ほど継続してみたいと思います。また、統計関連の専門用語は英語の論文を読むときに意識的に覚えることとします。次に2点目についてですが、これは頼る人がいない環境に飛び込んだ弊害なのですが、本当ならばどのようにモデル作りアプリケーションに取り組んでいくのが正解だったのか未だにわかっていません。そのためモデル作りはDSの専門の方に、モデルの設計・運用はエンジニアの方にアドバイスを受ける必要があると感じています。また、このブログを読まれた皆様、何か些細なことでもいいのでアドバイスをしていただけると幸いです。

今回の6ヶ月のインターンでは一時点の予測で終わったので、今後は複数エリアの予測をアプリ上に実装すること、クリギング結果をmap上へ可視化することに取り組んでいくのが目標です。引き続きPurelogic Labsとはリモートで関わっていく予定です。

f:id:nori0724:20200405205922j:plain

インターン先の社員さんと

その他

インド系企業のあれこれ

おまけでインドの会社の勤務時間、お昼ご飯、オフィスついてまとめたいと思います。

まず就業時間についてですが、僕の会社は8時間労働で10時~18時(フレックスタイムなし)でした。しかし、実際に同僚のインド人が出社するのは10時30頃で、始業時間はかなりルーズでした。(ちなみに僕は最初は10時に出社していたのですが、ルーズな環境に慣れた結果、最終的には11時前後の出社になりました🤫)お昼ご飯の時間は14時から15時でかなり遅めな印象でした。休憩時間はほぼなく、ご飯が終わると皆デスクに戻るという感じでした。中にはタバコを吸いにいく人もいましたが、1時間も休んでいる人は0でした。終業時間については予想通りという感じで18時00でした。17時55分頃になると机を整理し始め、18時には帰宅できる状況ができていました。遅くとも5分以上居残りをしていると戸締りをするメイドさんに催促をされるほどでした。

次にお昼ご飯についてです。これは何度もツイートしたの既にご存知の方も多いかもしれませんが、僕の会社の場合毎日会社負担でカレーをオーダーしてみんなでシェアして食べていました。実際に食べていたのがこちらです。。。笑

f:id:nori0724:20200405032933j:plain

どうでしょうか?笑

ナンが出たときやカレー+ライスの時はかなり美味しかったです。しかし、3行3列にあるコリアンダー大量に含んでるやつは無理でした、コリアンダーが嫌いなので。また、5行3列にあるパリパリのやつはかなり辛いです。あと6行2列, 3列にあるようなチャパティ2枚の日は結構辛かったです。このような食生活を6ヶ月続けた結果体重を4キロほど減らすことに成功しました。

オフィスは予想していたよりも綺麗でビリヤード台などもありました。僕は贅沢にもデュアルディスプレイで開発できたり、就活時は個室のミーティングルームを使えたりと充実した環境でインターン生活を過ごすことができました。

f:id:nori0724:20200405192441p:plain

ビリヤードしてるインド人

 meetupについて

最後にmeetupについてお話しします。meetupとはIT関連の勉強会のことでインドでは毎週この勉強会が行われています。僕はインドの首都デリーに住んでいたのですが、以下のような勉強会に参加しました。 

Developing AI Solution Mindset & Intro to Meta Heuristics and it’s Applications
CellStrat AI Lab-Coding Hours - Machine Learning, Deep Learning & more (Gurgaon)
Demystifying Expedia ML/AI Ecosystem & UX Practices for Designing AI Application
PyData Delhi Meetup #35
Google Cloud Community Day
Explainable AI (XAI) Day at ODSC Delhi
GDG Cloud New Delhi x Elastic: Data on Google Cloud Platform

 

PyDataやODSCのようにDS関連のコミュニティーが主催のmeetupとGoogleなど企業主催のものがありました。内容は入門的な内容から専門的な内容まで様々でした。meetupの時間は朝から夕方まで1日かけて行うものが多く、LTだけでなくGoogleColabでコードを共有しハンズオン形式のものが多かったです。また、これらのmeetupに積極的に参加する層は一定数しかいないため、どのmeetupに行ってもほぼ同じ顔ぶれでした。しかもmeetupでは日本人が0で僕しかいないため、僕の名前は多くの人が覚えてくれました。インドにおける日本人がいないというマイノリティな環境はかなりメリットだと思っていて、meetupで会う人全員が「何でインドに来たんだ」とか「何が専門なのか」と日本人の僕に興味を持って聞きに来てくれたました。そのおかげでGoogleやMcKinsey、American Expressなど有名企業のデータサイエンティストと簡単に繋がることができました。帰国前最後に参加したmeetupではインターンの総括を英語でプレゼンする機会ももらえました。

f:id:nori0724:20200405201730p:plain

インド人に紛れる日本人

f:id:nori0724:20200405202056p:plain

英語でスピーチしている様子

有名企業の方との出会いだけでなく、熱狂的なインドのエンジニア学生に出会えたこともこのインド生活の収穫の一つです。僕が出会った学生たちは技術力の高さは日本の学生と同じくらいでしたが、エンジニアとして人生を変えてやるという熱い思いをひしひしと感じました。世界に向けて英語で技術ブログを書いたりLinkedinで積極的に情報発信している学生と出会えたのは、将来グローバルに働きたい僕にとって最高のモチベーションとなりました。帰国後の現在も引き続き彼らとは連絡を取り合っているので、今後もお互いに高め合っていきたいと思います。

f:id:nori0724:20200405203253p:plain

meetupで出会った学生たち

以上1万字近く書きましたが僕が6ヶ月間過ごしたインドでのデータサイエンスインターンの全てになります。インドでの生活についてはまた時間があるときにまとめたいと思います。

 

最後まで読んでいただきありがとうございました。