もろず blog

もろちゃんがITに関しての様々なトピックを解説します

Python で機械学習しよう!(環境構築 on Mac編)


f:id:chanmoro999:20141128173308p:plain

そろそろちゃんと機械学習を勉強しようと思い、ついでに Python をやり始めています

そういえば、大学生のときに Python を勉強しようと思って本を買ったことがあったんですが、当時はあんまりやる気もなくちょっとしか手をつけていませんでした
あの時ちゃんと勉強しとけばよかったなぁとか思ったり・・・


とりあえず、手持ちの Mac 上に数値計算機械学習を実行できる環境を構築したのでその際の手順をまとめました

※以下の環境で動作することを確認しています
OS X Mavericks (10.9)
OS X Yosemite (10.10)



この記事では
1. 概要
2. Python とライブラリのインストール
3. PyDev のインストールとセットアップ
4. Hello Python !!!
5. まとめ
について説明します


1. 概要

今回は Python を使って数値計算機械学習の開発ができる環境を構築します

ざっくりした手順としては、まず pyenv を利用して Python をインストールします
そして Miniconda を利用して、NumPy、SciPy、matplotlib、scikit-learn をインストールし、PyDev を使って Eclipse 上で Python コードが実行できるところをゴールとします


Python のバージョン2系、3系では大きく仕様が異なるらしく、インタプリタも様々なものが出ているとわかりました
まだそのへんの具合がよくわからないので、インタプリタやバージョンを手軽に切り替えられるように、pyenv を使って自由に動作環境を切り替えられるようにします


今回インストールする数値計算機械学習に利用するライブラリについての説明です

NumPy

数値計算を効率的に処理するためのライブラリです
配列の操作がとても簡単になるので、行列計算には必須っぽいです

SciPy

様々な科学計算が実装されたライブラリです
内部でNumPyを利用しています

matplotlib

グラフ描画のライブラリです
内部でNumPyを利用しています

scikit-learn

機械学習に関する様々なアルゴリズムが実装されたライブラリです


上記のライブラリもバージョンの組み合わせが問題になることがあるようなので、Miniconda を使って切り替えられるようにしておきます

Anaconda を使うと最初からこれらのライブラリが全部入りで使えるようですが、今回は後からライブラリを入れるタイプの Miniconda を使おうと思います


IDE には個人的に使い慣れている Eclipse を使います
PyDev というプラグインをいれると EclipsePython の開発が行えるようになります

最後に pyenv でインストールした Python 環境を Eclipse から利用できるよう設定を行います


記事の先頭に戻る


2. Python と各ライブラリのインストール

まず、ホームディレクトリに pyenv のリポジトリをコピーしてきます

git clone git://github.com/yyuu/pyenv.git ~/.pyenv


~/.bash_profile にクローンしてきた pyenv へのパスを追加するコードを付け足します

export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi


.bash_profile の内容を現在のシェルに反映します

source ~/.bash_profile


これは必須ではありませんが pyenv-pip-rehash をインストールします
pyenv で Python の環境を切り替えたときに pyenv rehash を自動で実行してくれます

brew install homebrew/boneyard/pyenv-pip-rehash

※2015/11/8 追記
以前掲載していた以下のコマンドでは pyenv-pip-rehash をインストールできなくなっていたため修正
brew install pyenv-pip-rehash


pyenv のインストールが終わったら、pyenv を利用して Python をインストールします
ここでは Miniconda をインストールします

# インスール可能なバージョンを確認する
$ pyenv install --list

# インストールする
$ pyenv install miniconda3-3.7.0

# 現在のシェルで使う python のバージョンを指定
$ pyenv shell miniconda3-3.7.0

# インストール済みのバージョンと現在有効になっている python のバージョンを確認する
$ pyenv versions


念のためシェルを再起動して、正しくバージョンが切り替えられることを確認します

# デフォルトの状態
$ python --version
Python 2.7.5

# バージョンの切り替え
$ pyenv shell miniconda3-3.7.0
$ python --version
Python 3.4.2 :: Continuum Analytics, Inc.

# pyenv-pip-rehash をインストールしていない場合は
# バージョンを切り替えた後に以下を必ず実行します
$ pyenv rehash


Miniconda を利用して NumPy、SciPy、matplotlib、scikit-learn をインストールします

$ conda install numpy=1.8 scipy matplotlib scikit-learn

特にバージョンを指定しなければ最新版がインストールされますが、現時点の最新版である SciPy 0.14.0 と NumPy 1.9.1 の組み合わせだと SciPy の test でエラーが大量に発生します
NumPy 1.8系 にするとエラーが出なくなったので、ここでは NumPy 1.8 をインストールします

※この issue と似たようなエラーなんですが、今回は Python3 で動かしているのでこれとは別のエラーかもしれません
Many scipy.sparse test errors/failures with numpy 1.9.0b2 · Issue #3853 · scipy/scipy · GitHub

さっそく Miniconda にしたメリットがありました


インストール済みのパッケージを確認します

$ conda list
# packages in environment at /Users/[ユーザー名]/.pyenv/versions/miniconda3-3.7.0:
#
conda                     3.7.3                    py34_0  
dateutil                  2.1                      py34_2  
freetype                  2.4.10                        1  
libpng                    1.5.13                        1  
matplotlib                1.4.0                np18py34_0  
nose                      1.3.4                    py34_0  
numpy                     1.8.2                    py34_0  
openssl                   1.0.1h                        1  
pip                       1.5.6                    py34_0  
pycosat                   0.6.1                    py34_0  
pyparsing                 2.0.1                    py34_0  
python                    3.4.2                         0  
python-dateutil           2.1                       <pip>
pytz                      2014.9                   py34_0  
pyyaml                    3.11                     py34_0  
readline                  6.2                           2  
requests                  2.4.3                    py34_0  
scikit-learn              0.15.2               np18py34_0  
scipy                     0.14.0               np18py34_0  
setuptools                7.0                      py34_0  
six                       1.8.0                    py34_0  
sqlite                    3.8.4.1                       0  
tk                        8.5.15                        0  
xz                        5.0.5                         0  
yaml                      0.1.4                         1  
zlib                      1.2.7                         1  


最後に python を起動して NumPy、SciPy、matplotlib のテストを実行します

>>> import numpy
>>> numpy.test('full')
>>> import scipy
>>> scipy.test('full')
>>> import matplotlib
>>> matplotlib.test()

scikit-learn のテストは nose でテストが用意されているようなので bash シェルから以下を実行します

nosetests --exe sklearn


ずらーーーーーーーーーーっと warning や実行中の出力が表示されます
最後に以下のように "OK" と表示されれば問題なく動作します

OK (KNOWNFAIL=6, SKIP=8)

ここで以下のように "FAILED" となる場合は、Python やライブラリのバージョンを確認してください

FAILED (KNOWNFAIL=276, SKIP=922, errors=326, failures=42)

matplotlib のテストは 2つエラーとなって fail になりました
グラフの描画をやるだけなので、とりあえずここは無視しても差し支えないかと思います


※おまけ
Miniconda の存在を知る前に NumPy、SciPy を手動でインストールしてしまったので、一応その際の手順も残しておきます

・NumPy のインストール

pip3 install numpy

・SciPy のインストール

pip3 install git+http://github.com/scipy/scipy/

※pip3 install scipy でもOKです


SciPy のインストール時には恐らくいろいろエラーが出るはずです
fortranコンパイラと cython が無いことが原因でエラーとなっていました

gfortran をインストール
※現在は gcc に含まれているそうなので gcc をインストールします

brew install gcc

・cython のインストール

easy_install-3.3 cython

これで再度、SciPy のインストールを試みます
以下の記事を参考に、コンパイラを指定してインストールしてください
エラーを出さずにScipyをインストールする - PASL


・matplotlib のインストール

pip3 install matplotlib

・scikit-learn のインストール

pip3 install scikit-learn 

pip はソースからコンパイルしてインストールしているようなので、SciPy でエラーが発生するのはMac にデフォルトで入っているコンパイラが原因のようです

Miniconda でインストールする場合はコンパイル済みのバイナリを取得してくるだけなので、この点については問題ありません
こういったライブラリの管理ツールはとても便利ですね


(参考リンク)
http://itbc-world.com/home/rfm/r%E3%81%AE%E8%A8%AD%E5%AE%9A/scipy%E3%81%AE%E8%A8%AD%E5%AE%9A/
Errors in tests of Scipy · Issue #12 · Homebrew/homebrew-python · GitHub


記事の先頭に戻る


3. PyDev のインストールとセットアップ

Eclipse に PyDev をインストールします
※僕の Eclipse 環境では Pleiades で日本語化しちゃっているので、デフォルトで使っている方は項目名をいい感じに読み替えてください・・・


[ヘルプ] → [新規ソフトウェアのインストール] を選択します

f:id:chanmoro999:20141127234830p:plain


[作業対象] に以下の URL を入力し、[PyDev] にチェックを入れます

http://update-production-pydev.s3.amazonaws.com/pydev/updates/site.xml

※2015/2/7 追記
以前掲載していた以下のURLはリダイレクトされていました
http://pydev.org/updates

f:id:chanmoro999:20141127235202p:plain


インストールが始まって以下の画面が表示されたら、忘れずにチェックを入れて [OK] をクリックします
※チェックを忘れるとインストールされません・・・

f:id:chanmoro999:20141127235520p:plain


インストールが完了したら、Python の実行に使用するインタプリタを設定します


[環境設定] → [PyDev] → [インタープリター] → [Python Interpreter] を選択し、[新規] ボタンをクリックします

f:id:chanmoro999:20141128000153p:plain


Select Interpreter の画面が表示されたら、実行可能ファイルの欄に以下のパスを入力します
これは pyenv でインストールしたインタプリタのパスです

/Users/[ユーザー名]/.pyenv/versions/miniconda3-3.7.0/bin/python

インタープリター名にはバージョン等のわかりやすい名前をつけておきます
pyenv で表示される環境名をそのまま使えばいいかと思います

入力できたらOK をクリックします

f:id:chanmoro999:20141129100740p:plain


次の画面でも OK をクリックします
f:id:chanmoro999:20141130155950p:plain

環境設定の画面に、設定したインタプリタが表示されていることを確認し OK をクリックして閉じます


pyenv でインストールした他のバージョンも設定したい場合は、同じようにインタプリタの実行ファイル、インタプリタ名を変えて登録すればいくつも追加することができます


記事の先頭に戻る


4. Hello Python !!!

ここまでで Eclipse 上で Python が実行できる環境が整いました
さっそく Python のコードを実行してみましょう


PyDev のパースペクティブに切り替えて、新規のプロジェクトを作成します

[PyDev プロジェクト] を選択して [次へ] をクリックします
f:id:chanmoro999:20141128001143p:plain


適当なプロジェクト名を入力して、

をそれぞれ選択して [完了] をクリックします
f:id:chanmoro999:20141128001420p:plain


作成されたプロジェクトを選択した状態で、[ファイル] → [新規] → [PyDev モジュール] を選択します
[name] には "test" を入力して [完了] をクリックします
f:id:chanmoro999:20141128001823p:plain

テンプレートは Empty を選択します
f:id:chanmoro999:20141128001950p:plain


ここで作成された test.py ファイルに以下のコードを書いて保存します

print("Hello Python!!!")


[実行] → [実行] をクリックします
f:id:chanmoro999:20141128002221p:plain


[Python 実行] を選択して [OK] をクリックします
f:id:chanmoro999:20141128002335p:plain


コンソールに "Hello Python !!!" と表示されたら完成です!
f:id:chanmoro999:20141128003251p:plain


記事の先頭に戻る


5. まとめ

無事環境を構築することができたでしょうか?
まだまだ機械学習Python も初心者ですが、使いこなせるようにがんばって勉強していきます

最終的には機械学習やデータ解析を行うサーバーを構築することが目的なので、有益な情報があれば記事を書いていこうと思います


世の中には既にとんでもなく大量のデータが存在していますが、オープンデータ、IoT が広まることで僕らが扱うことのできるデータ量は更に爆発的に増えていきます

その時に外部のサービスを利用して整形、分析済みのデータを得ることは簡単にできるはずですが、そのサービスのフィルタを介したデータしか見れなくなると思っています
そうなってしまうと、たくさんのデータにアクセスできることのメリットが薄れてしまいますよね

大量のデータから自分たちにとって "本当に" 有用な情報を見つけ出すためには、これらのデータを自分たちで分析する必要があると思いませんか?

もちろんデータが全てではないですし過去から未来をみることはできないと思っていますが、自分の脳で動くためのツールとして身につけていきたいです



今回はそんな HowTo の記事でした!


記事の先頭に戻る