Scikit-learn モデル評価

scikit-learnBeginner
オンラインで実践に進む

はじめに

機械学習モデルをトレーニングした後、新しい未知のデータに対する汎化性能を理解するために、そのパフォーマンスを評価することが非常に重要です。機械学習のための強力な Python ライブラリである Scikit-learn は、sklearn.metricsモジュールにモデル評価のための包括的なツールセットを提供しています。

この実験では、最も一般的なメトリクスの一部を使用して分類モデルを評価する方法を学びます。評価プロセスにのみ焦点を当てるために、事前に定義された真のラベルと予測されたラベルのセットを使用します。以下の計算方法を学びます。

  • Accuracy Score (正解率)
  • Confusion Matrix (混同行列)
  • Precision Score (適合率)
  • Recall Score (再現率)
  • F1 Score (F1 スコア)

この実験の終わりには、これらの基本的な Scikit-learn 関数を使用して分類モデルのパフォーマンスを評価するのに熟達しているでしょう。

sklearn.metrics の accuracy_score を使用して精度スコアを計算する

このステップでは、モデルの予測の正解率を計算します。正解率は、最も単純な分類メトリクスの一つです。これは、正しく予測されたインスタンスの数を、全インスタンス数で割った値です。

sklearn.metricsaccuracy_score 関数がこの値を計算します。この関数は、真のラベルと予測されたラベルを引数として取ります。

まず、左側のファイルエクスプローラーから evaluate.py ファイルを開きます。このファイルには既に y_truey_pred のリストが含まれています。次に、accuracy_score 関数をインポートし、正解率を計算して結果を表示するために、以下のコードをファイルの末尾に追加します。

from sklearn.metrics import accuracy_score

## 正解率を計算
accuracy = accuracy_score(y_true, y_pred)

print(f"Accuracy: {accuracy}")

これで、evaluate.py ファイル全体は以下のようになります。

## この実験では、異なる評価メトリクスを理解するために、
## 事前に定義された真のラベルと予測されたラベルのセットを使用します。

## y_true は、データポイントの実際の正解ラベルを表します。
## 二項分類の場合、0 は「ネガティブ」、1 は「ポジティブ」を意味することがあります。
y_true = [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]

## y_pred は、仮説上の分類モデルによって予測されたラベルを表します。
y_pred = [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]

print("Setup complete. True and predicted labels are defined in evaluate.py.")
print(f"True labels:    {y_true}")
print(f"Predicted labels: {y_pred}")

from sklearn.metrics import accuracy_score

## 正解率を計算
accuracy = accuracy_score(y_true, y_pred)

print(f"Accuracy: {accuracy}")

それでは、スクリプトを実行しましょう。IDE でターミナルを開き、以下のコマンドを実行します。

python3 evaluate.py

正解率を含む以下の出力が表示されるはずです。正解率が 0.8 ということは、予測の 80% が正しかったことを意味します。

Setup complete. True and predicted labels are defined in evaluate.py.
True labels:    [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
Predicted labels: [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
Accuracy: 0.8

sklearn.metrics の confusion_matrix を使用して混同行列を生成する

このステップでは、混同行列を生成します。正解率はパフォーマンスの概要を素早く把握できますが、特に不均衡なデータセットの場合、誤解を招く可能性があります。混同行列は、各クラスの正誤予測数を示すことで、分類器のパフォーマンスをより詳細に分解します。

この行列は、予測値と実際の値の 4 つの組み合わせを持つテーブルです。

  • True Negatives (TN): モデルが負のクラスを正しく予測しました。
  • False Positives (FP): モデルが誤って正のクラスを予測しました。
  • False Negatives (FN): モデルが誤って負のクラスを予測しました。
  • True Positives (TP): モデルが正のクラスを正しく予測しました。

sklearn.metricsconfusion_matrix 関数を使用します。以下のコードを evaluate.py ファイルの末尾に追加してください。

from sklearn.metrics import confusion_matrix

## 混同行列を生成
cm = confusion_matrix(y_true, y_pred)

print("Confusion Matrix:")
print(cm)

再度、ターミナルからスクリプトを実行します。

python3 evaluate.py

出力には混同行列が含まれるようになります。

Setup complete. True and predicted labels are defined in evaluate.py.
True labels:    [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
Predicted labels: [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
Accuracy: 0.8
Confusion Matrix:
[[4 1]
 [1 4]]

この行列は以下を示しています。

  • TN = 4 (左上)
  • FP = 1 (右上)
  • FN = 1 (左下)
  • TP = 4 (右下)

sklearn.metrics の precision_score を使用して適合率スコアを計算する

このステップでは、適合率(precision score)を計算します。適合率は、「モデルが陽性と予測した全インスタンスのうち、実際に陽性であった割合はどれくらいか?」という問いに答えます。これは分類器の正確さの尺度です。

適合率は次のように計算されます:適合率 = 真陽性 (True Positives) / (真陽性 (True Positives) + 偽陽性 (False Positives))

適合率が低いということは、偽陽性(False Positives)が多いことを示します。sklearn.metricsprecision_score 関数を使用します。

適合率を計算して表示するために、以下のコードを evaluate.py ファイルの末尾に追加してください。

from sklearn.metrics import precision_score

## 適合率を計算
precision = precision_score(y_true, y_pred)

print(f"Precision: {precision}")

ターミナルからスクリプトを実行します。

python3 evaluate.py

出力に適合率が追加されているのが確認できます。混同行列(TP=4、FP=1)に基づくと、適合率は 4 / (4 + 1) = 0.8 となります。

Setup complete. True and predicted labels are defined in evaluate.py.
True labels:    [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
Predicted labels: [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
Accuracy: 0.8
Confusion Matrix:
[[4 1]
 [1 4]]
Precision: 0.8

sklearn.metrics の recall_score を使用して再現率スコアを計算する

このステップでは、再現率(recall score)を計算します。再現率は、感度(sensitivity)または真陽性率(true positive rate)とも呼ばれ、「実際の陽性インスタンスのうち、モデルが正しく識別できた割合はどれくらいか?」という問いに答えます。これは分類器の網羅性の尺度です。

再現率は次のように計算されます:再現率 = 真陽性 (True Positives) / (真陽性 (True Positives) + 偽陰性 (False Negatives))

再現率が低いということは、偽陰性(False Negatives)が多いことを示します。sklearn.metricsrecall_score 関数を使用します。

再現率を計算して表示するために、以下のコードを evaluate.py ファイルの末尾に追加してください。

from sklearn.metrics import recall_score

## 再現率を計算
recall = recall_score(y_true, y_pred)

print(f"Recall: {recall}")

ターミナルからスクリプトを実行します。

python3 evaluate.py

出力に再現率が含まれるようになります。混同行列(TP=4、FN=1)に基づくと、再現率は 4 / (4 + 1) = 0.8 となります。

Setup complete. True and predicted labels are defined in evaluate.py.
True labels:    [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
Predicted labels: [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
Accuracy: 0.8
Confusion Matrix:
[[4 1]
 [1 4]]
Precision: 0.8
Recall: 0.8

sklearn.metrics の f1_score を使用して F1 スコアを計算する

この最終ステップでは、F1 スコアを計算します。F1 スコアは、適合率(precision)と再現率(recall)の調和平均です。両者のバランスを取ることを目的としています。適合率が偽陽性(false positives)の最小化に焦点を当て、再現率が偽陰性(false negatives)の最小化に焦点を当てるのに対し、F1 スコアは両方を考慮した単一の指標を提供します。

F1 スコアは次のように計算されます:F1 スコア = 2 * (適合率 * 再現率) / (適合率 + 再現率)

特に、適合率と再現率のバランスが必要な場合や、クラスの分布が不均一な場合に有用です。sklearn.metricsf1_score 関数を使用します。

最後のコード片を evaluate.py ファイルに追加してください。

from sklearn.metrics import f1_score

## F1 スコアを計算
f1 = f1_score(y_true, y_pred)

print(f"F1 Score: {f1}")

最後に、ターミナルからスクリプトを実行します。

python3 evaluate.py

最終的な出力には、計算されたすべての指標が表示されます。適合率と再現率が 0.8 の場合、F1 スコアも 0.8 になります。

Setup complete. True and predicted labels are defined in evaluate.py.
True labels:    [0, 1, 1, 0, 1, 0, 0, 1, 0, 1]
Predicted labels: [0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
Accuracy: 0.8
Confusion Matrix:
[[4 1]
 [1 4]]
Precision: 0.8
Recall: 0.8
F1 Score: 0.8

まとめ

実験お疲れ様でした!scikit-learn ライブラリのいくつかの主要な指標を使用して、分類モデルを評価する方法を習得しました。

この実験では、以下のことを実践しました。

  • モデルの全体的なパフォーマンスを把握するために、accuracy_score を使用した**精度(accuracy)**の計算。
  • 真陽性・偽陽性および真陰性・偽陰性の詳細なビューを得るために、confusion_matrix を使用した**混同行列(confusion matrix)**の生成。
  • モデルの正確さを測定するために、precision_score を使用した**適合率(precision)**の計算。
  • モデルの網羅性を測定するために、recall_score を使用した**再現率(recall)**の計算。
  • 適合率と再現率のバランスを見つけるために、f1_score を使用した**F1 スコア(F1 score)**の計算。

これらの指標は、あらゆるデータサイエンティストや機械学習エンジニアにとって基本的なツールです。これらを理解することで、モデルの強みと弱みをより良く診断し、特定の問題に対して適切なモデルを選択することができます。