機械学習のお勧め本

100%主観だけど、優勝はこの本だね。

 

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

 

 前の記事でも書いたけど、機械学習関連の本を何冊か手を動かしながらやってみて、この本が一番しっくり来ました。もちろん、ある程度機械学習に慣れ親しんだ後に出会ったからという多少の「バイアス」がかかった結果というのは否定しません。それでも、機械学習やろうと思っている人の少しでも背中が押せればということで、気に入ったところを書いてみようと思います。

 

対象となる人

読む人によってバックグラウンドが違うから、感じ方も様々なのは当たり前。なので、同じような感想を得られそうなのはこんな人かな?というのを書いておきます。

 

  • 数学は高校まで。微積分の授業で習ったことをうっすら覚えているが、テストの問題は解けないぐらいに忘れている
  • プログラミング言語に多少は慣れ親しんでいる。仕事ではフルに使わないが、簡単なコードは書ける。Pythonが分かればベスト
  • がっつり統計学は勉強していないが、学校で統計入門の授業を取った、もしくは実務でExcelなどを使ってそれっぽいことをやった。平均と中央値は違うよねみたいな話ならついていける

 

これ、お前のことじゃね?と言われれば、はいその通りですとしか言えない(笑)。前置きはこのぐらいにして、気に入ったところを書いていきます。

 

概要から入って詳細に進むスタイル

 細かい事は後で説明するからとりあえず動かしてみようぜてな訳で、かなり最初の方に、Scikit-learnのトイセットではないデータをダウンロードしてきて、それをPandasのDataframe使って加工して、数値とそれ以外に分けて、カテゴリはOne-hot encodingして、これをまた1つにマージして、最後はPipelineで一気に処理するみたいな。

 

前の本では最終章手前に出てきたのにもうPipelineとか出てきてマジか?と思ったけど、これを最初の頃にやって流れを押さえてあるから、後の方を読んでも、「今、ここを深掘りしてるのね」というのが分かって迷子にならないというメリットがありました。

 

後でディープラーニングに進むことを前提にしている

タイトル見れば書いてありますが、with Scikit-learn & Tensorflowとあるように、前半は主にScikit-learnを使って、後半でTensorflowが登場するという流れになっています。

 

ただ、後半になって話がガラって変わるのではなく、前半からちょいちょい伏線を張っています。お恥ずかしい話、Gradient Descent(GD)なんてニューラルネット以降じゃないと使わないと思っていたら、早くもLinear Regressionの段階で、Closed-formの式で最適なパラメータを求める以外にGDを使うアプローチもあるんだよという流れから、一気にBatch, Stochatic, mini-batchを紹介してくれています。ディープラーニングに入った後に、これらの概念がポンと入ってきてアワワとなるより、はるかに良いかなと思います。

 

ニューラルネットは計算量が多いので、ミニバッチとかSGDを使うという他の本の説明も正しいとは思うんだけど、この本の流れだと、あ、あのときやったやつねという感じで心のハードルが間違いなく下がると思う次第であり。。。ちなみにSoftmaxもLogistic Regressionのあとのところで、多少ねじ込み感があるものの登場しております。

 

だって、今の時代(2018年はじめ)だと、もうニューラルネットとかディープラーニングは避けて通れないわけで、後でそこにたどり着く前提で書いていてくれるのは、逆にありがたいよね。

 

おまけの充実度

最近の本では、Githubリポジトリへのリンクが書いてあって、最新の情報はGithubを見てねというのは 、もはや普通。ただ、この本の場合、オマケが相当充実してます。(ググれば出てくるけど)敢えてリンク張りませんが、線形代数の基本とか、matplotlib、numpy、 pandasの基本的な使い方まで丁寧に用意してくれています。

f:id:deutschina:20180118152440p:plain

 別の本を写経しているときに、このグラフの出し方を知りたいんだよ!というイライラがあったけど、この本に関しては基本的なところはこれらのファイルを見てねという感じでさらっと書いてあって、いざファイルを開いてみたら・・・結構なお得感。

特に、自分のように数学が結構ご無沙汰で、なんで行列とか出てくるの?みたいな人は、数学と線形代数のドキュメントを軽く斜め読みするだけでも、頭に入ってくる感じが全然違うと思います。

 

数式は多め

これは普通、ネガティブ要素なんだけど、この本に関してはポジティブに捉えて良いと思います。上に書いたオマケの数学と線形代数のドキュメントだったり、遠い昔の高校数学の記憶を頼りに読み進めてもなんとか追いつけるレベルなのと、特に前半は、式に対して丁寧に補足していたり、前の式とはここが違うんだよというのを書いてあるのが嬉しい。

 

本当に初期の頃は、ベクトルって書いてあるのに矢印じゃなくて、[1.2, 3.3, 5.0]みたいなリストになっていたり、縦横入れ替えるTransposeって何それおいしいの?レベルだったけど、式の要素とかの説明が相当丁寧だったので、繰り返しているうちに長い式を書くより行列計算にした方が簡潔に書けるんだねとか、行列を入れ替えるのはドット積を求めたりするのに要素数を合わせるためにやっているんだねというのが見えてくると、逆に「機械学習ってすごい難しい数学使っている訳じゃないんだね」というのが見えてくるから不思議。

 

こんな感じで、毎日楽しく手を動かしながら進めている(まだ進行形)訳なので、みんなも読んでみれば良いのにと思うのですが、ネガティブかもしれない要素についても書いておこうと思います。

 

この本、高くねーか?

自分が書籍版買ったときは、書籍版は6,000円しなかったと記憶しているものの、米ドルで49ドルぐらいなので、換算レート的にそこまでぼったくられている訳ではないと思います。高い安いという感じ方は人それぞれな訳で、高いと思うならもっと安い日本語の本を探せば良いのかなと思います。自分の場合は、いつでも見れるように書籍版を手に入れた後に、Kindle版も買ったので9,000円ぐらい払ったことになっているけど、別に高い買い物をしたという感覚はないですね。

 

ちなみに、書評を見るとKindle版の数式のレイアウトがひどいという指摘があるのですが、見た感じだと数式部分が画像になっていて、それが表示幅に合わせて拡大表示されているだけ。むしろ、Kindleの小さい画面でオリジナルサイズで表示されたら、数式の添え字とかが見えづらいと思うんですけどね。(←自分は老眼か?)

 

英語の本はちょっと

この本の著者の方、名前からしてフランス語圏の方だと思うんですけど、比較的平易な英語で書かれていると思います。Kindleなんて知らない単語を選択すれば勝手に辞書が出てくる時代ですからね、英語だからという理由で尻込みしてしまうのはもったいないような気がします。

 

※2018/5/6追記

この本の日本語版が出ました。

 

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

 

追記ここまで

 

それでも日本語がいいもん。という場合は、この本も良いと思います。自分も、この本は一通り終わらせました。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

 

ただ、 scikit-learnの世界に閉じているので、理論的な部分がブラックボックス気味(数式を減らして概念を理解してもらおうという狙いだとは思いますが)なのと、後でニューラルネットワークをやるという意味では、つなぎの部分が少し弱いと感じました。例えば、この本の後にTensorFlow関連の本をやると、先ほどの自分のように、いきなりGDとかSoftmaxの話が出てきて、これってニューラルネット独自の概念なんだよねという勘違いをしてしまうかもしれません。

 

ということで、自分の場合はこの本がバイブルになりそうな勢いです。 

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems

Hands-On Machine Learning With Scikit-Learn and Tensorflow: Concepts, Tools, and Techniques to Build Intelligent Systems