読者です 読者をやめる 読者になる 読者になる

Think more, try less

Owen Zhangの言葉を大切にして,日々Kaggleに取り組んでいます.

Python機械学習プログラミング/福島真太朗(監訳)のご紹介

これは技術書献本大感謝 Advent Calendar 2016の6日目の記事です。

qiita.com

福島さんよりPython機械学習プログラミング/福島真太朗(監訳)をご恵贈頂きました。2016/06/30に発売され、すでに多くの方に知れ渡っているかと思いますが、この場を借りて書評という形で宣伝させていただきます。

対象読者

これまでに機械学習について学んで来なかったエンジニアで、一通り機械学習の基礎を身につけたい方、もしくは、基本的な機械学習は習得しているが、Pythonによる機械学習の実践方法を学びたい方に非常に有益な書籍となっています。

本書の特徴と良い点

よく他の書籍でありがちな機械学習の各種手法を試しましたというようなチュートリアルで終わるような書籍ではなく、基本的な機械学習の理論とその実装まで詳しく書かれているため、しっかり読むことでロジックがよくわからないまま機械学習を使うようなことも避けることができます。

また、本書はscikit-learnによる実装が詳しく解説されているため、scikit-learnを一通り学ぶことできます。本家のscikit-learnのチュートリアルはやや難しいところや説明不足のところもあり初学者には中々難しいため、scikit-learnの入門としては本書から始められると良いと思います。

機械学習やscikit-learnにすでに熟練している読者の場合、本書のiPython Notebookがレファレンスとしても役立つと思います。

github.com

本書で触れられていない内容

本書は本当によくこの厚さでここまで盛り込んだなと思わせるほど密度の濃い内容となっていて全く問題ない内容ですが、わたしが思いつく範囲で触れられていない内容を確認すると次のような内容があります。

例えば、Gradient Boosting Decision Tree(GBDT)のライブラリのXGBoostや、Deep LearningのライブラリのChainerといった有名なライブラリの解説はありません。そのため最近の理解しておくべきライブラリについては別途、勉強する必要があります。

また機械学習の内容の中でも発展的な内容として、トピックモデルに関する機能を備えたgensimや、またFactorization Machinesなどをもちいたレコメンデーションの解説もありません。またCTR(Click Through Rate)の問題を解くためのオンライン学習のアルゴリズムであるFTRL-Proximalなども載っていません。そのため、興味のある個々の内容については各自で勉強する必要があります。あくまで本書は基本的な機械学習の内容をカバーしているものになります。

特におすすめの章

個人的にここは読むべきと思われる章を紹介します。記事の文面上おすすめの内容を2つの章に絞っておすすめします。

第4章 データ前処理 -- よりよいトレーニングセットの構築

この章は、特に機械学習初学者にとって必読の内容であると思います。機械学習によるモデル構築方法などは色々な解説がありますが、前処理について丁寧に解説している書籍は中々ありません。しかもそれをscikit-learnpandasを使った処理で解説しているため、非常に実用的です。特に初学者が陥りがちな誤りとして、カテゴリカルデータの取扱方法がありますが、しっかりと4.2.2. クラスラベルのエンコーディング4.2.3 名義特徴量でのone-hotエンコーディングの節で解説されています。

from sklearn.preprocessing import LabelEncoder

class_le = LabelEncoder()
y = class_le.fit_transform(df['classlabel'].values)
y
from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(categorical_features=[0])
ohe.fit_transform(X).toarray()

このデータ前処理に関しては、この内容だけで、1冊の書籍が書けるほど奥深い分野です。より詳しい解説としては、本書の翻訳者である福島さんが執筆されたデータ分析プロセスを読まれることをおすすめします。

データ分析プロセス (シリーズ Useful R 2)

データ分析プロセス (シリーズ Useful R 2)

7章 アンサンブル学習 —異なるモデルの組み合わせ

この章はアンサンブル学習について知っていると思われる読者にも一読されたい内容でした。たいていのアンサンブル学習の解説は、最初は、決定木をもちいたアンサンブル手法であるRandom Forestの解説から始まり、Random Forestの実装をRandomForestClassifierをもちいた実装の解説で終わる場合が多いと思います。

しかし、本書では丁寧にBaggingの解説が載っています。DecisionTreeClassifierのEstimatorをBaggingClassifierに通す実装が紹介されています。

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

tree = DecisionTreeClassifier(criterion='entropy', 
                              max_depth=None,
                              random_state=1)

bag = BaggingClassifier(base_estimator=tree,
                        n_estimators=500, 
                        max_samples=1.0, 
                        max_features=1.0, 
                        bootstrap=True, 
                        bootstrap_features=False, 
                        n_jobs=1, 
                        random_state=1)

これに対応する形として、Boostingを解説するために、DecisionTreeClassifierのEstimatorをAdaBoostClassifierに通す実装も紹介されているため、単なるアンサンブル学習の手法を学ぶための実装の紹介がなされているわけではなく、アンサンブル学習の本質を学ぶことができる構成になっています。

from sklearn.ensemble import AdaBoostClassifier

tree = DecisionTreeClassifier(criterion='entropy', 
                              max_depth=1,
                              random_state=0)

ada = AdaBoostClassifier(base_estimator=tree,
                         n_estimators=500, 
                         learning_rate=0.1,
                         random_state=0)

この章の最後に、Netflixコンペティションのエピソードでアンサンブル手法の注意点にも触れられています。このあたりの補足についても非常に読み応えがあります。

おわりに

以上、簡単ですが、Python機械学習プログラミングのご紹介をしました。この本書ほど機械学習の理論的な基礎を触れつつ、Pythonによる実装を解説した書籍は他にないと思います。ぜひ本書を手にとって頂き、実務で機械学習をもちいる際に役立ててもらえたら幸いです。

追記(2016/12/09)

よくscikit-learnを使ったソースコードを見ていると、X_train、x_train、train_x、Y_train、y_train、train_y、target、Yなどさまざまな書き方が散見されますが、本書では、P.10で解説されているように、特徴量のベクトルを小文字のx、行列を大文字のX、ラベルの列ベクトルを小文字のyと表して、X_train、y_train、X_test、y_testのように統一して記述されています。このコーディング規則に従うことを推奨します。