はじめに
今回初めてqiittaを触るということで、文系大学生だった自分がありがたいことにデータサイエンティストとして働けるようになるまでにしてきたことをまとめてみました。
執筆目的としては、今後qiitaを書いていくにあたっての動作確認という属性が強いのでご了承いただけると幸いです。
0-1 全体の流れ
- 自分自身について
- コンペ出場初期
- 勉強開始から2ヶ月で成果を出しに行ったSonyコンペ
- インターンの応募きっかけと聞かれたこと
0-2 こんな人に読んでほしい!
- 文系の就活が肌に合わない...?学生の方
- デジタルに強くなりたいけど、何から始めていいのかわからない学生、社会人の方
- データサイエンスってなに?どうやって勉強するの? って感じで興味を持っている方
1-1 自分自身について
そもそも、東大医学部の神脳のような人がパパッと勉強してデータサイエンティストになった、と聞いても全く参考にならないと思うので、参考までに自分の属性を笑
- 地方公立高校出身 / 文系大 / 経済学部 / 高校までは野球部, 大学では国際交流
- 数学 - > 確率密度関数って言葉がぎりわかるくらい、線形代数、微積は高校レベル
- プログラミング - > 一切したことがない
だったので、大半の人とスタートラインは同じかと思います。
英語だけちょっとできました。1, 2ヶ月ほど経った頃から、エラーを解決できるドキュメントが基本英語で書かれていることに気づき始めたのですが、うざいけど読める、くらいの感覚でした。
以上が僕のスタートラインです。
1-2 データサイエンスの勉強を始めたきっかけ
きっかけだけ言うと、暇だった時に友人から勧められたことです笑
3年生の2月に、所属していた団体もひと段落つき、就活もそこまで追い込まれていなかった自分は、ある程度時間がありました。
そこで、暇ならやってみね?って言われ、始めてみました笑
まあ、流石にちょっと真面目な理由もあり、それは、あまりにも就活での評価が曖昧だったことです。
一方データサイエンスなど、エンジニアに近い職種では、これまでの成果物をポートフォリオとして提出し、それに基づいて採用や待遇が決まるということは知っていて、こっちの方が自分にはあっているんじゃないのか、という思いもあり、ある程度続けてみようと思いました。
2-1 コンペ出場初期
最初に着手したのは、コンペに出場してみることです。
pythonの細かい文法から学ぶより、一回コンペに出てみて、何がゴールなのかわかることが自分にとっては一番いいと考えたためです。
具体的に下記フローで勉強を進めました
学習フロー
- youtubeを見ながらkaggleのtitanicを1サブしてみる
- nishikaのマンションコンペ(常時開催)に出場
- とはいえ何もわかんないから、適宜本を参照
結果としては、最初のコンペでは運営が公開しているベースラインにすら勝てずかなり悔しかったことを記憶しています。
勉強法
①最初はとにかく続けることが大事
最初はとにかく続くことが大事です。全くのプログラミング初心者が、print('hello world')でhello worldが出力されると嬉しいものです。
なので、最初は無理に自分の力でコーディングしようとせず、titanicなどのコンペの解説動画を写経するくらいがちょうどいいと思います。
動画を写経するだけだと、あ!動いた!から始まり、1h後には予測まで実装できました。
あんなに難しいと思っていたプログラミングが、こんなにも簡単なんだ!楽しい!って感覚をしっかりと味わうことができれば、ある程度続けていけると思います。
プラスで、最初は絶対google colabを使うことをお勧めします。
初心者が下手に勉強して環境構築とかしようとすると、うまくいかず萎えて勉強をやめちゃうので、実務でクラウド上でコード操作をすることが好ましくない、などの状態になるまではcolabを使用することを強くお勧めします。
(実際に僕はGCPを使おうとして一切使い方がわからず、1週間を無駄にしました笑)
②とにかくアウトプットを増やす
とにかくコードを写経し、アウトプットすることを意識していました。
特に、東京大学のデータサイエンティスト育成講座に関しては、載っているすべてのコードを写経し、それで初めて、なんとなくコンペの全体像が掴めた気がしました。
今でも全くわからないものに関しては写経をすることが多いのですが、やってるうちに不思議と何をやっているのか理解できるようになります(人間の脳って不思議ですね)。
興味を持って始められた方は、騙されたと思って、1ヶ月ほどコードと向き合ってみてください。1ヶ月立ったら本当に不思議なのですがなんかわかるようになってます笑
③メンターを見つける!
ある程度続いてきたら、次はなるべく早くなるべく多くのことを頭の中に叩き込むフェーズになります。
正直独学で自分だけで勉強するのには限界があります。特に最初のフェーズだと何でエラーが出ているのかがまるでわかりません。
そのため、効率よく勉強するためにうまいことご飯とかを奢って師匠を見つけるなり、有料サービスでメンターを見つけるなり、相談に乗ってくれる人をまじで見つける必要があります。それだけで本当に学習スピードが異なります。
僕は運のいいことに友人が機械学習に詳しく、飯奢る!といえば基本的に1h程度であれば相談に乗ってくれました。
数時間悩んでエラー解決しないよりは、1時間バイトして1000円のランチ奢る方が割と効率的だと思いますので、うまいことメンターを見つけていくのが大事だと思います。
3-1 結果を出しに行ったコンペについて
僕が機械学習の勉強を始めたのが、2022年の2月で、本気で結果を出しに行ったコンペが4月に開催されたものでした。詳細はこちら。
そのため、勉強してから2ヶ月が立った頃のコンペですね。
それまでは、上述の通り
最初の1ヶ月 : python触ってみる、コンペ出てみる
次の1ヶ月 : nishikaのベースラインに勝てず苦しむ
といった時間の使い方でした。
頑張ろうと思ったきっかけ
- データがすべて数値データで、かつ欠損値(データの不備)がなく、初心者が取り組みやすいデータセットだった
- データの重さが数十MBくらいで、同じく初心者にとって取り組みやすいデータセットだった
- 先輩も出ていてシンプルに勝ちたかった笑
が理由で出場しました。
特に初心者の方は、コンペを頑張ろうと思ったら上二つはかなり真剣にみた方がいいと思います。
特に最近のkaggleは数十GBのデータセットで、かつ数値データではなく画像や自然言語のコンペが多く、こちらは初心者にとってはかなり取り組みにくいコンペとなっています。
コンペの取り組み方
本コンペでは、まずは一通りデータ分析の流れを自力で実装することを意識していました。
特に、Kaggleで勝つデータ分析の技術については肌身離さず勉強しており、なんなら枕にして寝てたくらい一緒に時間を過ごしていたと思います笑笑
コンペの前半で下記の実装を、kaggle本でなんとか実装しました。
- 基本的な特徴量エンジニアリング
- カテゴリ変数のlabel encoding, one hot encoding
- 外部データの追加
- 交互作用特徴量の作成などなど
- lgbモデルの実装
- 適切なバリデーションの取り方
- Group KFoldの実装
- ハイパーパラメータの調整
- アンサンブル
- 単純な加重平均
- スタッキング
後半にかけては、いろいろ思いつくアイデアを実装していきつつ、モデルを過学習させて多様な予測結果を返すモデルを作りまくって、アンサンブルしまくってスコアをあげるという超絶脳筋なこともしていました笑
最終的には下記コードで108位 / 大体800人の成績でした。
signate pm2.5 competition 108th place solution
4-1 インターンを応募したきっかけ
当時並行してGCIにも参加していたのですが、そちらの方でコンペで入賞ができず、松尾研でのインターンルートが厳しそうだなと感じ、ちょうどコンペの結果が出た6月のタイミングでインターンを探し始めました。
応募に必要なのは基本的に、志望動機(おそらく期待値調整に必要)+これまでの実績、開発経験でした。
面接でも聞かれたのは主にコンペでどういったことを工夫したか、や今後直していくならどういったことか、などといった技術的な側面と、任せるとしたらこういったプロジェクトだが志望動機を踏まえて、期待値に相違はないか?などといったことでした。
ありがたいことに、そのタイミングで僕を拾ってくれた会社があり、今でも楽しくインターンを続けています。採用理由を聞いた今でも、正直何で受かったのかはわからないので最後は運だと思います笑
データ分析の専門性以外に関してはある程度下地があった(スライド作成や、レスの速さなど、基本的な仕事感覚)ので、採用さえされれば結果はある程度出せる自信があり、自己ブランディングとしては、死ぬ気で結果を出します!ここで働かせてください!みたいな感じだった気がします笑
4-2 最後に
拙い文章にお付き合いいただきありがとうございました。
自分の行動を振り返るとともに、qiitaの使い方も学べていい機会でした。
かなり脳筋な勉強法だった自覚はあるため、どこまでみなさんの参考になるかは分かりませんが、読んでくださった方々の良きDSライフを心から願って文を閉じたいと思います。
お互い頑張っていきましょう。