Keras(TensorFlow)でモデルを学習させると、`loss` や `accuracy`、`val_loss` などの値が表示されます。 しかし「accuracy が高いのに期待した性能が出ない」「val_loss が上がる理由がわからない」など混乱しがちです。この記事では、Keras に頻出する評価指標を初心者向けにわかりやすく整理し、 実務でどう使うか、グラフの読み方まで解説します。
Keras の評価指標(metrics)とは?
Keras の model.fit() の出力には主に 2 種類の情報があります。
- loss(損失):モデルの誤差を表す数値。小さいほど良い。
- metrics(例:accuracy):問題ごとに定義される「モデルの良さ」を示す指標。
簡単に言えば、loss は「どれだけ間違っているか」、accuracy は「どれだけ当たっているか」です。
loss と accuracy の違いと注意点
✔ loss と accuracy は必ずしも一致しない
loss は確率的誤差を表す指標で、モデルの “確信度” が反映されます。 accuracy が高くても loss が下がらないことがあります。
✔ val_loss が上がるのは過学習の典型
val_loss が途中から上昇していく場合は、モデルが訓練データに過剰適合した 過学習 の典型パターンです。
✔ クラス不均衡データでは accuracy だけを信用してはいけない
例:正常99%、異常1% のデータでは「すべて正常」と予測しても accuracy は99%になります。 そのため Precision / Recall / F1 を使う必要があります(後述)。
分類問題で最も重要な Keras 指標
分類問題で特にクラス不均衡が存在する場合、以下の指標を理解することが重要です。これらの指標は、モデルが何を間違えているか(偽陽性か偽陰性か)を示します。
accuracy(正解率)
全データのうち、正しく分類された割合。2 クラス/多クラス分類でよく使います。
2 クラス/多クラス分類で使われますが、不均衡データでの解釈には注意が必要です。
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
precision(適合率)
モデルが「陽性(ポジティブ)」と予測したうち、実際に陽性であった割合。偽陽性を減らしたい場面で重要です。
モデルが「陽性(ポジティブ)」と予測したうち、実際に陽性であった割合。 偽陽性(誤って陽性と判断するミス)を減らしたい場面(例:スパムメール検出、誤診を避けたい場合)で重要です。
recall(再現率)
実際に陽性のもののうち、モデルが正しく陽性と予測した割合。偽陰性(見逃し)を減らしたい場面(例:がんの検査、不正取引の検出)で重要です。
F1-score
Precision と Recall の調和平均。片方だけ突出している場合にバランスを取る指標で、クラス不均衡問題で特に有用です。 調和平均は、値が小さい方に強く引っ張られるため、PrecisionとRecallのどちらも高くなければF1スコアは上がりません。
Keras で precision / recall を使う例
from tensorflow.keras import metrics
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=[
metrics.Precision(name='precision'),
metrics.Recall(name='recall')
]
)
備考:F1 は Keras に組み込みも可能ですが、エポックごとに正確に算出するにはカスタムメトリクスの実装や、学習後に sklearn で算出するのが一般的です。
回帰問題でよく使う指標
回帰問題(予測値が連続値となる問題)では、予測値と正解値の「距離」を示す誤差指標を使います。
MAE(Mean Absolute Error:平均絶対誤差)
誤差の絶対値の平均。直感的に理解しやすい(平均でどれだけ外れているか)指標です。
model.compile(optimizer='adam', loss='mse', metrics=['mae'])
MSE(Mean Squared Error:平均二乗誤差)
二乗誤差を平均化したもの。誤差を二乗して平均化したもの。外れ値(大きな誤差)に対してMAEよりも強いペナルティを与えます。 大きな予測ミスを避けたい場合に適しています。
RMSE(Root MSE:二乗平均平方根誤差)
MSE の平方根。元の単位に戻るため、解釈しやすい(例:平均で±5円の誤差)という利点があります。
学習曲線の正しい読み方(モデルの良し悪しを判断する)
学習曲線(loss/val_lossの推移グラフ)を観察することで、モデルがどのような状態で学習しているかを判断できます。
- loss と val_loss の差:差が小さければ汎化(未知のデータへの対応力)が良い。差が広がるのは過学習の兆候。
- val_loss の最小点:この点が、モデルの汎化性能が最も高かった時点。EarlyStopping の停止点として使われます。
- accuracy ではなく loss を重視する場面:損失は確率情報(確信度)を含むため、Accuracyよりも情報量が多いです。特に学習の安定性を見るために重要です。
ヒント:学習曲線を必ず保存(CSVLogger 等)して、複数のハイパーパラメータ設定で比較すると改善が早くなります。
例:学習履歴をプロットして見る(history の可視化)
model.fit() の戻り値(History)を使って loss / val_loss を描画する基本コード:
import matplotlib.pyplot as plt
history = model.fit(
x_train, y_train,
validation_data=(x_val, y_val),
epochs=30,
batch_size=32
)
# loss のプロット
plt.plot(history.history['loss'], label='loss')
plt.plot(history.history['val_loss'], label='val_loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()
# accuracy のプロット(分類の場合)
if 'accuracy' in history.history:
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['val_accuracy'], label='val_accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend()
plt.show()
補足:Jupyter 環境では `plt.show()` の代わりに表示が自動で行われます。
実践:コールバックによる安定した学習
学習曲線を観察するだけでなく、その情報を元に学習プロセスを自動で制御するコールバック(Callback)を導入しましょう。
EarlyStopping と ReduceLROnPlateau の組合せ例
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau, CSVLogger
es = EarlyStopping(monitor='val_loss', patience=6, restore_best_weights=True)
rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=3, min_lr=1e-7)
csv_logger = CSVLogger('training_log.csv')
model.fit(
x_train, y_train,
validation_data=(x_val, y_val),
epochs=100,
callbacks=[es, rlrp, csv_logger]
)
この組み合わせにより、最適な学習時点での停止と、学習の停滞時の脱出が可能になり、モデルの安定性が向上します。
まとめ
- loss は「誤差の量」。モデルが最適化すべき対象。
- accuracy は「正解率」。val_loss の上昇は過学習のサイン。
- クラス不均衡データでは、Precision / Recall / F1 を使い、Accuracyに頼らない。
- 回帰 には MAE / MSE / RMSE を使う。回帰問題では、外れ値への影響度に応じて MAE / MSE / RMSE を使い分ける。
- 学習曲線(loss / val_loss)を観察し、EarlyStopping / ReduceLROnPlateau を活用することで安定したモデル改善が可能。 EarlyStoppingとReduceLROnPlateauを活用することで、安定したモデル改善が可能。
これらの基礎を押さえておけば、Keras での学習実験を正しく評価でき、改善サイクルがスムーズになります。問題に応じて適切な指標を選びましょう。

0 件のコメント:
コメントを投稿