機械学習入門 vol.9 判別（分類）

本コンテンツは機械学習入門講座を各所でやっている内容の一部を、受講者の皆様の予習・復習のために公開しているものです。対象読者は、Pythonをやったことがほとんどない方やつまづいてしまっている方でも概ね実行できるようになるレベルで書いています。解説は講座でそれなりに詳しくしているため、コードにコメントする以上の説明はあまり記述していません。

各コードはJupyterシリーズやiPythonで記述しながら実行できるように記述しています。

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)

# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. 機械学習入門 vol.9 判別（分類） -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

# 機械学習入門 vol.9 判別（分類）

第5回の講座では、判別（分類）についての基礎原理と各アルゴリズムの説明をさせていただき、サポートベクターマシン分類器（SVC)、ランダムフォレスト分類器(RandomForestClassifier)、k近傍法分類器(KNeighborsClassifier)を利用して分類の実践を行いました。

本ページのプログラムは、プログラム実行ファイルと同じフォルダに下記データファイルが保存されていることを前提として書いています。ダウンロードしてご利用ください。

データ -> [data2.xlsx](https://docs.google.com/spreadsheets/d/1FmChcarQaKSMSEfY5YCaRv4YE-ULBFoX/edit?usp=sharing&ouid=106210867555036201160&rtpof=true&sd=true)

最初に必要なライブラリのインポートとデータの読み込みをしておきます。またグラフで日本語が文字化けしないように画像・グラフライブラリで利用するフォントを設定しておきます。

```python
# Pandas - データ操作ライブラリ
import pandas as pd
# サポートベクターマシン分類器
from sklearn.svm import SVC
# ランダムフォレスト分類器
from sklearn.ensemble import RandomForestClassifier
# k近傍法分類器
from sklearn.neighbors import KNeighborsClassifier
# テストデータセット分割関数
from sklearn.model_selection import train_test_split
# グラフライブラリ Seaborn
import seaborn as sb
# 描画ライブラリ matplotlib
import matplotlib as mpl
# 描画時のフォントファミリーを設定
mpl.rcParams['font.family'] = 'Hiragino Maru Gothic Pro'
sb.set(font=['Hiragino Maru Gothic Pro'])
```

```python
# データを読み込み
df = pd.read_excel('./data2.xlsx', sheet_name='データ')
df
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28471/875346d1-4d15-83f2-f4a4-fcdbd5f7e4d1.png)

```python
# 名前とクラスを削除
df = df.drop("名前", axis=1)
df = df.drop("クラス", axis=1)
# ペアプロットで描画
sb.pairplot(data=df, hue='分類')
```

```python
# データフレームからトレーニング用データと正解ラベルを配列で取り出し
data   = df.loc[:,'国語':'週の学習時間'].values
labels = df['分類']
# データをトレーニング用と検証用に分割
train_data, test_data, train_labels, test_labels = train_test_split(data, labels, test_size=0.2)
train_data
```

```python
# サポートベクターマシン
svmc = SVC(gamma="scale")
svmc.fit(train_data, train_labels)
# ランダムフォレスト分類器
forest = RandomForestClassifier()
forest.fit(train_data, train_labels)
# K近傍法
knn = KNeighborsClassifier(n_neighbors=6)
knn.fit(train_data, train_labels)
```


```python
# 検証用データをデータフレーム化
df = pd.DataFrame(test_data, columns=['国語','算数','英語','理科','社会','合計点数','週の学習時間'])
df['分類'] = test_labels.values
# サポートベクターマシンで予測
preds_svmc = svmc.predict(test_data)
df['SVM予測分類'] = preds_svmc
# ランダムフォレストで予測
preds_rf = forest.predict(test_data)
df['RF予測分類'] = preds_rf
# k近傍法で予測
preds_knn = knn.predict(test_data)
df['KNC予測分類'] = preds_knn
# 表示
df
```

## 精度検証

回帰の場合は、学習済みモデルを使った予測が正解とどれだけずれているかの差分を可視化することで精度の検証を行うことができました。判別（分類）の場合は、ビジネスシーンや用途に応じて考えなければいけない精度の概念の説明をさせていただき、適合率（Precision)、再現率(Recall)、F値(F-Measure)について説明させていただきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28471/ebdf2bbb-d46d-9bbf-4bc5-16491a11758d.png)

最初に単純に正答率を確認するには下記のように行うことができました。

```python
# 正確性を計算する
from sklearn.metrics import accuracy_score
accuracy_score(test_labels.values, preds_svmc)
```

### 適合率（P値 / Precision)

```python
# P値（Precision・適合率）を計算する
from sklearn.metrics import precision_score
precision_score(test_labels.values, preds_svmc, average=None)
precision_score(test_labels.values, preds_rf, average=None)
precision_score(test_labels.values, preds_knn, average=None)
```


### 再現率(R値 / Recall)

```python
# R値（Recall・再現率）を計算する
from sklearn.metrics import recall_score
recall_score(test_labels.values, preds_svmc, average=None)
recall_score(test_labels.values, preds_rf, average=None)
recall_score(test_labels.values, preds_knn, average=None)
```


### F値（F-measure)

```python
# F値（精度と再現率の調和平均）を計算する
from sklearn.metrics import f1_score
f1_score(test_labels.values, preds_svmc, average=None)
f1_score(test_labels.values, preds_rf, average=None)
f1_score(test_labels.values, preds_knn, average=None)
```

PrecisionとRecallは基本的にはトレードオフとなるお話をさせていただき、P値は予測したものの中に間違ったデータが分類に含まれてしまうケースを表す値、R値は本来予測に入れるべきデータが予測の中から漏れてしまうケースを表す値であり、F値をあげられなくてもユースケースに応じてどちらを重視するかで調整をかければ利用できる可能性があるという流れになるということを覚えておいていただければと思います。


# 機械学習入門シリーズ記事

1. [機械学習入門 vol.1 Pythonの基礎１ 記述とデータ型](https://qiita.com/mychaelstyle/items/500f67b01fda79c215d0) -> 講座第3回に相当
1. [機械学習入門 vol.2 Pythonの基礎2 条件分岐と処理](https://qiita.com/mychaelstyle/items/891dcad83e94f8edd3aa) -> 講座第3回に相当
1. [機械学習入門 vol.3 Pythonの基礎3 関数・クラス・モジュール](https://qiita.com/mychaelstyle/items/d5506f372219b162c8c8) -> 講座第3回に相当
1. [機械学習入門 vol.4 表（Pandas）の基本操作](https://qiita.com/mychaelstyle/items/96ea9e8c679f908205ab) -> 講座第3回/第4回に相当
1. [機械学習入門 vol.5 グラフ(Seaborn)の基本操作](https://qiita.com/mychaelstyle/items/5acf7fdb1f11ba5478d1) -> 講座第3/4回に相当
1. [機械学習入門 vol.6 回帰 - 線形回帰](https://qiita.com/mychaelstyle/items/a12882a75d348952b1b9) -> 講座第4回に相当
1. [機械学習入門 vol.7 回帰 - ランダムフォレストとパラメータチューニング](https://qiita.com/mychaelstyle/items/48238d70c7602ca14a0c) -> 講座第4回に相当
1. [機械学習入門 vol.8 回帰 - その他の回帰 (k近傍法,ラッソ回帰,リッジ回帰..etc)](https://qiita.com/mychaelstyle/items/fc51cf384b517fb405f8) -> 講座第4回に相当
1. 機械学習入門 vol.9 判別（分類） -> 講座第5回に相当
1. [機械学習入門 vol.10 次元削減](https://qiita.com/mychaelstyle/items/69aab0c098dfa1e19e7d) -> 講座第6回に相当
1. [機械学習入門 vol.11 クラスタリング](https://qiita.com/mychaelstyle/items/89d04ce33c3e05d9545c) -> 講座第6回に相当

AI/DX/機械学習/Pythonのアドバイザリー、社内研修、セミナー等承っております。
webサイトからお問い合わせください。
[BeeComb Grid株式会社](https://beecomb-grid.co.jp/)