#82 予測結果の図示と検証

-- Views

October 31, 26

スライド概要

本スライドは、Matplotlibを用いて機械学習モデルの予測結果と確信度(各クラスの予測確率)を可視化・検証する手順を解説したものです。

解説では、以下2つの自作関数を導入しています。

plot_image:指定画像を描画し、予測クラス・確信度・正解クラスを表示します。予測成功時は青文字、失敗時は赤文字で出力します。

plot_value_array:10クラスの予測確率を棒グラフで表し、予測クラスの位置を赤、正解クラスの位置を青で強調表示します。 これらの関数を組み合わせ、plt.subplot を利用して「画像」と「予測確率の棒グラフ」を左右ペアで配置します。

単一サンプルの検証だけでなく、複数サンプル(15枚分など)を一括グリッド表示することで、モデルが誤認しやすい傾向を視覚的に素早く把握できる手法を説明しています。

profile-image

すべてのビジネスパーソンが意思決定プロセスにデータを活用する思考を身につけるため、まずは、データサイエンスの分析を体験していきましょう。SECIモデルの最初の段階、共同化(Socialization)からはじめていきます。 下記のブログで、ここにアップしたスライド、動画を随時、公開中です。 【ブログ】https://tutorial4datascience.blogspot.com/ 【Youtubeチャンネル】https://www.youtube.com/@DataScience_for_everyone 【Kindle】そして、このブログをまとめて書籍にしました!   https://amzn.to/4ryVppn   https://amzn.to/4pGgFb1

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

(ダウンロード不可)

関連スライド

各ページのテキスト
1.

5th STEP ディープラーニング Section 8 予測結果の図示と検証 データサイエンス チュートリアル 1

2.

予測結果の図示 np.argmax(predictions[数字]) で、画像が何かを予測できるようになりました。 これ以降は、右図のように『予測結果の一部を一覧で 表示し、確率をグラフで図示する』コードを体験してみま しょう。 画像と確率がグラフで分かりやすいですね。出来上がった モデルをプレゼンテーションする際に、非常に説得力のあ る方法ですので、さっそくコードを見ていきましょう。 ※ Matplotlibが中心になりますので、興味のある方は、 下記を参照してください。 【参考】matplotlib – GridSpec で図の中に複数のグラフを作成する 方法 興味が湧かない方は、こういうコードもあると頭の片隅に でも記憶しておいて、使う場面があったらコピペしましょう。 データサイエンス チュートリアル 2

3.

自作の関数 ここでは、自作の関数を作成し、『予測結果の一部を一 覧で表示し、確率をグラフで図示する』コードを書いていき ます。 def 関数名(引数): 処理内容 関数名は自由に決めることができますが、慣習としてすべて 小文字にします。関数名に複数の単語を使う時は、単語の 間に『_』を使います。 右に、簡単な例を挙げておきます。 『while』は、条件を満たさなくなったら繰返し処理(ルー プ)を終了するものです。以前解説した『forループ』では、 指定された回数繰り返すと終了でしたので、繰返し処理 (ループ)の条件が異なりますね。 【参考】#35 データの結合 https://tutorial4datascience.blogspot.com/2024/03/35.html データサイエンス チュートリアル 3

4.

画像と予測ラベルを表示する関数 (1) チュートリアルのコードを見てみましょう。前半の部分は、自作の関数『plot_image』を定義したもので、それは、指定した1 枚の画像を表示し、その下に『予測結果』、『確率(%)』、『実際の正解』をテキストで表示させる関数です。 データサイエンス チュートリアル 4

5.

画像と予測ラベル等を表示する関数 (2) 1行目 『plot_image』関数は、画像分類モデルの予測結果画像とその画像に対する予測ラベル、予測確率 (確信度)、正解ラベルを一緒にプロット(可視化)するための関数であることを定義しています。 2行目 1.データの取り出しと設定: true_label, img = true_label[i], img[i] で、指定されたインデックス i 番目の『正解ラベル』と『画像データ』を取得します。 3~5行目 2.プロットの初期化: plt.grid(False) でグリッド線を非表示にし、plt.xticks([]), plt.yticks([]) で 目盛りを非表示にしています。 7行目 3.画像の描画: plt.imshow(img, cmap=plt.cm.binary) で、画像を白黒(バイナリ)のカラー マップで描画します。 9~13行目 4.予測結果の判定と色の決定: predicted_label = np.argmax(predictions_array) で、モデル の出力(確率配列)の中で最も確率が高いクラスのインデックスを取得します。 それが正解ラベルと 一致していれば青色 (blue)、間違っていれば赤色 (red) をテキストの色として設定します。 15~18行目 5.ラベル(テキスト)の追加: plt.xlabel(...) で画像の下部にラベルを追加します。表示される内容は 以下の形式です。 [予測したクラス名] [予測の確信度 (%)] ([正解のクラス名]) この文字の色は、 先ほど判定した色(正解なら青、不正解なら赤)になります。 データサイエンス チュートリアル 5

6.

10個のクラスの予測確率を棒グラフで表示する関数 (1) 後半の部分は、自作の関数『plot_value_array』を定義したもので、それは、モデルが出力した10個のクラスごとの確 率を、0~1の範囲の棒グラフで可視化させるものです。 データサイエンス チュートリアル 6

7.

10個のクラスの予測確率を棒グラフで表示する関数 (2) 1行目 『plot_value_array』関数は、モデルの予測結果(各クラスの確率)を棒グラフとして視覚化するた めの関数であることを定義しています。 2行目 1.指定されたインデックス 『i』に対応する実際の正解ラベルを取得します。 3行目 2.グラフのグリッド(目盛線)を非表示にします。 4行目 3.X軸の目盛りを 0 から 9 の範囲(合計10クラス)に設定します。 5行目 4.Y軸の目盛りラベルを非表示にします。 6行目 5.10個のクラスの予測確率を棒グラフとして描画します。初期状態の棒の色はグレー (#777777)に設定します。 7行目 6.Y軸の表示範囲を 0 から 1(0%~100%)に制限します。 8行目 7.予測配列(predictions_array)の中で、最も確率が高い値のインデックス(モデルの予測 ラベル)を取得します。 データサイエンス チュートリアル 7

8.

10個のクラスの予測確率を棒グラフで表示する関数 (3) 10行目 8.モデルが予測したラベルに対応する棒の色を『赤(red)』に変更します。 11行目 9.実際の正解ラベルに対応する棒の色を『青(blue)』に変更します。 ※ もしモデルの予測が正解だった場合(predicted_label == true_label)、同じ棒に対して 赤を設定した後に青で上書きするため、結果として棒は青一色になります。 もしモデルの予測が 不正解だった場合(predicted_label != true_label)、予測した箇所の棒は赤、本来の 正解の箇所の棒は青になり、一目で間違えた箇所と正解の箇所が分かるようになります。 データサイエンス チュートリアル 8

9.

予測を検証する (1) では、予測を検証するために、テスト用データ セットの最初の画像(インデックス 0)について、 モデルの予測画像と各クラスの予測確率の棒 グラフを左右に並べて表示するコードを実行し てみましょう。 1行目:表示したいテストデータのインデックス を指定 1 2 3 4 5 6 7 i=0 plt.figure(figsize=(6,3)) plt.subplot(1,2,1) plot_image(i, predictions[i], test_labels, test_images) plt.subplot(1,2,2) plot_value_array(i, predictions[i], test_labels) plt.show() 2行目:描画するグラフ全体のサイズを『横6 インチ、縦3インチ』に設定 3行目:画面を1行2列に分割し、その『1つ 目(左側)』のエリアを操作対象に します。 データサイエンス チュートリアル 9

10.

予測を検証する (1) 4行目:そのエリアに対して、先ほど定義した plot_image 関数を呼び出し、1枚目の画像と、予測結果のテキスト (正解なら青、不正解なら赤)を描画します。 5行目:キャンバスの「2つ目(右側)」のエリアを選択します。 6行目:そのエリアに対して、先ほど定義した plot_value_array 関数を呼び出し、10個のクラスごとの予測確率を示す 棒グラフを描画します。 7行目:パソコンの画面上に出力・表示します 画像(インデックス 0)について、モデルの予測画像、予測結果、各クラスの予測確率の棒グラフが左図のように表示されま した。 データサイエンス チュートリアル 10

11.

予測を検証する (2) 予測を検証するために、テスト用データセットの別 の画像(インデックス 12)についても同様に表 示させることができます。 確率が一番大きい棒グラフ(クラス 5)が、赤色 になっていますね。 これは、予測が間違っていたことを示します。確か に画像はSandalに似ていますね・・・。 データサイエンス チュートリアル 11

12.

予測を検証する (3) それでは、複数の予測を表示さ せましょう。 右図が、テスト用データセットの 最初の15個(5行 × 3列)の データに対して、それぞれの画像 (予測結果含む)と予測確率 の棒グラフを並べて一括で表示 するコードです。 個別に1個ずつ確認するのでは なく、15枚の画像とモデルの予 測分布を一度に並べて確認す ることができます。 1 2 3 4 5 6 7 8 9 10 11 num_rows = 5 num_cols = 3 num_images = num_rows*num_cols plt.figure(figsize=(2*2*num_cols, 2*num_rows)) for i in range(num_images): plt.subplot(num_rows, 2*num_cols, 2*i+1) plot_image(i, predictions[i], test_labels, test_images) plt.subplot(num_rows, 2*num_cols, 2*i+2) plot_value_array(i, predictions[i], test_labels) plt.tight_layout() plt.show() これにより、モデルがどのような種類の画像(例えばコートとプルオーバーなど)に対して予測を間違いやすいかを視覚的に素 早く把握することができます。 確率が高い場合でも、モデルが間違っていることがあることに注意してください。 データサイエンス チュートリアル 12

13.

予測を検証する (3) 結果を見ると、 15枚の画像とモデルの予測分 布が一覧で表示されました。 これにより、モデルがどのような種類の画像(例 えばコートとプルオーバーなど)に対して予測を 間違いやすいかを視覚的に素早く把握すること ができます。 確率が高い場合でも、モデルが間違っているこ とがあることに注意してください。 データサイエンス チュートリアル 13

14.

予測を検証する (4) 1~2行目 1.描画するグリッドの行数と列数を指定します。 3行目 2.表示するトータルの画像数を計算します(5 × 3 = 15個)。 4行目 3.描画する全体のサイズを指定します。 1ペアあたり『横4インチ、縦2インチ』のサイズで、全体としては『横12インチ、縦10インチ』になります。 5行目 4.15回ループを回して、画像とグラフを順に並べていきます。 6~7行目 5.左側(画像表示)の設定をしています。画面全体を『5行、6列』に分割したうちの、奇数番目 (2×i+1)の位置に画像を配置します。 8 ~9行目 6.右側(棒グラフ)の設定をしています。画面全体を『5行、6列』に分割したうちの、偶数番目 (2 × i+2)の位置に予測確率のグラフを配置します。 10行目 7.各グラフが重ならないように自動で綺麗に配置を調整します。 11行目 8.完成した15ペアのグラフを表示します。 データサイエンス チュートリアル 14