前回のおさらいと今回のテーマ
こんにちは!前回は、ロジスティック回帰モデルを使って分類問題を解く方法について学びました。データの前処理からモデルの訓練、そして予測と評価までの基本的な流れを理解できましたね。
今回は、機械学習モデルの評価方法について解説します。モデルの評価は、実際に構築したモデルがどれだけ性能が良いかを判断するために重要です。正解率(Accuracy)だけでなく、精度、再現率、F1スコア、AUCスコアなど、より深い解析を行うための指標や評価方法について実践していきましょう。
モデル評価の基礎
モデルの性能を正しく評価するためには、データを訓練データとテストデータに分け、訓練データでモデルを学習させ、テストデータでモデルの精度を測ることが基本です。これにより、モデルが未知のデータに対してどれだけ良い予測ができるかを評価できます。
Scikit-learnを使って以下のステップでモデル評価の方法を実践します。
- モデルの予測と評価指標
- 混同行列を使った評価
- 精度、再現率、F1スコア
- ROC曲線とAUCスコア
1. モデルの予測と評価指標
前回実装したロジスティック回帰モデルを例に、まずは基本的な正解率を使って評価します。
モデルの準備
まず、Scikit-learnのbreast_cancer
データセットを使って、ロジスティック回帰モデルを訓練し、テストデータで評価する準備をします。
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
# データの読み込みと準備
cancer = load_breast_cancer()
df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df['target'] = cancer.target
# 特徴量とターゲットの分離
X = df.drop('target', axis=1)
y = df['target']
# データの標準化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# ロジスティック回帰モデルの作成と訓練
model = LogisticRegression()
model.fit(X_train, y_train)
基本的な正解率(Accuracy)の計算
# テストデータで予測
y_pred = model.predict(X_test)
# モデルの正解率
accuracy = model.score(X_test, y_test)
print(f"Accuracy: {accuracy:.2f}")
- 正解率(Accuracy)は、全体のデータの中で正しく予測された割合を示します。しかし、正解率だけでは不十分な場合があるため、他の評価指標も併用します。
2. 混同行列を使った評価
混同行列は、分類問題におけるモデルの性能を詳細に分析するために使用されます。混同行列では、以下の要素を確認できます。
- TP(True Positive): 正しくポジティブクラス(例:悪性と診断)に分類された数
- TN(True Negative): 正しくネガティブクラス(例:良性と診断)に分類された数
- FP(False Positive): ネガティブクラスを誤ってポジティブクラスと分類した数
- FN(False Negative): ポジティブクラスを誤ってネガティブクラスと分類した数
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 混同行列の計算
cm = confusion_matrix(y_test, y_pred)
# 混同行列の可視化
sns.heatmap(cm, annot=True, cmap='Blues', fmt='g')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.title('Confusion Matrix')
plt.show()
混同行列を見ることで、モデルがどのクラスを正しく(または誤って)予測しているかを詳細に把握できます。
3. 精度、再現率、F1スコア
混同行列から、以下の評価指標を計算することができます。
- 精度(Precision): ポジティブと予測したうち、実際にポジティブである割合
- 再現率(Recall): 実際にポジティブであるもののうち、正しくポジティブと予測された割合
- F1スコア: 精度と再現率の調和平均
from sklearn.metrics import precision_score, recall_score, f1_score
# 精度の計算
precision = precision_score(y_test, y_pred)
print(f"Precision: {precision:.2f}")
# 再現率の計算
recall = recall_score(y_test, y_pred)
print(f"Recall: {recall:.2f}")
# F1スコアの計算
f1 = f1_score(y_test, y_pred)
print(f"F1 Score: {f1:.2f}")
- 精度(Precision)は、特に誤検出(FP)を減らしたいときに重視します。
- 再現率(Recall)は、見逃し(FN)を減らすことが重要な場合に重視します。
- F1スコアは、精度と再現率のバランスを評価するために使用され、モデルの全体的な性能を確認するのに役立ちます。
4. ROC曲線とAUCスコア
分類モデルの性能を視覚的に確認するために、ROC曲線とAUCスコアが使用されます。
- ROC曲線(Receiver Operating Characteristic Curve)は、FPR(False Positive Rate)とTPR(True Positive Rate)をプロットしたものです。
- AUCスコア(Area Under the Curve)は、ROC曲線の下の面積を表し、1に近いほどモデルの性能が高いことを示します。
from sklearn.metrics import roc_curve, roc_auc_score
# 予測確率の計算
y_prob = model.predict_proba(X_test)[:, 1]
# ROC曲線の描画
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, marker='.')
plt.title('ROC Curve')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
# AUCスコアの計算
auc_score = roc_auc_score(y_test, y_prob)
print(f"AUC Score: {auc_score:.2f}")
- AUCスコアが1に近いほど、モデルは優れた分類性能を持っていることを意味します。0.5に近い場合、モデルの性能はランダムな予測と変わらないことを示します。
まとめ
今回は、機械学習モデルの評価方法について詳しく解説しました。正解率だけでなく、混同行列や精度、再現率、F1スコア、そしてROC曲線とAUCスコアを使うことで、モデルの性能をより深く理解できます。これらの指標を組み合わせて評価することで、モデルが持つ弱点や改善の余地を見つけ、より高精度なモデルの構築が可能になります。
次回予告
次回は、ハイパーパラメータチューニングとして、グリッドサーチを用いて最適なパラメータを探す方法を解説します。モデルの性能を最大限に引き出すために、ハイパーパラメータの調整方法を学びましょう!
注釈
- 精度(Precision): モデルがポジティブと予測したもののうち、実際に正しい割合。
- 再現率(Recall): 実際にポジティブであるもののうち、モデルが正しく予測
した割合。
- ROC曲線: モデルの分類性能を視覚的に評価するための曲線。AUCスコアが高いほど性能が良い。
コメント