python機械学習ライブラリの定番 scikit-learn についてまとめてみた

# scikit-learnとは

Pythonの代表的な機械学習ライブラリで、複雑な機械学習の数式を使うことなく、誰でも簡単に高度なデータ分析を行うことができます。オープンソースでBSDライセンスであるため商用利用可能です。

機械学習といえば、ディープラーニングですが、ディープラーニングの学習には膨大なデータが必要で、データ数が少ないときには精度が上がりにくいです。一方、scikit-learnは、機械学習全般のアルゴリズム（統計学、パターン認識、データ解析の技法など）を簡単に実装でき、特にデータ数が少ない場合は、sciki-learnでデータ分析するメリットは大きいです。

# scikit-learnの実装のイメージ

まずは、簡単にscikit-learnを使ってみます。

``` python:demo.py
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# データを読み込む
iris = load_iris()
X = iris.data[:, :2]
y = iris.target

# 訓練用, テスト用のデータに分ける
X_train, X_test, y_train, y_test =\
    train_test_split(X, y, test_size=0.25, random_state=1)

# 訓練用データでモデルに学習させる
clf = SVC(kernel='linear', random_state=1)
clf.fit(X_train, y_train)

# テスト用データで学習済モデルを評価する
y_pred = clf.predict(X_test)
score = accuracy_score(y_test, y_pred)
print(score)

# 出力: 0.7631578947368421
```

たったこれだけのコードで、機械学習ができます。やったことは、基本的に下記の4つです。

1. データの読み込み (Irisという花の特徴量と種類を読み込みます)
1. 訓練用のデータとテスト用のデータに分ける
1. モデルを訓練
1. モデルで予測 (特徴量から、花の種類を予測します)


学習済モデルを評価した結果 0.763... と表示されます。これは、76.3%の正解率で予測できるモデルということです。
さらに必要に応じて、データの前処理を行なったり、モデルのハイパーパラメータを調整したりして、機械学習の精度を高めていきます。

# scikit-learnに含まれる主な機能

scikit-learnのライブラリは、大きく分けて6つの機能に分類できます。

**機械学習の機能が4つ**

1. クラス分類 (教師あり学習)
1. 回帰 (教師あり学習)
1. クラスタリング (教師なし学習)
1. 次元削減 (教師なし学習)

**学習精度を高めるための機能が2つ**

1. モデル選択
1. 前処理

これらの機能の概要について、以下の公式ドキュメントを読み進めながらまとめていきます。

https://scikit-learn.org/stable/#


### クラス分類 (教師あり学習)

クラス分類とは、ラベル付きのデータを学習して、分類する機能です。例えば、スパムメールの識別や、画像認識に応用できます。
公式ドキュメントでは、input data (一番左の画像) の青と赤の点を分けるために、様々なモデルで評価した結果が並べられています。

![class.png](https://scikit-learn.org/stable/_images/sphx_glr_plot_classifier_comparison_001.png)

簡単なものをいくつか説明していきます。まずは決定木 (Decision Tree) です。これは、条件ごとに場合分けをしていく分類方法です。人の考え方に近いので、一番理解しやすく簡単ですが、分類の精度はあまり良くないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/7e9d914e-15fe-4332-e2c1-30d74762827b.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/a7edb263-ac73-5383-a134-48b2886a292b.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/c0bb7fb7-a982-8aaa-2fd9-5189ed9596f2.png)




決定木を少し発展させた方法が、ランダムフォレストです。木がだめなら、森でどうだというイメージの分類方法です。ランダムに抽出したサンプルに対して決定木で分類し、その結果を多数決などのルールに従って統合するイメージです。単純な方法ですが、決定木よりは分類精度が良くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/f73406e4-e6a8-f544-07f0-79e7398ffb90.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/ea2c286a-9c54-511b-74dc-755431d23c0d.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/fbe99efb-07d4-1bd9-fb0b-4468f7e2690c.png)

次にサポートベクターマシーンによる分類です。マージン最大化を行うことによって、データを線形で分類できます。線形という制約があるため、2番目のデータセットのように、青の点が赤の点に囲まれるようなデータはうまく分離できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/a06ac5eb-0bdb-9751-e798-2c0796a0acca.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/dc4abfc9-1479-35ff-ecf7-debbba42621e.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/80119d6e-961d-5001-23a2-71095c2a12b4.png)

しかし、サポートベクターマシーンは、カーネル関数を設定することで、平面では分離できなかった非線形な分離を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/a37259d6-9472-e087-27b2-05f1af70de06.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/7c54ac95-d97f-fea3-5f9d-bb56f439b17b.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/5cf8f84d-d75c-21e0-154e-00c1769dc753.png)

### 回帰 (教師あり学習)

回帰は、連続する数値についてのデータ分析に向いています。株価の分析や、薬の反応を分析することに応用できます。

簡単な回帰分析であれば、Excelなどで十分ですが、変数が多くなったり、外れ値が多いと分析は複雑になります。scimitar-learnは、そのようなデータの取り扱いも容易で、さらに回帰モデルも、リッジ回帰やラッソ回帰など豊富です。

![regression.png](https://scikit-learn.org/stable/_images/sphx_glr_plot_adaboost_regression_001.png)


### クラスタリング (教師なし学習)

似た特徴を持つデータごとのグループに、自動で分類する機能です。例えば、購買行動から顧客セグメントを分類することなどに応用できます。
クラス分類と同様に、モデルによって結果が異なることがわかります。

![clustering.png](https://scikit-learn.org/stable/_images/sphx_glr_plot_cluster_comparison_001.png)

### 次元削減 (教師なし学習)

データ分析を行うときに、特徴量が多いと、重要度が低いデータが多く含まれることがあります。これらの重要度が低い特徴量が含まれることで、機械学習の処理量が多くなったり、予測精度が悪くなったりします。そこで、多くの特徴量からなる情報を、その意味を保ったまま、それより少ない情報に落とし込むために、次元削減モジュールが使われます。
次元削減は、他の3つの機械学習モデルのように何かを予測するのでなく、次元削減された主成分を返します。この主成分を使って、重要でないデータを多く含んだデータを変換することによって、データ量を圧縮することができます。

### モデル選択

機械学習には、さまざまなモデルがあり、さらにそれぞれのモデルにはその予測性能を大きく左右するハイパーパラメータというものがあります。どのモデルを使って、どのようにハイパーパラメータを設定すれば良いかを判断することは難しいです。そこで、scikit-learnのmodel_selectionモジュールでは、モデルの選択や評価、ハイパーパラメータの決定に役立つさまざまな機能が提供されます。また、そのために、学習済モデルを評価する機能も含まれています。

## 前処理

機械学習では、学習を行う前に正規化や標準化などの前処理を行います。これらの前処理を行うことで、一部のデータの影響だけが増幅されてしまい、偏った学習結果を得ることを避けるためです。scikit-learnのライブラリを使えば、元データが様々な分布を持っていたとしても、機械学習に適した正規化または標準化されたデータに容易に変換することができます。

![preproc.png](https://scikit-learn.org/stable/_images/sphx_glr_plot_map_data_to_normal_001.png)

# チートシート
数多くの機械学習モデルがあるので、どのモデルを使うか迷います。
そんなときは、チートシートが役立ちます。

### 1. カテゴリー予測のとき:
* ラベルありのデータ(教師あり) → クラス分類: 確率的勾配降下法, 線形サポートベクター, k-近傍法, 単純ベイズ etc.
* ラベルなしのデータ(教師なし) → クラスタリング: k-平均法, MiniBatch k-平均法, MeanShift etc.

### 2. カテゴリー予測でないとき:
* 数値を予測するとき → 回帰分析: 確率的勾配降下法, ラッソ回帰, リッジ回帰 etc.
* ただの分析の場合 → 次元削減: 主成分分析, カーネル近似, 次元圧縮 etc.

![ml_map[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80231/bb55c5e9-c2aa-5cb5-adb6-a3b462231c5a.png)

# 参考 

https://www.bigdata-navi.com/aidrops/32/2/

https://techacademy.jp/magazine/17375

https://qiita.com/sugulu_Ogawa_ISID/items/e3fc39f2e552f2355209