yuki-uchidaの雑思考

Webエンジニアとして学んだことを記事にしてます

副業データサイエンティストが5年間で読んだ本

この記事について

バックグラウンド

本業はTypeScriptを主に書いているWebエンジニアで社会人5年目。副業ではデータサイエンティスト/機械学習エンジニアをやっていてこちらも5年目。

この記事を書いた理由

最近読んだ「科学的根拠に基づく最高の勉強法」という本の中に、「思い出す頻度が高ければ高いほど定着する」という話があった。 なので、読んだ本の内容を思い出し定着させるきっかけとするためにこの記事を書いている。

紹介する本のラインナップについて

統計や機械学習の理論をガチガチにするのは難しいと判断して、理論寄りの書籍は非常に少ない。PRML機械学習プロフェッショナルシリーズなどの本についても、読んだ本もあるが、最近はほとんど諦めて読んでいない。

なので、紹介する本を読んだら優秀なデータサイエンティスト/機械学習エンジニアになれるというわけではないので注意してほしい。あくまで自分が副業でデータ分析案件に関わっている中で、必要な知識を得ていったらこのようなラインナップになった。 (PRMLやら機械学習プロフェッショナルシリーズは業務から遠いがジワジワと効いてくるタイプの本なので、読みたいとは思っているが、今後のキャリアを考えたときにここに投資するべき悩んで動けていない)

また、そこまで印象に残っていなかったり、エンジニアリング全般の書籍、プロダクトデザイン・マネジメント的な本は除外している。

読んだ本

Pythonで始める機械学習

この本は、学生の頃に読んでいた本で、機械学習系の本で一番ヨレヨレになっている。

当時はscikit-learnが鬼門で扱いが難しいなと感じていた。今ではデータの型とか一次ドキュメント読んでエラーの理由が理解できるようになったが、昔はそうではなくて、この本を進める中でもエラーにめちゃくちゃ悩まされた。しかし説明している内容は非常に良く纏まっていたと思う。 自然言語処理でよく使うBag-of-wordsについては「プログラミングで文章を処理するときはこうやって文字のまとまりを作るのか」と非常に興味深かった。

この次の書籍の「達人データサイエンティストによる理論と実装」と似たような内容なのでどちらかでもよいが、複数冊あると「重なるトピックは重要」だとわかるので、そういった意味でも複数冊勉強した。定着にもなってよかった。

達人データサイエンティストによる理論と実装

この本は、大学生の頃から新卒一年目くらいの間に読んだはず(その時は第二版だった)。この記事を書くために5年ぶりくらいに開いたが、絶対に必要な知識が纏まっているなと感じたので、機械学習の入門したい人にはお勧め。

ロジスティック回帰やサポートベクトルマシン(SVM)、決定木などの非常に有名で強力なアルゴリズムを学ぶのに非常に役になった。また。データの前処理(欠損値処理・カテゴリカルデータの処理)やパラメータチューニング、アンサンブル学習など、今でも前提知識として必要な内容だと思うので、入門としては非常に良かったと思う。

Tensorflowを使って畳み込みニューラルネットワーク(CNN)やリカレントニューラルネットワークを動かすチュートリアルもあり、深層学習入門としても有効だった。

詳解ディープラーニング / つくりながら学ぶ!PyTorchによる発展ディープラーニング

「詳解ディープラーニング」も、大学生の頃から新卒一年目くらいの間に読んだはず(その時は第一版だった)。学生の頃はこの本が非常にわかりやすくて重宝していたのを覚えている。 この本でKerasを学んで卒論を書いたし、インターン中にも何度も読み返した。最近ではKerasではなくPyTorchが普及していると思うが、第二版ではPyTorchも採用されていてそこは安心して良さそうだ。ただし、第二版も2019年出版なので、情報としてはかなり古いかもしれない。

深層学習で必要な線形代数に関する内容も軽く含まれていて、ニューラルネットワークから始まり、ディープニューラルネットワークに進む。 学習の効率化のためのドロップアウトや学習率の探索、Early StoppingやBatch Normalizationなどによって深層学習モデルの精度が上がっていくのが非常に面白かった。

また、当時はとしてはかなり応用的な話題だった「Attension」や「Encoder-Decoder」についても踏み込んでいて、入門から応用までカバーしていたので、当時は「今後どうやって勉強していけばよいのか」を考えるうえでもかなり解像度を高くしてくれた書籍だった。

この書籍は既に情報が古くなっていそうなので、今だとこちらの書籍のほうが良いかも。 残念なら自分は最後まで読み切れていないが、「OpenPoseによる姿勢推定」「GANによる画像生成」「Transformerによる感情分析」など、面白いユースケースごとに章が分かれていて、少なくとも読んだ範囲では良書っぽかった。解説もかなりわかりやすい。

データビジュアライゼーションの基礎

この本は、「データの見せ方・伝え方」を学べる本で、一度は読んでおいた方が良いなと思って読み始めた本。

データ分析関連の仕事をやる上で、「適切な可視化方法を扱える」ことは大きな強みになる。 機械学習エンジニアの場合は、精度改善をするためだったり、データの特性を理解するために様々なアプローチで可視化する必要があるし、データサイエンティストの場合は、ユーザー情報やらビジネス的な数値をを可視化して他人に見せる必要が出てくる。

グラフにも非常に多くの種類があり、棒グラフ・円グラフやヒストグラム、散布図以外の可視化も沢山行うことになる。箱ひげ図・バイオリンプロット・エラーバー・ツリーマップ・パラレルセットなど、飛び道具的な可視化方法も知っておくとかなり役立つ。これらは知っておけばパッと出てくるが、知らないと知っている可視化手法をこねくり回して時間をかけてしまうからだ。

「データ分析では必携!」というほどではないが、手元に置いてあるとたまーに仕事が数時間短縮できるかも。

Kaggleで勝つデータ分析の技術

機械学習をやる上では特徴エンジニアリングや評価指標・パラメータチューニングに関する書籍は持っておいた方が良い。 この本は2019年出版なので、もしかしたらもっと良い本があるかもしれないが、当時はほとんどKaggleの本がなかったので重宝した。

出版当時と今を比較しても、LightGBMやxgboost, CatBoostなどのライブラリで使えるGradient Boosting Decesion Tree(GDBT)が強いままなので、Kaggleで必要な知識が昔とは違うわけではなさそう(Kagglerじゃなくて、Kaggleのソリューションを参考にするくらいの人間だが、多分そう)。であればこの本の価値は今でも十分あると思う。

ところで、データ分析コンペの知識が昔と比べて大きく変わってるわけじゃない(2019年前後で流行ってたアルゴリズムを使っても勝負になる)のを考えると、競技プログラミングみたいに一分野として固まってきたのかなぁという気がしている。昔は「Auto MLとかが出てきて全部やってくれるようになるの?」とか思っていたが、今のところはそうではなさそうだ。

機械学習のための特徴量エンジニアリング

機械学習の精度を上げるためのテクニックが纏まっている本。非常に薄いので読み物としても軽く楽しめた。

自然言語処理では文章の中で重要な単語の重みと高めるためにTF-IDFという技術を使ったり、ストップワードを定義して無駄な単語を除去することがある。こういった自然言語処理での細かいアプローチだったり、カテゴリ変数のエンコーディング方法、次元削減の方法など、特徴量をいい感じにする手法が多く載っている。

個人的に推薦システムが好きなので、協調フィルタリングに関する情報が載っていて面白かった。この本読んでから映画の推薦機能とか試したりした覚えがある。

今となってはここまで細かい手法を書籍で学ぶ必要があるかは怪しいところ。当時はあまりここまで細かい特徴量エンジニアリング手法に踏み込んだ書籍はなかったのでとても良い本だったと思うが、今では新たな特徴量エンジニアリングの書籍も出ているようなので、そちらを検討してもよいかも。

AIアルゴリズムマーケティング

この本は推薦システムの勉強をしていた時に読んだ。あまり期待せずに読んだのだが、実際にはめちゃくちゃ面白かった。

Spotifyのレコメンデーション機能に感動して、漠然と推薦システムが好きだったが、この本の「レコメンデーションサービスのカギとなるビジネス目標として適合率だけではなく、ユーザーからの目新しさや意外性、多様性も考慮する必要がある」という記載をみて「そうそう、意外性とか多様性が考慮されてるレコメンドは面白いんだよ」と気づくことができた。 この本を読んでから、RecSysという推薦システムのトップカンファレンスの論文読んだり、論文読み会に参加したりしたので、レコメンデーション機能の面白さを教えてくれた本だと思っている。

推薦システムのサンプルコードが書いてあるわけではないので、実際に手を動かしたい人にはお勧めしない。次に紹介する「推薦システム実践入門」が良いだろう。

推薦システム実践入門

ずっと待ってた、もっと早く出てほしかった、推薦システムの入門ができるサンプルコード付きの書籍。

推薦システムを実現するためのモデル作成方法や、精度の評価方法が書かれていて、この本があればなんとかそれっぽい推薦システムを作ることができる。 深層学習が流行るまでは、推薦システムは協調フィルタリングが一般的で、コンテンツの情報を利用せず、「ユーザー属性が似ている人が好んでいるものを推薦する」仕組みが多かった(はず)。 しかし、最近はコンテンツ情報も含めて推薦システムを組んでいることも多いようだ。Spotifyも昔は協調フィルタリングで、ユーザー属性ベースの推薦をしていたが、ハイブリッドになったそうだ。

学生の頃に以下の記事を読んで、「なぜSpotifyの推薦システムが素晴らしいのか」がわかって感動した覚えがあるので非常に思い出深い。(Spotifyは音楽を好きにさせてくれたサービスで大好きだ) www.forbes.com

この本は協調フィルタリングだけではなくコンテンツベースの推薦機能についても記載されていたり、普通の機械学習モデルの評価には使わない推薦システム専用の評価方法であるMean Reciprocal Rankやnormalized Discounted Cumulative Gainなどもきちんと書かれていてとてもよい。

話は変わるが、推薦システムは人間が「その推薦を良いと感じたか」がベースとなっていて、結構「感情的」な世界だと思っている。

例えば、推薦結果に「なぜあなたにこの商品が合うのか」という文章を付与すると購入率が大きく向上するらしい。これは、人間が「その理由はともかくなんとなく納得できる」「自分のことを理解してくれているという感覚」が大きいと思う。これが自分の中では推薦システムの面白いところだなぁと思っているので、心理学的なアプローチで実装されている推薦システムがあったら面白いなーと。

A/Bテスト実践ガイド

通称カバ本。僕はあまり知らなかったが有名っぽい。 とある会社で推薦システムのA/Bテストやったときに読んだが、入門から実践までカバーしていて、A/Bテスト始めてやるなら絶対に読んだ方が良いなと思った本。

A/Bテストをどうやって開始して結果を分析すると良いのかがわかる。A/Bテストで初心者がよくハマる分析の罠とか、分析で必要な統計知識などが纏まっている。 最近はA/Bテストをやっていないので内容について忘れてきているが、また必要になったら必ず読み直すと思う。

実践的データ基盤への処方箋

所謂データ基盤を作る立場のエンジニアにお勧めしたい本。 機械学習やデータ分析をするのが普通になってきた昨今では、大量のデータを格納し、整理されたデータ基盤を構築しなければならない。格納されるデータも音声だったり画像だったりcsvだったりテキストだったりと、非常に多様だ。

データ基盤の以降は簡単にはできないので、膨れ上がるユースケースに対応するためには事前に綿密に検討されたデータ基盤が必要となる。

僕はそこまで大きなデータ基盤を作ったことがないので、この本で書かれていることの10%~20%くらいしか身についていないと思うが、データ基盤構築の上でどんな役割が必要がかとか、デザインパターンとかは軽く読んでおくだけでも脳内インデックスができてよいと思う。

その他に読んだ本

上記で挙げた以外にも、PythonSQL(Database)周りの本は結構読んだ。データを扱うエンジニアはPythonSQL(DB)からは逃れられないから読むしかない。

SQL系はミックさんの本をたくさん読んだり、DBスペシャリスト試験の勉強したりした。

Pythonに関する本ではロバストPythonが良かった。Pythonは動的型付けなこともあり、雑に書くと頑健なコードにならないので、mypyなどを使って型推論ができるようにしたくなる。型に詳しくない人は手元に置いておいて、たまに読み返すと価値がありそうだ。

ここまで読んだ本を列挙してみて「あれ?もっと読んでたはず・・・」と思ったのでもう一回部屋を見回してみたら、組織の本とかプロダクトマネジメントの本の方が多いことに気づいた。データサイエンティスト(というかデータアナリスト?)はビジネス指標をベースにビジネスチームと話をすることが多いのでビジネス方面の知識(もしくはコミュニケーション能力)が必要だったのかもしれない。

「きょうのはてなブログ」機能が面白い

一昨日書いた ↓の記事のアクセス数がかなり伸びていたので少し調べてみると、「きょうのはてなブログ」に選ばれていたようだ。 yuki-uchida.hatenablog.jp

きょうのはてなブログとは

調べてみると、「きょうのはてなブログ」ははてなブログ編集部が手動で探して特集を組んでいるらしい。 僕の記事も、X(Twitter)以外で告知しておらず、特集に選ばれるまでは20PV程度しかなかった。なので、この「きょうのはてなブログ」に選ばれるのにPV数は関係ないようだ。 正直なところ、「毎日大量の記事が出るのによく見つけたな・・・」という気持ち。

詳しくは下記記事参照。 blog.hatenablog.com

きょうのはてなブログに選ばれると

きょうのはてなブログに選ばれると、はてなブログTOPページに表示されるため、多くの人に見てもらえる。特集に載るまでは20PV/日だったが、特集された日は200PV/日来た。スターも貰える。嬉しい。嬉しくなってこの記事も書いているので、書き手のモチベーションを上げる効果もあるらしい。

また、普段見てくれる人とは違う層にも見て貰える。僕のSNSはエンジニアとしか繋がっていないので宣伝してもエンジニアしか見に来ないが、選ばれたきっかけでエンジニアじゃない人達にも見て貰えた。元々は技術系の記事ばかり書くつもりだったので、技術系以外の記事も書こうかなという気になっている。こちらも書き手のモチベーションを上げる効果がある。

以下の画像は「きょうのはてなブログ」に選ばれた記念で撮ったスクショ。 編集部がリード文的な物をつけてくれるので、ちゃんと読んで内容を分かった上で選んでくれているらしい。

きょうのはてなブログに選ばれた記念

所感

ブログプラットフォームとして、「編集部がちゃんと読んで発掘してくれる」機能というのは意外と珍しいんじゃないかなと思った。大体のプラットフォームは、アルゴリズムによってホットな記事を見つけたりはしてくれるが、一つ一つ読んで推してくれることはあまりしない(あっても人手かどうか分からない)。 人手でこれを実現するのはコストが掛かるのでやらないのが普通だと思うが、はてなブログ編集部は強い気持ちを持ってこの特集を組んでいる。

サービス運営の間では、時間が経つと競合が大体似通った機能を実装してきて、差別化が難しくなってくる。その上で「ユニークさ」のようなものが感じられるとサービスを好きになりやすい。(そんなに簡単に差別化できたら苦労しないが、ちゃんと差別化できているのは凄い)

記事執筆のモチベーションを維持するために「人の役に立つ」ことを諦める

2024年は、「技術発信を頑張る」というのを目標にしている。 この目標は1月に設定して、既に3か月が経過しているが、今のところ上手くいっていない。

書いた記事はまだ二つだけで、この記事を書くにもかなり苦労した。

zenn.dev zenn.dev

目標を設定したときはモチベーションに満ち溢れていたが、記事を書こうとしたときには既にモチベーションの低下が始まっていて、一週間くらいかけて”頑張って”記事を書いた。 なんで「モチベーションが下がっているんだろう」というのを考えて、自分なりに理由が見つかったのでまとめておく。

モチベーションを低下させる要因

一つ目は、「記事を執筆して出すまでのリードタイムが長くなるとモチベが低下する」という点。

以下の記事に以下の記載があった。

私が記事を書くときはネタの賞味期限を意識しています。 これは読み手が考える賞味期限ではなく、書き手である執筆者のブログを書くモチベーションが切れる賞味期限です。 例えばプロジェクトをネタにしようとしたときに、リリースして半年以上経ってしまうとそのプロジェクトの内容や苦労した点などブログに書いた方が面白そうなところを結構忘れてしまいます。結果としてブログを書くモチベーションも下がりお蔵入りとなることもあります。 tech.yappli.io

これは非常に共感できるところがあって、自分の感覚では「記事を書き始めてから出すまでの賞味期限は3日」だと感じる。 仕事が忙しかったり、プライベートの予定が詰まっていたりすると、どうしても「来週は暇だから来週書こう」と思ってしまうが、一週間後には記事を書こうと思った当時の気持ちは忘れてしまっていて、どうでもよくなってしまっていることが多い。


二つ目は、「読む側の気持ちを意識しすぎてしまう」という点。

技術系の記事を書く時には、読みやすいように前提知識を丁寧に書いたり、読み手が得られる知見をわかりやすくしたりすることを意識していたが、最近は「書き手のモチベーションという観点では読み手を意識しすぎるのもよくない」と考えるようになってきている。 技術系の記事を書く時のモチベーションとして、「新たな知識を得たのでそれをアウトプットすることで整理したい」「同じような立場の人が同じ問題に陥らないようにしたい」というモチベーションで書くことが多いが、「出来るだけ多くの人が」「前提知識含めて技術を理解できるように」記事を書いてしまうと、本来書き手が書きたい本質から遠ざかってしまう。

自分が書きたいことにフォーカスした記事を執筆するためには、知識レベルは自分と同じくらいであることを前提にする必要がある。多くの人に見てもらえなくなる可能性はあるものの、それでも刺さる人には刺さるし、記事もコンパクトになるので執筆しやすい。

記事執筆のモチベを維持するために

最近は以下のことを意識して記事を執筆している。

  • 勢いに任せて数日で公開まで行う
  • 自分のために記事を書く
    • QiitaやZenn等の、ほかの人の役に立つためのプラットフォームは利用しない

この記事も、書き始めてから1時間掛からないくらいで公開まで行っている。このくらい軽い気持ちで記事を出せるのであれば、続けられそうな実感がある。 また、「他の人の役に立つ」事を諦めて「自分のために書く」ということを意識すると、文章の推敲や説明の付け足しが不要になるので、「自分が書きたいこと」だけに集中できる。はてなブログに書いていることもこれが理由で、QiitaやZenn等に記事を出そうとすると、「自分のために書く」のがやりづらくなる。

記事の質としては落ちてしまうかもしれないが、はてなブログに書いておいた断片的な情報を整理しなおして「他の人の役に立つ」記事に再編成することも可能なので、「他の人の役に立ちたい」というモチベーションが湧いてきたときにそれ用の記事を書けばよさそうだ。

僕はエンジニア5年目だが、「それ公式ドキュメントに書いてあるやん」「もう既に誰か書いてるでしょ」という感覚もあって、記事を書くモチベーションが下がることがある。 脱初心者したくらいのエンジニアは、似たような悩みを抱えている気がするので、「自分のために記事を書く」というのをお勧めしたい。

外でクリエイティブなことがしたい

はてなブログ今週のお題「外でしたいこと」について考えてみる。

子供のころから漫画やゲームが大好きだったこともあって、「創作」というものになんとなく憧れがある。

特にストーリーの綺麗さや綿密さが際立っている作品が好きで、所謂「伏線が多い作品」が好きだ。 伏線が多い作品が好きになった理由は恐らく小学生くらいの頃に触れていた漫画やゲームの中に、ストーリーが良い作品が多かったからだと思う。 漫画だとポケットモンスタースペシャル魔人探偵脳噛ネウロ、ゲームだとFinal Fantasy7, 10や空の軌跡シリーズが特に好みだった。

なので、大学生の頃はゲームエンジニアになろうと思っていたが、インターンシップとかを通して給料の低さや、エンジニアではなく脚本家に憧れがあった(そして脚本家としてのスキルはなかった)ことも含めて、ゲーム業界に入るのは諦めた。

人生的な余裕が出てきた今となっては、昔諦めたこともちょっとずつ手を出してみるのも良いかなぁと思っている。 今はエンジニアをやっているが、クリエイティビティというよりかはロジカルに答えを出すような仕事ばかりしているので、全く異なる面白さがありそうだ。(自分の適性としては自分の個性とかユニークさには自信がないので、良いものができるとは思わないが)

海とか川が見えるような落ち着いた環境で、中学生の頃やってた創作漫画の続きを考えて見るのも面白いかもしれない。

思考の言語化を習慣にするためにブログを始める

社会人5年目

2024年4月に、社会人5年目になった。

 

5年間DevOpsエンジニアとしての仕事をしている傍ら、副業でプログラミングスクールのメンターやったりライターやったり機械学習エンジニア/データサイエンティストやったりMLOpsエンジニアと色々な経験をする事が出来た。

本業での仕事は非常に快適で、プライベートの時間を使ってチャレンジする精神的な余裕を持てて感謝している。

 

副業を含めると仕事の時間は長いけど、金銭的な余裕もあるし、人間関係の問題もない。本業はフレックスなので、途中で仕事を抜けて温泉に行ったり散歩に行ったりもできる。

学生の頃に憧れていた、「朝早く起きてジムに行って、シャワー浴びた後にコーヒーを淹れて仕事を始める。夜は友達と飲みに行ったり副業でお金を稼ぐ」みたいなキラキラした生活も全く不可能じゃなくなった。(実際には早起きが苦手なのでほぼ実現できていない)

 

学生の頃は将来に不安を持つことも多かったが、今は全くそんなことはなく、後は「如何に自分が生活の質を上げられるか」だけを考えれば良い状況にできたので社会人としての最初の5年には満足している。関わって下さった方々には感謝を伝えたい。

 

仕事の成果を振り返って

本業は5年間DevOpsエンジニアをしていると書いたが、実際にはDevOps的な仕事とR&D的な仕事を行ったり来たりしていたので、副業を含めるとかなり幅広い仕事をしていたと思う。

 

上手くいった仕事と上手くいかなかった仕事を比較してみると、「その仕事の進め方や意義について考える時間が長ければ長いほど、満足できる成果が出る」という所が違いとしてありそうだった。(この「満足できる成果」は、「自分の中で納得できる」という意味で、「高い評価を得た」という意味ではない)

 

恐らく、自分の中で成果を出すためにできる手段を頭の中で整理して、その中から自分が正しいと思う手段を選んでいるので、成果に満足して、達成感を感じられるのだと思う。

逆に、仕事の進め方や意義についてそこまで深く考えずに進めた仕事に関しては、評価されたとしても自分の中で「やり切った」「成功した」と納得できない事が多かった。

 

仕事に対して達成感を感じないというのはモチベーションの低下に繋がってしまうし、自身の仕事の成果に自分自身で納得できていないとプロフェッショナル意識が無くなり成果の質が下がるという負の循環に陥る可能性もある。

 

今後は考えて整理する時間を増やしたい

このブログは、雑にたくさん思考を吐き出すために使いたいと思う。

元々はQiitaやZenn等に整理してアウトプットしようと思ったが、「自分以外が見る」ということを意識しすぎると、無駄に説明を丁寧にしてしまったり、モチベが下がってしまうため、一旦はリハビリとしてブログを運用してみる。

まずは思考の継続のために書きなぐるので、読みやすい文章とか、綺麗なフォーマットは期待しないでください。

 

後は、エンジニアリングだけじゃなくて、自分の好きなゲームとか漫画とかの趣味寄りの話も記事にしてみるつもり。

 

読んでて共感したり、面白いなと思って貰えたらスターください。よろしくお願いします。