機械学習

「ITエンジニアのための機械学習理論入門」を手を動かしながら読んでみた その1

2017/08/19

このページでは、中井悦司著の「ITエンジニアのための機械学習理論入門(Machine Learning for Software Engineers)」を実際に手を動かしながら読んでみた際の感想などをまとめていきます。
実際のコードなどは中井さんのgithubなどでpublicに公開されているのですが、なるべく自分の手で実装して理解を深められればと思ってます。

Chapter 1 データサイエンスと機械学習

機械学習について体型的に勉強したことがあまりなかったので、
「ITエンジニアのための機械学習理論入門」
を実際に手を動かしながら読んでいこうと思う。

ということで、第一章から始めていこうと思うのだが、本章では特に実装をガリガリやっていこうというよりは

「巷には機械学習のライブラリが溢れているけど中身知らないのに使って大丈夫?その結果に意味あるの?」

というような問いかけや、

「機械学習はこういうことができるんだよー」

というような具体例が挙げられている。

途中、久しく数学に触れてこなかった方のために、この分野で用いるベクトルの内積や外積、積分や対数の計算などが復習としてあげられている。

また本書全体に言えることではあるが、基本的に具体例やデータは章末に掲載される論文をはじめとする参考文献から引いてきてあるので機械学習分野の実例などを知るのにもちょうどいい。

本章の最後には、以降各章でどのようなアルゴリズムに取り組むか、どのような問題を解決するかが記載されており、LinuxやMacにおける環境設定についても記載されている。

そこで、以下では実際に本サイトで用いる実行環境や方針について記載することにする。

リモートで重い処理を回すことも考え、作業環境のOSはCentOS7.0を使用する。

対話的な実行をするためにこちらも勉強を兼ねてIPythonを使用できればと思う。

環境設定

ゴール

  1. pyenvを用いたPythonの環境設定

  2. Pythonで用いる以下に示す各パッケージのインストール
    ・ NumPy
    ・ SciPy
    ・ matplotlib
    ・ pandas
    ・ PIL
    ・ Pillow
    ・ scikit-learn
    ・ IPython

本で使用しているPILを入れようと思ったのですがpipのversionが上がってPILのforkであるpillowを使ったほうが良いとの事だったので今回はPILの代わりにPillowを使うことに。
以上が完了し、パッケージ内容をrequirementsに出力できたら完了とする。

1. pyenvを用いたPythonの環境設定

主にPython2系を使用することにするが、version毎に管理できて便利なpyenvを使うことにする。

# install rf. https://github.com/yyuu/pyenv
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
# list available python versions
$ pyenv install -l
# install python 2.7.9
$ pyenv install 2.7.9
# python versionの設定
$ pyenv global 2.7.9
# 現在のpython versionの確認 $ pyenv versions system
* 2.7.9 (set by /home/tstomoki/home/.pyenv/version)
# 設定の反映
$ pyenv rehash

2. Pythonで用いる以下に示す各パッケージのインストール

$ pip install numpy
$ pip install scipy
$ pip install pandas
$ pip install ipython
$ pip install matplotlib
$ pip install scikit-learn
($ pip install PIL)
$ pip install pillow

エラーは結構出たのですが逐一対応して全てのパッケージをインストールできたらpackages内容を保存

$ pip freeze > requirements.txt

以上で、環境設定は終了です!
さっそく2章以降に進んでいきます。

発生したエラーまとめ
NumPyを入れるときに発生したUnicodeDecodeError
$ pip install numpy
....
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8
in position 23: ordinal not in range(128)

どうやら現状のデフォルトエンコーディングが'ascii'となっているのが原因らしいのでsite-packagesディレクトリに以下のファイルを作成

$ python
> import sys
> sys.getdefaultencoding()
'ascii' #これが原因
# directoryを検索
$ sudo find / -name site-packages
/home/tstomoki/home/.pyenv/versions/2.7.9/lib/python2.7/site-packages
# ファイル作成
$ cat /home/tstomoki/home/.pyenv/versions/2.7.9/lib/python2.7/site-packages/sitecustomize.py
import sys
sys.setdefaultencoding('utf-8')
% python
> import sys
> sys.getdefaultencoding()
'utf-8'
scipy入れるときにパッケージが足りないとエラー
$ pip install scipy
...
numpy.distutils.system_info.NotFoundError: no lapack/blas resources found
# 諸々インストールして解決
$ sudo yum -y install atlas-devel lapack-devel blas-devel
matplotlib入れるときにパッケージが足りないとエラー
$ pip install matplotlib
...
=======================
* The following required packages can not be built:
* freetype, png
-----------------------
# 必要なpackagesをインストール
$ sudo yum -y install freetype freetype-devel libpng-devel
scikit-learnを入れる際にエラー
$ pip install scikit-learn
...
/usr/bin/ld: -lcblas が見つかりません
# atlasのパッケージが必要だったが、リンクが設定されていなかった
$ cd /usr/lib64/atlas && ln -s libtatlas.so libcblas.so
pillowを入れる際にエラー
$ pip install pillow
...
ValueError: jpeg is required unless explicitly disabled using --disable-jpeg, aborting
# jpegのpackageをインストール
$ sudo yum install libjpeg-devel

-機械学習
-