Pythonで機械学習アプリケーションの開発環境を構築する

Pythonで機械学習アプリケーションの開発環境、具体的にはNumpy/Scipy/scikit-learnを導入する手順について解説します。
なお、環境はPython3ベースを想定しています。

# Minicondaベース(推奨)
機械学習系のパッケージはコンパイルが面倒なものが多いため、コンパイル済みバイナリをインストールできる`conda`([Miniconda](http://conda.pydata.org/miniconda.html))での環境構築を推奨します。

まずはPython本体(Python3想定)、パッケージ管理ツールであるpip、仮想環境を作成するvirtualenv、といった基本的な環境の構築を行います。
※virtualenvについては今回(condaを使う場合)は不要ですが、Pythonで開発を行うなら入れておくべきパッケージなので併せて入れておきます。

## Mac/Linux
デフォルトのPythonと分けてインストールするため、pyenvを利用します。

* pyenvのインストール
 * Mac: [【Mac】Pythonのインストール+pyenvの使い方について](http://www.task-notes.com/entry/20141215/1418612400)
 * Linux: [PyenvによるPython3.x環境構築(CentOS, Ubuntu)](http://qiita.com/akito1986/items/be5dcd1a502aaf22010b)

```
# confirm installation
pyenv --version

# show python environments list
pyenv install -l

# install newest miniconda
pyenv install miniconda3-x.x.x

# refresh pyenv
pyenv rehash

# activate installed python environment globally
pyenv global miniconda3-x.x.x

```

* pipのインストール: [get_pip.py](https://pip.pypa.io/en/latest/installing.html#install-pip)でインストール(Python3.4を使うなら[ensurepip](http://docs.python.jp/3/library/ensurepip.html#command-line-interface)でOK)
* virtualenvのインストール: `pip install virtualenv` 

各プロジェクトで使用するPythonを切り替えたい場合は、`pyenv local x.x.x`で設定できます。
なお、pyenvで新しいPython環境をインストールした後は`pyenv rehash`が必要です([こちら](https://github.com/yyuu/pyenv#basic-github-checkout)参照)。忘れがちなので注意してください。

Minicondaのインストールが完了したら、`conda`で、機械学習用の仮想環境`ml_env`の構築を行います(名前は何でもいいです)。

`conda create -n ml_env numpy scipy scikit-learn matplotlib cython jupyter`

作成ができたら、この機械学習用の仮想環境を有効化してみます。

`source activate ml_env`・・・でいいはずなんですが、pyenvを使っているとpyenvの`activate`とcondaの`activate`がバッティングするようで、シェルが落ちるケースがあります。
回避方法としては、condaのactivateをきちんとフルパスで指定します。`conda info -e`でcondaで作成した仮想環境の場所を確認し、そこの`bin`にある`activate`を起動します。

```
conda info -e
# conda environments:
#
ml_env                   /usr/local/pyenv/versions/miniconda3-3.4.2/envs/ml_env
root                  *  /usr/local/pyenv/versions/miniconda3-3.4.2

source /usr/local/pyenv/versions/miniconda3-3.4.2/envs/ml_env/bin/activate ml_env
```

ただ、これだと面倒です。`pyenv local`ではMinicondaで作成した環境も指定できるようなので、`pyenv local miniconda3-3.4.2/envs/ml_env`の方が楽だと思います。

## Windows

* Pythonのインストール: [Miniconda](http://conda.pydata.org/miniconda.html)
* pipのインストール: `conda install pip`
* virtualenvのインストール: `pip install virtualenv`

※Python3.5ベースのminicondaは、[Visual Studio 2015用のVisual C++ランタイム](https://www.microsoft.com/ja-JP/download/details.aspx?id=48145)が必要になります。これがインストールされていないと、インストール時にエラーが発生するので注意(2015/11/13現在。そのうち対応されるはず。 [Python 3.5 missing VCRUNTIME140.dll](https://github.com/ContinuumIO/anaconda-issues/issues/443))。

Minicondaのインストールが完了したら、コマンドプロンプトから`conda`で機械学習用の仮想環境`ml_env`の構築を行います(名前は何でもいいです)。

`conda create -n ml_env numpy scipy scikit-learn matplotlib cython jupyter`

作成ができたら、この機械学習用の仮想環境を有効化してみます。

```
activate ml_env
```

# virtualenvベース(Pythonに慣れている人向け)

Minicondaを使わない場合(virtualenvを使う場合)は、Numpy/Scipyのコンパイルが必要になります。
以下では、その環境の構築手順を説明します。Python・pip・virtualenvは既に入っているものとします。

## Mac
gcc/gfortranをインストールする必要があるので、XcodeとXcode CommandLine Toolsをインストールします。

Xcodeコマンドラインツールは、Xcodeインストール後以下のコマンドでインストールできます。

```
xcode-select --install
```

scipyのインストールにはgfortranが必要なので、こちらも導入しておきます。

[GFortranBinariesMacOS](https://gcc.gnu.org/wiki/GFortranBinariesMacOS)

これで環境は整ったはず・・・なので、動作を確認します。適当なフォルダを作成し、そこに機械学習用の仮想環境を作成してみます。
こちらのGistにある[requirements.txt](https://gist.github.com/icoxfog417/420ac8eb3fad524ee2d6)を使用します。

```
mkdir ml_env_test
cd ml_env_test

# 仮想環境を作成
virtualenv venv

# 仮想環境を有効化
source venv/bin/activate

# GitHubのRAWからrequirements.txtを取得(普通にコピーしてテキストファイルを作ってもよい)
curl https://gist.githubusercontent.com/icoxfog417/420ac8eb3fad524ee2d6/raw/ac4122eb7b53b40274d2e7ced224abaa28a383c7/requirements.txt > requirements.txt

# 依存ライブラリをインストール
pip install -r requirements.txt
```

scipyのインストールはかなり遅くまたメモリも食うため、Chromeとか動かしながらやっているとMemoryErrorを食らいます。コンパイルが通ることを祈り、静かに待ちましょう。

`pip install`が完了すれば、動作確認は完了です。

## Linux(Ubuntu)

以下をapt-getすれば大丈夫・・・だと思います(Ubuntu 14.04)。

```
build-essential
gfortran
libgfortran3
python-dev(python3-dev)
libblas-dev
libatlas-base-dev
cython
```

仮想環境の構築コマンドはMacと同様のため、上記を参照してください。

## Windows

Windowsでコンパイルを通すのは至難の業なので、こちらからコンパイル済みバイナリをダウンロードしてきてインストールします。

[Unofficial Windows Binaries for Python Extension Packages](http://www.lfd.uci.edu/~gohlke/pythonlibs/)

こちらで取得できる`.whl`ファイルを使って、`pip install <file_path>`でインストールしていきます。必要なライブラリは[こちらのrequirements.txt](https://github.com/icoxfog417/sayuri-server/blob/master/requirements.txt)の通りです。

```
mkdir ml_env_test
cd ml_env_test

# 仮想環境を作成
virtualenv venv

# 仮想環境を有効化
venv\Scripts\activate

# (上記サイトから.whlファイルを落としてくる)

# .whlファイルをインストールしていく(以下はnumpyの例)
pip install numpy‑1.9.2+mkl‑cp34‑none‑win32.whl
```

あくまで自力でコンパイルする場合はVisual Studio、MinGW/Cygwinなどの導入が必要になるのでだいぶいばらの道です。よほどのことがない限りやめておいた方がいいと思います。

詳細はこちらをご参考ください。

* [Python で “error: Unable to find vcvarsall.bat” が出た場合。Add Star](http://mimumimu.net/blog/2014/06/01/python-%E3%81%A7-error-unable-to-find-vcvarsall-bat-%E3%81%8C%E5%87%BA%E3%81%9F%E5%A0%B4%E5%90%88%E3%80%82/)
* [「Unable to find vcvarsall.bat」の対処法](http://www.regentechlog.com/2014/04/13/build-python-package-on-windows/)

# 自動構築技術を利用

koudaiiiさんがDocker、shiracoさんがAnsibleを用意してくれたので、これで入れられます。

[koudaiii/ml-handson](https://github.com/koudaiii/ml-handson)
[shiraco/ansible_ipython_machineleaning_bootstrap_conda](https://github.com/shiraco/ansible_ipython_machineleaning_bootstrap_conda)

# 動作確認

仮想環境の有効化(virtualenvの場合はプラスpip install)に成功したら、試しに`jupyter notebook`を起動してみます。[scikit-learnの解説をしたリポジトリ](https://github.com/icoxfog417/scikit-learn-notebook)を用意しているので、それが見られるか確認してください。

```
git clone https://github.com/icoxfog417/scikit-learn-notebook.git
cd scikit-learn-notebook
jupyter notebook
```

# その他参考資料

* condaコマンドの使い方: [Python Conda Tips](http://qiita.com/icoxfog417/items/02a80b93b5f1e95f2795)