Raspberry Pi 2にscikit-learn 0.20をインストール

aptでpython-sklearnをインストールして、pythonで

from sklearn.neural_network import MLPClassifier

すると、見つからないというエラーになった。
Raspbian 8.0 (jessie)の現在最新のaptのpython-sklearnのバージョンは0.14.1-3だが、sklearn.neural_network.MLPClassifierはscikit-learn 0.18以降にしか無いようだ。

そこで、pipで新しいバージョンのscikit-learnをインストールしようとして、

sudo pip install --upgrade pip

するとpip3が壊れたりしたので、

sudo pip uninstall pip
sudo apt install --reinstall python-pip python3-pip

として修復し、virtualenvを使うことにした。

aptでpython-virtualenvをインストールして、

virtualenv (workdir)
cd (workdir)
. bin/activate
pip install --upgrade pip
pip install scikit-learn

とすると、scipyのmake中にblasやlapackが無いというエラーになった。
https://scikit-learn.org/stable/developers/advanced_installation.html
によると、scikit-learnのインストールにはlibatlas-devとlibatlas3-baseが必要とのことだが、scipyのmakeには他に、liblapack-devか、もしくはatlasに合わせるならlibatlas-base-devが必要のようだ(どちらでも成功した)。

aptでlibatlas-dev, libatlas3-base, libatlas-base-devをインストールして、改めて

pip install scikit-learn

すると、数十分後にRaspberry Pi 2からの応答が無くなった。scipyのmake中にメモリのスワップ領域が枯渇するようだった。

スワップ領域を1GB追加しても不足したので、2GB追加した。

su -
dd if=/dev/zero of=/swapfile bs=1024 count=2097152
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile

これによって、数時間かかるが、scikit-learnのインストールができるようだ。

ただ、時間がかかるし、makeが失敗して時間を取られるリスクがあるので、やっぱりaptでインストールできるものはaptでインストールすることにした。MLPClassifierと合わせてmatplotlibを使いたいが、もはやpipでmatplotlibをインストールする気にはならない。
現時点で手っ取り早くscikit-learn 0.20.xをインストールするには、以下のようにすれば良いと思う。

sudo apt install python-numpy python-scipy python-virtualenv libatlas-dev libatlas3-base libatlas-base-dev
virtualenv --system-site-packages (dir)
cd (dir)
. bin/activate
pip install --upgrade pip
pip install scikit-learn

※(dir)は任意のディレクトリ名


ただ、本日の時点でpip install scikit-learnとすると、次のようなコンパイルエラーになる。

sklearn/neighbors/quad_tree.c:3582:7: error: format not a string literal and no format arguments [-Werror=format-security]
 printf(__pyx_k_QuadTree_found_a_duplicate);
     ^

この原因は
https://github.com/scikit-learn/scikit-learn/issues/12707
に書かれており、バージョン0.20.1特有の問題で0.20.2で修正されるが、簡単な回避策が無さそうなので、今日は次のようにして0.20.0をインストールした。

pip install scikit-learn==0.20.0

【12/18追記】
Raspbian 8.0 (jessie)の更新は昨年7月に止まってることに気付いた。
安定して動いているシステムをバージョンアップするのは毎度嫌なものだが、さすがにこれを放置するのはまずそうなので、4日かけてRaspbian 9.0 (stretch)にバージョンアップした。
そうすると、aptでインストールできるpython-sklearnのバージョンが0.18になり、MLPClassifierを使うのにpipでscikit-learnをイントスールする必要が無くなった。
しかし、SDカードの空き容量が3Gくらい減ってしまった上に、MovableTypeなといくつかのプログラムの動作がおかしくなってしまった。
インターネットに接続する機器の宿命だと理解するものの、ソフトウェアの更新で動作異常が発生するのは、何度経験してもげんなりする。