機械学習ことはじめにscikit-learnを触ってみた（scikit-learnのサンプルデータセットをmatplotlibで表示するところまで）

## はじめに
初めまして、株式会社じげんの毛援援です。日本に来て３年目で、社会人も３年目です。主にrailsアプリケーションの開発をしてます。よろしくお願い致します。

機械学習を勉強しようと思い、今回初めてscikit-learn（sklearn）に挑戦してみました。

この記事では、インストール手順を含めて、一連の工程をお伝えします。

- インストールする
- sklearnの例（[The Digit Dataset](https://scikit-learn.org/stable/auto_examples/datasets/plot_digits_last_image.html)）を触ってみる
- sklearnを使ってデータセットをダウンロードする
- matplotlibで表示する

sklearnや機械学習に興味がある方や、私と同じく機械学習ビギナーの方は、是非コメントをお願いします。

- **機械学習**：機械学習（きかいがくしゅう、英: machine learning）とは、経験からの学習により自動で改善するコンピューターアルゴリズムもしくはその研究領域で、人工知能の一種であるとみなされている。「訓練データ」もしくは「学習データ」と呼ばれるデータを使って学習し、学習結果を使って何らかのタスクをこなす。例えば過去のスパムメールを訓練データとして用いて学習し、スパムフィルタリングというタスクをこなす、といった事が可能となる。
<br>（https://ja.wikipedia.org/wiki/機械学習 より引用）
- **scikit-learn（sklearn）**：Pythonに基づく機械学習ツールです。
    - 予測データ分析のためのシンプルで効率的なツール
    - NumPy、SciPy、およびmatplotlib上に構築
    - オープンソース、商用利用可能-BSDライセンス
<br>（https://scikit-learn.org/stable より引用）

## 環境
  MacBook Pro 11.6 (2.6 GHz 6コアIntel Core i7)
  python 3.9
  pip 21.3.1
  sklearn 1.0.1
  matplotlib 3.5.0

## インストール
### 1. pipのインストール（pipがインストールされている場合は、ここを無視していいです）
- `curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py`

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2108k  100 2108k    0     0  7052k      0 --:--:-- --:--:-- --:--:-- 7076k
```

- `sudo python3 get-pip.py`

```
WARNING: The directory '/Users/mao/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
     |████████████████████████████████| 1.7 MB 3.9 MB/s
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.3.1
    Uninstalling pip-21.3.1:
      Successfully uninstalled pip-21.3.1
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Successfully installed pip-21.3.1
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
```

- `pip -V` or `pip3 -V` で確認

```
pip 21.3.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
```
### 2. sklearnをインストール
- `pip install -U scikit-learn`
  <br>**注意**: `scikit-learn` には `SciPy` と `NumPy` が必須のパッケージとなります。まだインストールしていない方は `SciPy` と `NumPy` を事前にインストールしておきましょう。

```
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Collecting scikit-learn
  Using cached scikit_learn-1.0.1-cp39-cp39-macosx_10_13_x86_64.whl (8.0 MB)
Requirement already satisfied: scipy>=1.1.0 in /usr/local/lib/python3.9/site-packages (from scikit-learn) (1.7.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.9/site-packages (from scikit-learn) (3.0.0)
Requirement already satisfied: joblib>=0.11 in /usr/local/lib/python3.9/site-packages (from scikit-learn) (1.1.0)
Requirement already satisfied: numpy>=1.14.6 in /usr/local/lib/python3.9/site-packages (from scikit-learn) (1.21.4)
Installing collected packages: scikit-learn
DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Successfully installed scikit-learn-1.0.1
```
#### インストールしたsklearnを確認
- `python3 -m pip show scikit-learn`: scikit-learnでインストールされているバージョンと場所を確認します。

```
Name: scikit-learn
Version: 1.0.1
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: /usr/local/lib/python3.9/site-packages
Requires: joblib, numpy, scipy, threadpoolctl
Required-by:
```

- `python3 -m pip freeze`: 実行中の環境でインストールしたパッケージを表示させます。

```
fonttools==4.28.2
joblib==1.1.0
kiwisolver==1.3.2
matplotlib==3.5.0
numpy==1.21.4
packaging==21.3
pandas==1.3.4
Pillow==8.4.0
pyparsing==3.0.6
python-dateutil==2.8.2
pytz==2021.3
scikit-learn==1.0.1
scipy==1.7.2
setuptools-scm==6.3.2
six==1.16.0
threadpoolctl==3.0.0
tomli==1.2.2
```
- `python3 -c "import sklearn; sklearn.show_versions()"`: ちゃんと動いているかどうかを確認します。

```
System:
    python: 3.9.2 (default, Mar 15 2021, 17:37:51)  [Clang 12.0.0 (clang-1200.0.32.29)]
executable: /usr/local/opt/python@3.9/bin/python3.9
   machine: macOS-11.6-x86_64-i386-64bit

Python dependencies:
          pip: 21.3.1
   setuptools: 54.1.2
      sklearn: 1.0.1
        numpy: 1.21.4
        scipy: 1.7.2
       Cython: None
       pandas: 1.3.4
   matplotlib: 3.5.0
       joblib: 1.1.0
threadpoolctl: 3.0.0

Built with OpenMP: True
```

## sklearnを触ってみる
今回は[The Digit Dataset](https://scikit-learn.org/stable/auto_examples/datasets/plot_digits_last_image.html)をやってみます。
このデータセットは、1797枚8x8の0から9までの手書き数字の画像で構成されています。
下のソースコードは公式ページからの引用です。
数字画像をmatplotlibで表示しています。

```python
# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

from sklearn import datasets

import matplotlib.pyplot as plt

# Load the digits dataset
digits = datasets.load_digits()

# Display the first digit
plt.figure(1, figsize=(3, 3))
plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation="nearest")
plt.show()
```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/c28a12be-73a9-0417-369c-a74a8a4aa345.png)
### 説明
先ほどのソースコードを詳しく見てみます。

- **`from sklearn import datasets`**: sklearnからThe Digit Datasetを導入します。
- **`import matplotlib.pyplot as plt`**: matplotlib.pyplotを導入して、pltという別名が使えます。
    - **`matplotlib.pyplot`**: `matplotlib`のインターフェースです。 これはMATLABのような暗黙的なプロット方法を提供します。 画面上にフィギュアを開き、フィギュアGUIマネージャーとして機能します。
- **`datasets.load_digits()`**: 数字のデータセットをロードして、Dictionary-likeオブジェクト（[Bunch](https://scikit-learn.org/stable/modules/generated/sklearn.utils.Bunch.html#sklearn.utils.Bunch)）を返します。
- **`plt.figure(1, figsize=(3, 3))`**: idは１で、3x3インチの新しいフィギュアを作成します。
    - **`plt.figure(num, figsize)`**: 新しいフィギュアを作成するか、既存のフィギュアをアクティブにします。
        - **`num(int or str or Figure, optional)`**: フィギュアの唯一的な識別子です。`1`ならフィギュア名は`Figure 1`です。もし`'test'`にしたら、識別子とフィギュア名は`test`になります。
        - **`figsize((float, float), default: rcParams["figure.figsize"] (default: [6.4, 4.8]))`**: フィギュアの幅、高さ（インチ）です。

num=1 | num='test'
-- | --
![スクリーンショット_2021-12-07_17_50_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/6381ba01-8296-5efe-94e2-6aa12e394821.png) | ![スクリーンショット_2021-12-07_17_29_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/cce8ec00-d0ea-b6c5-d558-7d5fa856cdee.png)

- **`plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation="nearest")`**: データセット最後の項目を最近傍補間(nearest)して、逆グレースケール画像を作ります。
    - **`plt.imshow(X, cmap, interpolation)`**: データを画像として、つまり2Dの通常のラスターに表示します。
        - **`X(array-like or PIL image)`**: 画像のデータです。`digits.images[-1]`はデータセットの最後の項目です。
        - **`cmap(str or Colormap, default: rcParams["image.cmap"] (default: 'viridis'))`**: Colormapインスタンスまたは登録済みカラーマップ名が入ります。これにより、スカラーデータと色を対応させます。`plt.cm.gray_r`は`plt.cm.gray`と逆です。値が0の時は白で、最大値（8ビットでは255、16ビットでは65,535）では黒です。
        - **`interpolation(str, default: rcParams["image.interpolation"] (default: 'antialiased'))`**: 補間を設定します。`'nearest'`とは最近傍補間（ニアレストネイバー　Nearest neighbor）で、最も近い位置にある画素の輝度値を参照します。

`plt.cm.gray_r` | `plt.cm.gray` | `default: 'antialiased'`
-- | -- | --
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/49403fef-92f5-45b0-96e2-e108b3da775c.png) | ![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/554c7e10-c95f-cc76-8655-9d186fe2ef21.png) | ![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/bef7e6b3-2a5b-8838-195c-aa35b73cf304.png)

`'nearest'` | `default: 'antialiased'` | `'bilinear'` | `'bicubic'`
-- | -- | -- | --
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/49403fef-92f5-45b0-96e2-e108b3da775c.png) | ![antialiased.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/e3fa6598-a043-b775-ca85-efa0e6f72fb3.png) | ![bilinear.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/90dc0a60-819d-065b-5a69-b1754f0f72cc.png) | ![bicubic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294449/26769935-9f22-ac1e-830b-bb81e1dfab98.png)

## 終わりに
今回は初めて簡単なsklearnの例を実行しました。Railsなどと全然違って、新鮮な体験でした。
今後も引き続き、機械学習の勉強を頑張ります。
記事は会社の皆さんが手伝ってくれたおかげで、完了しました。ありがとうございました！！！:tada:

## 参考
- [matplotlib.pyplot](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html): `matplotlib.pyplot`ライブラリの説明です。
- [sklearn.datasets.load_digits](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html#sklearn-datasets-load-digits): `sklearn.datasets.load_digits` メソッドの説明です。
- [sklearn.utils.Bunch](https://scikit-learn.org/stable/modules/generated/sklearn.utils.Bunch.html#sklearn.utils.Bunch): `Bunch`の説明です。
- [matplotlib.pyplot.figure](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html): `matplotlib.pyplot.figure` メソッドの説明です。
- [Matplotlib plt.figure()を使う理由｜FigureとAxesの関係を把握しよう](https://www.yutaka-note.com/entry/matplotlib_figure#Matplotlib%E3%81%AE%E6%8F%8F%E7%94%BB%E9%A0%98%E5%9F%9FFigure%E3%81%A8%E5%BA%A7%E6%A8%99%E8%BB%B8Axes): Figureの説明で、FigureとAxesの関係の説明です。
- [matplotlib.pyplot.imshow](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html#matplotlib-pyplot-imshow): `matplotlib.pyplot.imshow` メソッドの説明です。
- [Interpolations for imshow](https://matplotlib.org/stable/gallery/images_contours_and_fields/interpolation_methods.html): `matplotlib.pyplot.imshow` の内挿の説明です。
- [画素の補間(Nearest neighbor,Bilinear,Bicubic)の計算方法](https://imagingsolution.net/imaging/interpolation/): 最近傍補間などの説明です。