機械学習モデルを評価する

完了

そのため、予測モデルをトレーニングしました。 それが何か良いかどうかをどのように知るのですか?

モデルを評価するには、保持した検証データを使用する必要があります。 教師あり機械学習モデルの場合、このアプローチでは、モデルによって予測されるラベルを検証データセット内の実際のラベルと比較できます。 予測を真のラベル値と比較することで、評価メトリックの範囲を計算して、モデルの予測パフォーマンスを定量化できます。

回帰モデルの評価

回帰モデルは数値を予測するため、モデルの予測パフォーマンスを評価するには、予測値と検証データセット内の実際のラベル値の違いを考慮する必要があります。 検証データセットには複数のケースが含まれており、その一部には他のケースよりも正確な予測が含まれる場合があるため、違いを集計し、パフォーマンスの全体的なメトリックを決定する方法が必要です。 回帰モデルの評価に使用される一般的なメトリックは次のとおりです。

  • 平均二乗誤差 (MSE):このメトリックは、各予測と実際の値の差を 2 乗し、2 乗差をまとめて加算し、平均 (平均) を計算することによって計算されます。 値を 2 乗すると、差が 絶対 になり (差が負か正かを無視して)、より大きな差に重みが与えられます。
  • 2 乗平均平方根誤差 (RMSE): MSE メトリックは、モデルの予測における誤差のレベルを示す適切な指標ですが、ラベルの実際の測定単位には関係しません。 たとえば、売上 (米ドル単位) を予測するモデルでは、MSE 値は実際にはドルの 2 乗値を表します。 予測がドルでどの程度離れているかを評価するには、MSE の平方根を計算する必要があります。
  • 決定係数 (R2): R2 メトリックは、二乗された特徴量と予測値の間の相関関係を測定します。 これにより、モデルで説明できる分散の量を測定する 0 から 1 の値が得られます。 この値が 1 に近いほど、モデルの予測が優れています。

ほとんどの機械学習フレームワークには、これらのメトリックを計算するクラスが用意されています。 たとえば、Spark MLlib ライブラリには RegressionEvaluator クラスが用意されています。このクラスは、次のコード例に示すように使用できます。

from pyspark.ml.evaluation import RegressionEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
evaluator = RegressionEvaluator()
evaluator.setPredictionCol("prediction")
mse = evaluator.evaluate(predictions_df, {evaluator.metricName: "mse"})
rmse = evaluator.evaluate(predictions_df, {evaluator.metricName: "rmse"})
r2 = evaluator.evaluate(predictions_df, {evaluator.metricName: "r2"})
print("MSE:", str(mse))
print("RMSE:", str(rmse))
print("R2", str(r2))

分類モデルの評価

分類モデルは、可能な各クラスの確率値を計算し、最も高い確率でクラス ラベルを選択することで、カテゴリ ラベル (クラス) を予測します。 分類モデルの評価に使用されるメトリックは、検証データセット内の実際の既知のラベルと比較した場合に、これらのクラス予測が正しかった頻度を反映します。 分類モデルの評価に使用される一般的なメトリックは次のとおりです。

  • 精度: モデルによって正しく行われたクラス予測の割合を示す単純なメトリック。 これは分類モデルのパフォーマンスを評価する明白な方法のように思えるかもしれませんが、モデルを使用して、人が車、バス、またはトラムで通勤するかどうかを予測するシナリオを検討してください。 たとえば、検証セットのケースの 95% は車を使用し、3% バスに乗り、2% トラムに乗るとします。 車を常に予測するモデルは、実際には 3 つのクラスを区別する予測能力がないにもかかわらず、95% 正確になります。
  • クラスごとのメトリック:
    • 適合率: 指定したクラスの予測が正解であった割合。 これは 、真陽性 (このクラスの正しい予測) の数を、このクラスの予測の合計数 ( 偽陽性を含む) で割った値として測定されます。
    • 再現率:このクラスの実際のインスタンスの中で正しく予測された割合です。(これは、真陽性の数を、このクラスの検証データセット内のインスタンスの総数、偽陰性を含む、で割ったものに相当します。モデルが異なるクラスを誤って予測したケースが偽陰性です。)
    • F1 スコア: 精度と再現率の組み合わせメトリック (精度と再現率の 調和平均 として計算されます)。
  • すべてのクラスの適合率再現率F1 の複合 (重み付けされた) メトリック。

回帰に関しては、ほとんどの機械学習フレームワークには、分類メトリックを計算できるクラスが含まれています。 たとえば、次のコードでは、Spark MLlib ライブラリの MulticlassClassificationEvaluator を使用しています。

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
accuracy = evaluator.evaluate(predictions_df, {evaluator.metricName:"accuracy"})
print("Accuracy:", accuracy)

labels = [0,1,2]
print("\nIndividual class metrics:")
for label in sorted(labels):
    print ("Class %s" % (label))
    precision = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                    evaluator.metricName:"precisionByLabel"})
    print("\tPrecision:", precision)
    recall = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                 evaluator.metricName:"recallByLabel"})
    print("\tRecall:", recall)
    f1 = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                             evaluator.metricName:"fMeasureByLabel"})
    print("\tF1 Score:", f1)
    
overallPrecision = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedPrecision"})
print("Overall Precision:", overallPrecision)
overallRecall = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedRecall"})
print("Overall Recall:", overallRecall)
overallF1 = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedFMeasure"})
print("Overall F1 Score:", overallF1)

教師なしクラスタリング モデルの評価

教師なしクラスタリング モデルには、既知の真のラベル値がありません。 クラスタリング モデルの目的は、特徴に基づいて類似のケースをクラスターにグループ化することです。 クラスターを評価するには、クラスター間の分離レベルを示すメトリックが必要です。 クラスター化されたケースは、多次元空間にプロットされたポイントと考えることができます。 同じクラスター内のポイントは互いに近く、別のクラスター内のポイントから離れている必要があります。

そのようなメトリックの 1 つは 二乗ユークリッド距離を計算し、クラスター内の一貫性を示すシルエットメジャーです。 シルエット値は 1 から -1 の間で指定できます。値は 1 に近く、クラスター内のポイントが同じクラスター内の他のポイントに近く、他のクラスターのポイントから遠く離れていることを示します。

Spark MLlib ライブラリには ClusteringEvaluator クラスが用意されています。このクラスは、次に示すように、クラスタリング モデルによって行われた予測の シルエット を計算します。

from pyspark.ml.evaluation import ClusteringEvaluator
from pyspark.ml.linalg import Vectors

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted cluster

# Use an evaluator to get metrics
evaluator = ClusteringEvaluator(predictionCol="prediction")
silhouetteVal  = evaluator.evaluate(predictions_df)
print(silhouetteVal)