M1 Mac (Apple Silicon) にPyCaretをインストールする

# はじめに
機械学習ライブラリのPyCaretをM1 Mac (Apple Silicon)にインストールする際に、情報が少なかったのでまとめました。

# 環境
最終的に以下の環境になります
- マシン: MacBook Pro (13-inch, M1, 2020)
- OS: macOS Big Sur 11.3
- 仮想環境 miniforge (conda 4.11.0)
- Python 3.8.12
- pycaret 2.3.5

# インストール

## 失敗する方法

公式ドキュメントには以下のようにしてインストールするようにと書かれています（ここではcondaの仮想環境名をpycaret-envとしています）。

```bash
# create a conda environment
conda create --name pycaret-env python=3.8

# activate conda environment
conda activate pycaret-env

# install pycaret
pip install pycaret

# create notebook kernel connected with the conda environment
python -m ipykernel install --user --name pycaret-env --display-name "pycaret-env"
```

https://pycaret.readthedocs.io/en/latest/installation.html

しかし、`pip install pycaret`をすると以下のようなエラーが出ます

```
Collecting scikit-learn==0.23.2
  Using cached scikit-learn-0.23.2.tar.gz (7.2 MB)
  Installing build dependencies ... error
  ERROR: Command errored out with exit status 1:
   command: /Users/ytakano/miniforge3/envs/test/bin/python3.8 /private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-standalone-pip-0285fuc9/__env_pip__.zip/pip install --ignore-installed --no-user --prefix /private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-build-env-7l2fo1us/overlay --no-warn-script-location --no-binary :none: --only-binary :none: -i https://pypi.org/simple -- setuptools wheel 'Cython>=0.28.5' 'numpy==1.13.3; python_version=='"'"'3.6'"'"' and platform_system!='"'"'AIX'"'"' and platform_python_implementation == '"'"'CPython'"'"'' 'numpy==1.14.0; python_version=='"'"'3.6'"'"' and platform_system!='"'"'AIX'"'"' and platform_python_implementation != '"'"'CPython'"'"'' 'numpy==1.14.5; python_version=='"'"'3.7'"'"' and platform_system!='"'"'AIX'"'"'' 'numpy==1.17.3; python_version>='"'"'3.8'"'"' and platform_system!='"'"'AIX'"'"'' 'numpy==1.16.0; python_version=='"'"'3.6'"'"' and platform_system=='"'"'AIX'"'"'' 'numpy==1.16.0; python_version=='"'"'3.7'"'"' and platform_system=='"'"'AIX'"'"'' 'numpy==1.17.3; python_version>='"'"'3.8'"'"' and platform_system=='"'"'AIX'"'"'' 'scipy>=0.19.1'
       cwd: None
  Complete output (3607 lines):
  Ignoring numpy: markers 'python_version == "3.6" and platform_system != "AIX" and platform_python_implementation == "CPython"' don't match your environment
  Ignoring numpy: markers 'python_version == "3.6" and platform_system != "AIX" and platform_python_implementation != "CPython"' don't match your environment
  Ignoring numpy: markers 'python_version == "3.7" and platform_system != "AIX"' don't match your environment
  Ignoring numpy: markers 'python_version == "3.6" and platform_system == "AIX"' don't match your environment
  Ignoring numpy: markers 'python_version == "3.7" and platform_system == "AIX"' don't match your environment
  Ignoring numpy: markers 'python_version >= "3.8" and platform_system == "AIX"' don't match your environment
  Collecting setuptools
    Using cached setuptools-59.5.0-py3-none-any.whl (952 kB)
  Collecting wheel
    Using cached wheel-0.37.0-py2.py3-none-any.whl (35 kB)
  Collecting Cython>=0.28.5
    Using cached Cython-0.29.25-py2.py3-none-any.whl (983 kB)
  Collecting numpy==1.17.3
    Using cached numpy-1.17.3.zip (6.4 MB)
    Preparing metadata (setup.py): started
    Preparing metadata (setup.py): finished with status 'done'
  Collecting scipy>=0.19.1
    Using cached scipy-1.7.3-cp38-cp38-macosx_11_0_arm64.whl
  Building wheels for collected packages: numpy
    Building wheel for numpy (setup.py): started
    Building wheel for numpy (setup.py): finished with status 'error'
    ERROR: Command errored out with exit status 1:
     command: /Users/ytakano/miniforge3/envs/test/bin/python3.8 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-install-cayqvtc4/numpy_ae51a51f472f4716b4319e0e34fc9477/setup.py'"'"'; __file__='"'"'/private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-install-cayqvtc4/numpy_ae51a51f472f4716b4319e0e34fc9477/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-wheel-fbwxlhbe
         cwd: /private/var/folders/3r/t5k1t9rs7m188tfbtqw2pz380000gn/T/pip-install-cayqvtc4/numpy_ae51a51f472f4716b4319e0e34fc9477/
    Complete output (3261 lines):
    Running from numpy source directory.
(略)
```

## 成功する方法

https://pareekshithkatti.medium.com/setting-up-python-for-data-science-on-m1-mac-ced8a0d05911

こちらの記事によるとPyCaretがM1で動作しないscipyのバージョンを要求するためにインストールができないとのことです。こちらの記事を参考に、インストールをする方法を説明します。

はじめにPython 3.8の仮想環境を構築する部分は同じです。

```bash
# create a conda environment
conda create --name pycaret-env python=3.8

# activate conda environment
conda activate pycaret-env
```

まず、pipを使って、依存するパッケージをインストールせず、pycaretのみをインストールします。

```bash
pip install --no-dependencies pycaret
```

次に必要なパッケージをcondaを使ってインストールします。要求するパッケージ一覧は以下にあります。

https://github.com/pycaret/pycaret/blob/master/requirements.txt

これを元に次のようなファイルを作成します。

```pycaret_requirements.txt
pandas
"scipy<=1.5.4"
numpy==1.19.5
seaborn
matplotlib
IPython
joblib
scikit-learn==0.23.2
ipywidgets
yellowbrick
lightgbm
plotly
wordcloud
textblob
cufflinks
umap-learn
pyLDAvis
"gensim<4.0.0"
"spacy<2.4.0"
nltk
mlxtend
pyod
pandas-profiling
kmodes
mlflow
imbalanced-learn==0.7.0
scikit-plot
Boruta
"pyyaml<6.0.0"
```

元のrequirements.txtから修正するポイントは以下の通りです。

- `>=`で指定されるバージョン指定を削除
- `<`でバージョン指定するものは、condaの引数に渡すときの都合上、ダブルクォーテーションで囲む

このファイルを読み込んで、必要なパッケージをcondaでインストールします。

```bash
cat pycaret_requirements.txt | xargs -n 1 conda install -c conda-forge
```
最後に、作成した環境(pycaret-env)と接続したノートブックカーネルを作成しておきます。

```bash
# create notebook kernel connected with the conda environment
python -m ipykernel install --user --name pycaret-env --display-name "pycaret-env"
```

# おわりに

インストールした環境で、`pycaret.classification`を使った簡単な動作確認は行いました。しかし全ての動作を確認できているわけではない点はご了承ください。

また参考にしたページに書かれている、XGBoostのインストールについては試していません。