【Python】scikit-learnをインストールできない(pip, pyenv)

Scikit-learnをpipでインストールしようとしたところ、以下のエラーが発生。

 % pip install --no-cache-dir scikit-learn 
Collecting scikit-learn
  Downloading scikit-learn-1.0.2.tar.gz (6.7 MB)
     |████████████████████████████████| 6.7 MB 2.6 MB/s            
  Installing build dependencies ... error
  ERROR: Command errored out with exit status 1:
   command: /Users/kazuoji/.anyenv/envs/pyenv/versions/3.10.1/bin/python3.10 /private/var/folders/f4/y27nzgxx5tj5z47wlnhzmstw0000gp/T/pip-standalone-pip-9xm0_tvt/__env_pip__.zip/pip install --ignore-installed --no-user --prefix /private/var/folders/f4/y27nzgxx5tj5z47wlnhzmstw0000gp/T/pip-build-env-spg_3si1/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- 'setuptools<60.0' wheel 'Cython>=0.28.5' 'oldest-supported-numpy; python_version!='"'"'3.7'"'"' or platform_machine=='"'"'aarch64'"'"' or platform_system=='"'"'AIX'"'"' or platform_python_implementation == '"'"'PyPy'"'"'' 'numpy==1.14.6; python_version=='"'"'3.7'"'"' and platform_machine!='"'"'aarch64'"'"' and platform_system!='"'"'AIX'"'"' and platform_python_implementation != '"'"'PyPy'"'"'' 'scipy>=1.1.0'
       cwd: None
  Complete output (37758 lines):
...

結論

  • Apple M1チップのMacOSの場合、Scikit-learnのインストールがうまくいかない事象あり。
  • バージョン3.10のpythonでは解消できなかった。
  • バージョン3.9.9のpythonに切り替えて、以下の手順で解消。
    • (1) scikit-learnのwheelイメージをダウンロード
    • (2) Anacondaのリポジトリからscipyをインストール
    • (3) pipでScikit-learnをインストール

環境

  • macOC Big Sur 11.6 ( Chip : Apple M1 )
  • pyenv 2.2.3
  • pip 21.3.1
  • python 3.9.9

解消手順

情報源はScikit-learnの公式サイトの「Installing on Apple Silicon M1 hardware」でアナウンスされているgithubリンクから情報を取得している。

githubリンク

(1)scikit-learnのwheelイメージをダウンロード

以下のリンクをクリックし、イメージをダウンロードします。

Scikit-learnのwheelイメージ

(2)Anacondaのリポジトリからscipyをインストール

以下のコマンドでインストールする。

pip install scipy --index-url=https://pypi.anaconda.org/scipy-wheels-nightly/simple

もし以下のようなエラーが出れば、numpyを1.17.3以上にアップグレードして、再実行すると解消できる。

ERROR: Cannot install scipy==1.8.0.dev0+1753.a063cf3, scipy==1.8.0.dev0+1761.be2027d, scipy==1.8.0.dev0+1776.48e1dd7, scipy==1.8.0.dev0+1832.bdf109c, scipy==1.8.0.dev0+1869.838cfbe, scipy==1.8.0.dev0+1921.c30fefc, scipy==1.8.0.dev0+1981.16d9e82, scipy==1.8.0.dev0+1984.f1c6b54, scipy==1.8.0.dev0+2060.9484b9d, scipy==1.8.0.dev0+2082.296b550, scipy==1.8.0.dev0+2083.8dd161d, scipy==1.8.0.dev0+2091.57bf4d6, scipy==1.8.0.dev0+2099.3f05efb, scipy==1.8.0.dev0+2102.f953ba7, scipy==1.8.0.dev0+2203.9256b56, scipy==1.9.0.dev0+1049.c9cdbf2, scipy==1.9.0.dev0+1057.202d03c and scipy==1.9.0.dev0+1091.e569c7a because these package versions have conflicting dependencies.

The conflict is caused by:
    scipy 1.9.0.dev0+1091.e569c7a depends on numpy>=1.17.3
    scipy 1.9.0.dev0+1057.202d03c depends on numpy>=1.17.3
    scipy 1.9.0.dev0+1049.c9cdbf2 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2203.9256b56 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2102.f953ba7 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2099.3f05efb depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2091.57bf4d6 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2083.8dd161d depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2082.296b550 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+2060.9484b9d depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1984.f1c6b54 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1981.16d9e82 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1921.c30fefc depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1869.838cfbe depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1832.bdf109c depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1776.48e1dd7 depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1761.be2027d depends on numpy>=1.17.3
    scipy 1.8.0.dev0+1753.a063cf3 depends on numpy>=1.17.3

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

Numpyをアップグレード

pip install --upgrade numpy

以下でnumpyのバージョンを確認。

pip show numpy

(3)pipでScikit-learnをインストール

以下のコマンドでScikit-learnをインストール。

pip install ダウンロードしたwheelイメージのファイルパス

例えば以下のような感じ。

pip install .wheels/scikit_learn-1.1.dev0-cp39-cp39-macosx_11_0_universal2.whl

確認

以下のコマンドでインストールされていることを確認する。import文でsklearnをimportできるかを確認するでも良い。

 % pip show scikit-learn
Name: scikit-learn
Version: 1.1.dev0
Summary: A set of python modules for machine learning and data mining
Home-page: http://scikit-learn.org
Author: 
Author-email: 
License: new BSD
Location: /Users/kazuoji/.anyenv/envs/pyenv/versions/3.9.9/lib/python3.9/site-packages
Requires: joblib, numpy, scipy, threadpoolctl
Required-by: