機械学習による分析
広島大学 AI・データイノベーション教育研究センター
村上 祐子

目標
デジタル化された画像データを機械学習で分類することができる。
この授業で紹介すること• サポートベクトルマシンを用いた画像データの分類• 性能評価の方法
キーワード
分類器、サポートベクトルマシン、正解率、適合率、再現率、F値「画像データのデジタル化」で作成したデータを使います。

この講義ではGoogle Colab(Colaboratory)を使ったプログラミングを実施します。
2

こんなことはありませんか？
100枚程度の写真から山が主に映っている写真と人が主に映っている写真を分ける過程を自動化したいと思います。プログラムではどのようにこの作業を行っているのでしょうか？

3機械学習における分類
分類とはデータを共通の性質に基づいて種類に分けること
境界線• 機械学習の分類では① 種類に分けるための境界線を決める② 決めた境界線にしたがってデータを分けるという操作が行われている• ①、②を行うアルゴリズムを分類器という

4データの境界線の種類
線形分類器
データを一本の直線で分類できる場合に使用するアルゴリズム

非線形分類器データを一本の直線で分類できない場合に使用するアルゴリズム

5データの境界線の種類
線形分類器
データを一本の直線で分類できる場合に使用するアルゴリズム• 単純パーセプトロン• 線形サポートベクトルマシン• ロジスティック回帰

非線形分類器データを一本の直線で分類できない場合に使用するアルゴリズム• k-近傍法• 決定木（分類木）• ランダムフォレスト• サポートベクトルマシン• ニューラルネットワーク

6

サポートベクトルマシン
1. クラスを分類する境界線の候補を決める。

3. 各クラスのサポートベクトルからの距離が最も遠い境界線を選択する。

サポートベクトル

分類線
特徴量２2. 候補の境界線から各クラスに属する最も近いデータを見つける。
このデータを含む直線をサポートベクトルと呼ぶ。

サポートベクトル

特徴量１

7

例題①
サポートベクトルマシンを使ってリバーシの勝ち負けを判定する分類器を作ります。次ページのプログラムを実行してみましょう。
「画像データのデジタル化」の最後の問題を実行した後に実施してください。

8

例題①
import numpy as npfrom sklearn import model_selection
x = np.array(df_all.drop('winner', axis=1))

y = np.array(df_all['winner'])
test_size = 0.9
data_train, data_test, label_train, label_test ¥= model_selection.train_test_split(x, y, test_size=test_size)
from sklearn import svm
clf = svm.SVC()
clf.fit(data_train, label_train)
9例題②分類器でリバーシの勝敗を分類できるか、１回分の勝負で判定してみましょう。次のページのプログラムはリバーシ勝負一回分のデータを作成しています。(黒が10個で白が勝つ。)
勝ち負けの判定は合っているでしょうか？
df_test = make_table_reversi(10)print(clf.predict(df_test))

10解説
import numpy as np
from sklearn import model_selection
x = np.array(df_all.drop('winner', axis=1))
y = np.array(df_all['winner'])x:目的変数y:説明変数Index

1番目のマス2番目のマス… 36番目のマス

勝敗

0

白

黒… 白

白

1

白

白

… 黒

黒

2

黒

黒

… 白

白
11

解説
• 「分類器の作成に使うデータ」と「作成した分類器の精度を検証するためのデータ」に分ける• この割合は状況によって決める

test_size = 0.9

全データのうち「作成した分類器の精度を検証するためのデータ」の割合• 0.9×60(全データ数)=54• 分類器の作成に使うデータは60-54=6

data_train, data_test, label_train, label_test ¥= model_selection.train_test_split(x, y, test_size=test_size)

12

解説

from sklearn import svm

clf = svm.SVC()• アルゴリズムの選択

clf.fit(data_train, label_train)• 分類器の作成

13

解説
勝敗の判定が出力される。
df_test = make_table_reversi(10)print(clf.predict(df_test))

出力
1
-1

勝ち負け
白の勝ち
黒の勝ち

実際の勝敗が一致しないこともある。
一致しないことが多いと分類器を安心して使えない。
作成した分類器は性能評価が必要。
14

機械学習モデルの性能評価• 分類器の性能評価の指標は複数ある• 指標を評価するには混同行列を作成しておくと便利

混同行列•

実際の結果と分類器による予測結果を表にしたもの
実際の結果

予測結果

正
負

正
True Positive (TP)負False Positive (FP)

False Negative (FN)

True Negative (TN)

↑状況によって解釈を変える。

15

機械学習モデルの性能評価
正解率：Accuracy
全データのうち正しく予測できた割合「白が勝ち」の分類のものは予測でも「白が勝ち」になり、「白が負け」の分類のものは予測でも「白が負け」となった割合
𝑇𝑃 + 𝑇𝑁
𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦 =𝑇𝑃 + 𝐹𝑃 + 𝑇𝑁 + 𝐹𝑁

実際の結果
白の勝ち
予測結果

白の勝ち
白の負け

True Positive (TP)
False Negative (FN)

白の負け

False Positive (FP)True Negative (TN)16

機械学習モデルの性能評価
適合率(精度)：Precision
正（白が勝ち）と予測したデータが実際に正しい割合「白が勝ち」と予測分類されたもののうち、実際に「白が勝ち」だった割合
𝑇𝑃𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛 =𝑇𝑃 + 𝐹𝑃

実際の結果
白の勝ち
予測結果

白の勝ち
白の負け

True Positive (TP)
False Negative (FN)

白の負け

False Positive (FP)True Negative (TN)17

機械学習モデルの性能評価
再現率(検出率、感度)：Recall
実際に正であるものを正しく抽出できる割合
実際に「白が勝ち」であるもののうち、「白が勝ち」だと予測できた割合
𝑇𝑃
𝑅𝑒𝑐𝑎𝑙𝑙 =𝑇𝑃 + 𝐹𝑁

実際の結果
白の勝ち
予測結果

白の勝ち
白の負け

True Positive (TP)
False Negative (FN)

白の負け

False Positive (FP)True Negative (TN)18

機械学習モデルの性能評価
F値：F-measure
適合率と再現率の調和平均• 精度は高くても、検出率が低いモデルでないか• 検出率は高くても、精度が低くなっていないかを評価する指標
2 ∗ 𝑅𝑒𝑐𝑎𝑙𝑙 ∗ 𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛
𝐹𝑚𝑒𝑎𝑠𝑢𝑟𝑒 =𝑅𝑒𝑐𝑎𝑙𝑙 + 𝑃𝑟𝑒𝑐𝑖𝑠𝑖𝑜𝑛

実際の結果
白の勝ち
予測結果

白の勝ち
白の負け

True Positive (TP)
False Negative (FN)

白の負け
False Positive (FP)True Negative (TN)19

問題
機械学習モデルの性能評価をしてみましょう。
1. 以下のプログラムを実行して、前ページの表を埋めましょう。
label_pre = clf.predict(data_test)from sklearn.metrics import confusion_matrix
tn, fp, fn, tp= confusion_matrix(label_test, label_pre).flatten()print(tp)print(fp)print(fn)print(tn)

2. 正解率、適合率(精度)、再現率(検出率、感度)、F値を計算しましょう。
20