損失関数は、モデルトレーニングの最適化ターゲットとして、またモデル品質の評価指標として使用できます。しかし、通常、人々はモデルの品質を他の角度から評価します。
評価指標です。通常、損失関数はMAE、MSE、CategoricalCrossentropyなどの評価指標として使用できます。これらも一般的に使用される評価指標です。
ただし、評価指標は、AUC、精度、精度などの損失関数として使用できません。評価指標は連続的な導出を必要としないため、通常、損失関数は連続的な導出を必要とします。
モデルをコンパイルするときに、複数の評価指標をリストの形式で指定できます。
必要に応じて、評価指標をカスタマイズすることもできます。
カスタム評価インデックスは、入力パラメーターとして2つのテンソルy_trueおよびy_predを受け取り、評価値としてスカラーを出力する必要があります。
また、tf.keras.metrics.Metricをサブクラス化し、初期化メソッド、update_stateメソッド、および結果メソッドを書き換えて、評価インジケーターの計算ロジックを実現し、評価インジケータークラスの実装形式を取得することもできます。
トレーニングプロセスは通常バッチで実行されるため、評価指標はエポックを実行した後にのみ取得できます。したがって、カテゴリーの形の評価指標がより一般的です。つまり、インジケーター結果の計算に関連するいくつかの中間変数を作成する初期化メソッドを記述し、各バッチの後で関連する中間変数の状態を更新するupdate_stateメソッドを記述し、最終的なインジケーター結果を出力する結果メソッドを記述する必要があります。
評価指標を関数形式で記述した場合、エポック内の各バッチで計算された評価指標結果の平均のみを、エポック全体の評価指標結果として取得できます。通常、この結果は、エポックデータ全体を一度に計算した結果とは異なります。
1つは、一般的に使用される組み込みの評価指標
-
MeanSquaredError(回帰に使用される平方差エラーは、MSEと省略できます。関数形式はmseです)
-
MeanAbsoluteError(回帰に使用される絶対値エラーは、MAEと省略できます。関数形式はmaeです)
-
MeanAbsolutePercentageError(回帰に使用される平均パーセンテージエラーはMAPEと省略できます。関数形式はmapeです)
-
RootMeanSquaredError(回帰に使用される二乗平均平方根誤差)
-
精度(分類に使用される精度は、文字列 "精度"で表すことができます。精度=(TP + TN)/(TP + TN + FP + FN)、y_trueおよびy_predは、カテゴリのシリアル番号でコーディングする必要があります)
-
精度(精度率、バイナリ分類に使用、精度= TP /(TP + FP))
-
リコール(リコール率、バイナリ分類に使用、リコール= TP /(TP + FN))
-
TruePositives(バイナリ分類に使用される実際の例)
-
TrueNegatives(バイナリ分類に使用される真の負の例)
-
FalsePositives(二分分類に使用される偽陽性)
-
FalseNegatives(バイナリ分類に使用される偽陰性の例)
-
AUC(ROC曲線下の面積(TPR対FPR)、バイナリ分類に使用、正のサンプルと負のサンプルをランダムに描くと直感的に解釈、正のサンプルの予測値は負のサンプルの確率よりも大きい)
-
CategoricalAccuracy(分類精度率。Accuracyと同じ意味で、y_true(ラベル)がonehotエンコーディング形式である必要があります)
-
SparseCategoricalAccuracy(精度と同じ意味を持ち、シリアル番号エンコード形式であるy_true(ラベル)が必要なスパース分類精度率)
-
MeanIoU(画像のセグメンテーションに一般的に使用されるIntersection-Over-Union)
-
TopKCategoricalAccuracy(複数カテゴリのTopK精度、y_true(ラベル)がワンホットエンコーディング形式である必要があります)
-
SparseTopKCategoricalAccuracy(スパースマルチカテゴリTopK精度、シリアル番号エンコード形式であるy_true(ラベル)が必要)
-
意味する
-
合計(要約)
第二に、カスタム評価指標
金融リスク管理の分野で一般的に使用されているKS指標を例として使用して、カスタム評価指標を示します。
KSインデックスはバイナリ分類の問題に適しており、その計算方法はKS = max(TPR-FPR)です。
ここで、TPR = TP /(TP + FN)およびFPR = FP /(FP + TN)
TPR曲線は実際には陽性サンプルの累積分布曲線(CDF)であり、FPR曲線は実際には陰性サンプルの累積分布曲線(CDF)です。
KSインジケーターは、ポジティブサンプルとネガティブサンプルの累積分布曲線の差の最大値です。
import numpy as np import pandas as pd import tensorflow as tf from tensorflow.keras インポートレイヤー、モデル、損失、メトリック #函数形式的自定义评評価指标 @ tf.function def ks(y_true、y_pred): y_true = tf.reshape( y_true、(-1 、)) y_pred = tf.reshape(y_pred、(-1 、)) length = tf.shape(y_true)[0] t = tf.math.top_k(y_pred、k = length、sorted = False ) y_pred_sorted = tf.gather(y_pred、t.indices) y_true_sorted = tf.gather(y_true、t.indices) cum_positive_ratio =tf.truediv( tf.cumsum(y_true_sorted)、tf.reduce_sum(y_true_sorted)) cum_negative_ratio = tf.truediv( tf.cumsum( 1-y_true_sorted)、tf.reduce_sum(1- y_true_sorted)) ks_value = tf.fduce_max abs(cum_positive_ratio- cum_negative_ratio)) return ks_value y_true = tf.constant([[1]、[1]、[1]、[0]、[1]、[1]、[1]、[0]、[0 ]、[0]、[1]、[0]、[1 ]、[0]]) y_pred = tf.constant([[0.6]、[0.1]、[0.4]、[0.5]、[0.7]、 [0.7]、[0.7 ]、 [ 0.4]、[0.4]、[0.5]、[0.8]、[0.3]、[0.5]、[0.3 ]]) tf。印刷(ks(y_true、y_pred))
0.625
#类形式的自定义评估指标 クラスKS(metrics.Metric): デフ __init__(自己、名前= " KS "、** kwargsから): スーパー(KS、自己)。__init__(名=名、** kwargsから) self.true_positives = self.add_weight( 名 = " TP "、形状=(101)、初期= " ゼロ" ) self.false_positives = self.add_weight( 名 = " FP "、形状=(101、)、初期化子= "zeros " ) @ tf.function def update_state(self、y_true、y_pred): y_true = tf.cast(tf.reshape(y_true、(-1 、))、tf.bool) y_pred = tf.cast(100 * tf。 reshape(y_pred、(-1 、))、tf.int32) for i in tf.range(0、tf.shape(y_true)[0]): if y_true [i]: self.true_positives [y_pred [i]] .assign( self.true_positives [y_pred [i]] +1.0 ) else : self.false_positives [y_pred [i]]。assign( self.false_positives [y_pred [i]] +1.0) return (self.true_positives、self.false_positives) @ tf.function def result(self): cum_positive_ratio = tf.truediv( tf.cumsum(self.true_positives)、tf.reduce_sum(self.true_positives)) cum_negative_ratio = tf.truediv ( tf.cumsum(self.false_positives)、tf.reduce_sum(self.false_positives)) ks_value = tf.reduce_max(tf.abs(cum_positive_ratio- cum_negative_ratio)) return ks_value y_true = tf.constant([[1]、[1] 、[1]、[0]、[1]、[1]、[1]、[0]、[0]、[0]、[1]、[0]、[1 ]、[0]]) y_pred= tf.constant([[0.6]、[0.1]、[0.4]、[0.5]、[0.7]、[0.7 ]、 [ 0.7]、[0.4]、[0.4]、[0.5]、[0.8]、 [0.3]、[0.5]、[0.3 ]]) myks = KS() myks.update_state(y_true、y_pred) tf。印刷(myks.result())
0.625
参照:
オープンソースの電子書籍アドレス:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/
GitHubプロジェクトのアドレス:https://github.com/lyhue1991/eat_tensorflow2_in_30_days