無印吉澤

Site Reliability Engineering(SRE)、ソフトウェア開発、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

機械学習初心者が『Python 機械学習プログラミング』(速習コース)を読んだメモ

f:id:muziyoshiz:20160924124311p:plain

きっかけ

機械学習の重要性は、それこそ「ビッグデータ」という言葉が出てきた頃からいろいろな人が訴えていますが、最近は特にツールが充実して、敷居が下がってきたように感じています。

そろそろ自分でも機械学習関係のツールを使えるようになりたいと思っていたのですが、そんなときに「具体的なコード例が多くて読みやすい」という本書の評判を聞いて、読み始めました。

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

まだ、ツールを使いこなせるレベルには全然届いていないのですが、試したことを記録しておかないと忘れてしまいそうなので、一旦メモをまとめておきます。

この記事を書いた人のレベル

私のレベルはこんな感じです。

  • 大学は情報科学科で、線形代数とか勉強したはずなのに、数学のことはほとんど忘れている
  • プログラミング言語の知識はあるが、Python のコードは書いたことがなく「ブロックをインデントで表現するやつ」程度の認識

今回の読書プラン

読み始める前に書評を色々検索して読んでたのですが(気後れしていたとも言う)、そのなかに、翻訳の福島さん自身が、本書の読み方をアドバイスする記事がありました。

thinkit.co.jp

この記事の3ページ目で、「速習コース」と「特訓コース」という2通りの読書プランを紹介されています。「全部読まなくて良い」というので少し気が楽になり、まずは速習コースに従って一通り読みました。

f:id:muziyoshiz:20160924124421p:plain:w600
速習コースのフロー
f:id:muziyoshiz:20160924124447p:plain:w600
特訓コースのフロー

Python 環境の構築

本書にコード例がふんだんに含まれており、すべて 本書の GitHub (rasbt/python-machine-learning-book) で公開されてます。しかも Jupyter Notebook の .ipynb ファイルで公開されているので、Web ブラウザ上からすぐに実行できます。今風ですね。

github.com

そこで、まずは Jupyter Notebook を動かすために必要なソフトをインストールします。Python 本体はもちろん、科学計算向けのライブラリもいくつかインストールする必要があります。

本書にはインストール方法はあまり書かれておらず、『Python機械学習プログラミング』学び方ガイド で紹介されている データサイエンティストを目指す人のpython環境構築 2016 - Qiita にも、Mac での手順はあまり詳しく書かれていませんでした。つまづいたポイントがいくつかあるので、自分の環境でのインストール手順をメモしておきます。

インストール先の環境

今回のインストール先は以下の通りです。次の MacBook Pro が出たら OS を乗り換えよう、と思っていたら、未だに Yosemite を使ってしまってる始末……。

  • OS X Yosemite 10.10.5
  • MacBook Pro (Mid 2014)

Anaconda (Python 3) のインストール

本書にも「科学計算に特に推奨したい Python ディストリビューションの1つに Anaconda がある」と書いてあったので、Anaconda をインストールしました。Mac に元々入ってる Python は使いません。

Mac上にデータ分析で使用するAnacondaをインストールし、IDEを起動するまで - Qiita を参考に、pyenv を入れてから、その上に Anaconda をインストールします。

Homebrew が入っていれば、以下のコマンドで pyenv がインストールされます。

% brew install pyenv

ただ、この状態で、

% pyenv install --list | grep anaconda

を実行したところ Anaconda 4.0.0 までしか選択できませんでした。Anaconda のダウンロードページ を確認したところ、その時点での最新版は Anaconda 4.1.1 だったのに……。

で、ここ最近 brew update を実行してなかったことに気づき、以下のコマンドを実行。

% brew update && brew upgrade pyenv

これで Anaconda 4.1.0 まで選択できるようになりました。最新ではないのが若干気になりますが、まあ Homebrew 対応に時間差があるのだろうと考えて、以下のようにインストール。デフォルトで Anaconda が使われるように設定しました。

% pyenv install anaconda3-4.1.0
% pyenv global anaconda3-4.1.0
% pyenv rehash

そして、Anaconda のなかでのパッケージ管理に使われる conda をアップデート。何かの記事を参考に実行したと思うのですが、これは必要なかったかもしれません(参考元ページを探し直したのですが見つからず)。

% conda update conda

科学計算に関するライブラリのインストール

本書 p.14 には、以下のパッケージが必要と書かれていました。

  • NumPy
  • SciPy
  • scikit-learn
  • matplotlib
  • pandas

これらを以下のコマンドでインストールします。元々 Anaconda に同梱されているものもありましたが、最新版にアップデートされました。

% conda install numpy scipy scikit-learn matplotlib pandas

サンプルの実行に必要なライブラリのインストール

本書を読みながらコード例を実行したところ、12〜13章のコードを実行するのに、以下のパッケージも必要になりました。

  • Theano
  • Keras

これらも conda install theano keras でインストールできると思いきや、インストールできませんでした。anaconda search -t conda theano を実行しろ、というメッセージが表示されますが、osx-64 向けに個人がビルドしたと思われる Threano が43個も見つかる始末。

最終的には Installing Theano — Theano 0.8.2 documentation の手順に従って、以下のコマンドを実行してインストールしました。

% pip install Theano

Theano のページには conda install pydot-ng も実行するように、と書いてあるのですが、私の環境では以下のエラーが出てインストールできませんでした。ただ、これをインストールしなくてもサンプルは動いたので、そのまま使っています。

% conda install pydot-ng
Using Anaconda Cloud api site https://api.anaconda.org
Fetching package metadata .......
Solving package specifications: ....

The following specifications were found to be in conflict:
  - pydot-ng
  - python 3.5*
Use "conda info <package>" to see the dependencies for each package.

Keras のほうは以下のコマンドでインストールできました。

% pip install keras

ただ、このインストール後にサンプルコードを実行すると、

from keras.utils import np_utils

の行で、ImportError: No module named 'tensorflow' というエラーが発生してしまいました。サンプルコードで TensorFlow は使ってないはずなんですが……。TensorFlow のダウンロードページ を参考に、以下のコマンドで TensorFlow をインストールしたところ、このエラーは出なくなりました。

% conda install -c conda-forge tensorflow

あと、サンプルの実行に必須ではないですが、notebook の先頭でソフトウェアのバージョン番号を表示したい場合は watermark のインストールも必要です。

% pip install watermark

サンプルの実行

サンプルは GitHub で公開されているので、git clone でコピーします。

% git clone https://github.com/rasbt/python-machine-learning-book.git

あとは jupyter notebook で Jupyter Notebook を起動し、code ディレクトリ以下にある ipynb ファイルを開けばコードを実行できます。

Jupyter Notebook の使い方については、本書の付録A「Jupyter Notebook の基本的な使用方法」と、Jupyter事始め - Qiita を参考にしました。メニューバーから Cell → Run All で動く、ということさえわかれば普通に使えると思います。私は、コードが書かれたセルを選んだ状態でないと Run Cells を押しても何も起こらない、ということに気づくのに結構時間がかかりました……。

それ以外の方法としては、jupyter console で CLI を開いて、ここにコードをコピーして実行するのも良いと思います。変数の中身を1個ずつ確認しながら実行するのは、GUI よりも CLI のほうが楽な気がしました。

例えば、サンプルコードを実行してると、これは Python 標準のオブジェクトなのか、科学計算ライブラリ固有のオブジェクト(例えば NumPy 固有の、多次元配列を表す ndarray など)なのか、知りたくなることがありました。そういうときは、コンソールで変数名の後に "?" を付けると、以下のようにオブジェクトの説明が表示されて便利です。

% jupyter console
Jupyter Console 4.1.1


In [1]: from sklearn import datasets

In [2]: iris = datasets.load_iris()

In [3]: X = iris.data[:, [2, 3]]

In [4]: X?

Type:            ndarray
String form:
[[ 1.4  0.2]
           [ 1.4  0.2]
           [ 1.3  0.2]
           [ 1.5  0.2]
           [ 1.4  0.2]
           [ 1.7  0.4]
           [ 1.4  0.3]
           [ 1.5 <...>  1.9]
           [ 5.9  2.3]
           [ 5.7  2.5]
           [ 5.2  2.3]
           [ 5.   1.9]
           [ 5.2  2. ]
           [ 5.4  2.3]
           [ 5.1  1.8]]
Length:          150
File:            ~/.pyenv/versions/anaconda3-4.1.0/lib/python3.5/site-packages/numpy/__init__.py
Docstring:       <no docstring>
Class docstring:
ndarray(shape, dtype=float, buffer=None, offset=0,
        strides=None, order=None)
(以下、ndarray の docstring)

サンプルコードを実行していて引っかかったところ

速習コースのサンプルコードを実行していて、ライブラリのインストール不足以外では、以下のポイントでエラーが出ました。DeprecationWarning もいくつか出ましたが、そちらについては今回は触れません。

3章

Notebook の冒頭で以下のエラーが出ました。

DistributionNotFound: The 'sklearn' distribution was not found and is required by the application

これはパッケージ名の記載ミスのようで、

%watermark -a 'Sebastian Raschka' -u -d -v -p numpy,pandas,matplotlib,sklearn

を以下に書き換えたところ、エラーが出なくなりました。ちなみに、他の章の notebook は元々こうなってました。

%watermark -a 'Sebastian Raschka' -u -d -v -p numpy,pandas,matplotlib,scikit-learn

12〜13章

以下の場所で FileNotFoundError が出ます。

X_train, y_train = load_mnist('mnist', kind='train')
print('Rows: %d, columns: %d' % (X_train.shape[0], X_train.shape[1]))

git clone でファイルをコピーしていれば、code/datasets/mnist ディレクトリに gz ファイルがあるので、このディレクトリを丸ごと code/ch12/mnist(または code/ch13/mnist)にコピーし、gunzip で解凍しておけば OK です。

Python の勉強

コードを一通り動かしてみたものの、コードを読んでいるうちに

  • このコードはどこまでが Python の標準機能で書かれているのか?
  • やたらたくさんライブラリを使っているが、どの部分がどのライブラリの機能なのか?
  • というかこのやたら出てくるコロンは何なの?
  • カギ括弧のなかに for だの in だの書いてあるのは何なの?

などなど、機械学習の理論よりもコード自体のほうが気になってくる始末(逃避とも言う)。で、本屋に行って Python の本をいくつか眺めてみて、読みやすそうだった「入門 Python 3」を買ってきました。

入門 Python 3

入門 Python 3

サンプルコードに関する疑問点は、これの1〜7章と、付録C「科学におけるPy」を一通り読み終わったあたりで、ある程度解決できました。例えば以下のようなあたり。

  • 多次元配列にカンマ区切りの a[1, 2] でアクセスできるのは、Python 標準のリストではなくて、NumPy の ndarray を使ってるから。標準のリストを使っていたら a[1][2] のようにアクセスする必要がある。
  • a[:] のようにコロンを使ってるのは Python 標準の「スライス」。list[start:end:step] という文法でリストの一部を取得できる。返り値に end の要素は含まれない。
  • カギ括弧のなかに for だの in だのあるのは Python 標準の「リスト内包表記」。for 文でイテレータを回した結果をリストで返す、ということを短縮形で書いているだけで、for 文の入れ子も書ける。

1〜7章だけなら読むのに1日もかからない分量なので、Python 初心者にはお薦めです。それと、付録Cに ipython3 コマンド(jupyter console コマンド)の便利機能の紹介があったのは、個人的には非常に助かりました。

あとは、本書に載っていた参考 URL(下記)も読まなきゃ、と思いつつ、こちらはまだほとんど読めてません。

速習コースを読んでみた感想

説明が平易に書かれており、図も豊富なので、数式を読み飛ばしても、何ができるのかはなんとなく理解できました。また、Jupyter Notebook でコードを動かしながら確認できるので、数式だけ追うよりは、だいぶ気楽に読めました。

Python は科学計算関係のライブラリが充実しているとは聞いていましたが、短いコードでこんなにたくさんのことができるのか、と驚きました。例えば、3章に、

y_pred = ppn.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())

というコードがあって、この (y_test != y_pred).sum() ってなんだ?と思ったら、これは2つの行列を比較した結果を bool の行列として取得し、さらに True の要素数を数えて返してるんですね。短いコードでこんなにたくさんのことができるのか、と驚きました。

ただ、一通り読み終えたものの、理解が中途半端なので、現状はこんな感じです。

  • いろいろな手法が紹介されているが、どういうときにどの手法を使えばよいかが、まだよくわからない
  • 実際の業務に使うとしたら、数式の部分をどこまで理解していれば十分なのか不安

なにか、身近の現実的な問題にツールを適用して、ツールにもう少し慣れたいところです。あと、最近職場でこの本の読書会をやろうという話が出てるので、何度か読み返して理解を深めたいと思います。

とりあえずの目標は、scikit-learn のサイトにある Machine Learning Map の範囲を、ツールとして一応使えるレベルかな……。

f:id:muziyoshiz:20160926132822p:plain:w800