機械学習における分類タスクの共通評価指標とPythonコード実装

機械学習における分類タスクの共通評価指標とPythonコード実装

データ ポイントを特定の数の定義済みクラスに分類するように ML モデルをトレーニングすることがタスクであるとします。 分類モデルの構築が完了したら、次のタスクはそのパフォーマンスを評価することです。 ユースケースに応じて、これを実行するのに役立つメトリックは多数あります。 この記事では、「いつ使用するのか?」「それとは何か?」「どのように実装するのか?」といった質問に答えていきます。

[[381730]]

混同マトリックス

混同行列はサイズ(クラス×クラス)の行列として定義されるため、バイナリ分類の場合は 2x2、3 クラス問題の場合は 3x3 などになります。 簡単にするために、バイナリ分類を検討し、マトリックスのコンポーネントを理解しましょう。

真陽性 (TP) - クラスが「真」であり、モデルもそれが「真」であると示す回数を表します。 True Negatives (TN) - クラスが false であり、モデルも false であると示す回数を表します。 偽陽性 (FP) - クラスは偽であるが、モデルでは真として表されることを意味します。

このように覚えておくと、モデルは誤ってそれが正であると認識します

False Negatives (FN) - クラスが「True」であったが、モデルが「False」を示した回数を表します。

このように覚えておくことができます - モデルは誤ってそれを偽の値だと認識します

以下に示すように、sklearn を使用すると混同行列を簡単に取得できます。

  1. sklearnからmetrics をインポートし、 calculate_confusion_matrix(y, y_pred): を定義します。
  2. metrics.confusion_matrix(y, y_pred)を返す

図1に示すように、混同行列の要素はTP、TN、FP、FNです。以下に示すように、プレーンPythonを使用して計算することもできます。TP、TN、FP、FNを計算します。

  1. 定義calculate_TP(y, y_pred):
  2. tp = 0
  3. i、jzip(y、y_pred)場合:
  4. i == j == 1 の場合:
  5. tp += 1
  6. TPを返す
  7. def calculate_TN(y, y_pred):
  8. tn = 0
  9. i、jzip(y、y_pred)場合:
  10. i == j == 0 の場合:
  11. tn += 1
  12. 戻るtn
  13. def calculate_FP(y, y_pred):
  14. 0 の場合
  15. i、jzip(y、y_pred)場合:
  16. i == 0かつj == 1 の場合:
  17. 関数p += 1
  18. 戻り
  19. def calculate_FN(y, y_pred):
  20. 0 の場合
  21. i、jzip(y、y_pred)場合:
  22. i == 1かつj == 0 の場合:
  23. 関数n+=1
  24. 戻り

混同行列は、モデルの詳細なパフォーマンスを理解するために重要であり、その後、ユースケースの感度に応じて、このモデルが適切かどうかを判断できます。 たとえば、医療診断のユースケースでは、病気の痕跡があるかどうかを検査する際に、システムが事実は「はい」なのに「いいえ」と言わないように、モデルの偽陰性率を非常に低くする必要があります。 当該人物が関連検査に合格し、後の段階で確認される可能性があるため、依然として偽陽性率が高くなる可能性があります。

正確さ

正確さにより、モデルがどのように機能するかについての全体的な理解が得られます。 ただし、誤って使用すると、これらの数値を簡単に過大評価する可能性があります。 たとえば、クラス ラベルの分布が偏っている場合、多数派クラスのみを予測するとスコアが高くなります (パフォーマンスの過大評価)。一方、バランスの取れたクラスの場合は、精度がより重要になります。

次のようにsklearnを使用して精度スコアを簡単に取得できます。

  1. sklearnからメトリックをインポート
  2. def calculate_accuracy_sklearn(y, y_pred):
  3. metrics.accuracy_score(y, y_pred)を返します

以下に示すように、Pythonを使用して混同行列の要素から計算することもできます。

  1. def calculate_accuracy(y, y_pred):
  2. tp = calculate_TP(y, y_pred)
  3. tn = calculate_TN(y, y_pred)
  4. fp = calculate_FP(y, y_pred)
  5. fn = calculate_FN(y, y_pred)
  6. (tp+tn) / (tp+tn+fp+fn)を返します

精度

精度メトリックは、識別された陽性サンプルの正しい割合を把握するのに役立ちます。たとえば、私たちのモデルでは、結果が 80 回正であると想定し、その 80 回のうちモデルが正しかった回数を正確に計算します。

次のように計算することもできます。

  1. 定義calculate_precision(y, y_pred):
  2. tp = calculate_TP(y, y_pred)
  3. fp = calculate_FP(y, y_pred)
  4. tp / (tp + fp)を返す

想起

リコール指標は、すべてのグラウンドトゥルースの正例のうち、モデルが正しく識別できた正例の割合を理解するのに役立ちます。 たとえば、データ内に 100 個の陽性サンプルがあると仮定すると、モデルがこれらの 100 個のサンプルのうちいくつを正しくキャプチャできたかを計算します。

以下のように計算することもできます。

  1. def calculate_recall(y, y_pred):
  2. tp = calculate_TP(y, y_pred)
  3. fn = calculate_FN(y, y_pred)
  4. tp / (tp + fn)を返す

確率を出力として持つモデルの場合、しきい値を調整してから、関連する混同行列やその他のプロパティを設定することが常に良い方法です。 さまざまなしきい値の適合率-再現率曲線をプロットし、ユースケースの感度に基づいてしきい値を選択できます。

  1. 定義精度_再現曲線(y, y_pred):
  2. y_pred_class、精度、再現率 = [],[],[]
  3. 閾値 = [0.1, 0.2, 0.3, 0.6, 0.65]
  4. しきい値threshの場合:
  5. for i in y_pred: #y_pred はクラス 1確率値を保持します
  6. i>=threshの場合: y_pred_class.append(1)
  7. そうでない場合: y_pred_class.append(0)
  8. 精度.append(calculate_precision(y, y_pred_class))
  9. 呼び出しを追加します(calculate_recall(y, y_pred_class))
  10. 再現率、精度を返すplt.plot(再現率、精度)

F1スコア

F1 は、精度スコアと再現率スコアを組み合わせて、さまざまなモデルを直接比較するのに役立つ単一の数値を取得します。 これは P と R の調和平均と考えることができます。調和平均は、他の方法とは異なり、非常に大きな値には影響されないため使用されます。 ターゲットが偏ったデータセットを扱う場合、通常は精度ではなく F1 の使用を検討します。

次のように計算できます。

  1. def calculate_F1(y, y_pred):
  2. p = 計算精度(y, y_pred)
  3. r = calculate_recall(y, y_pred)
  4. 2*p*r / (p+r)を返す

AUC-ROC

AUC-ROC は、バイナリ分類問題で非常によく使用される評価メトリックの 1 つです。 これは、TPR(真偽率)をy軸に、FPR(偽偽率)をx軸にプロットした曲線です。TPRとFPRは次のように定義されます。

お気づきかもしれませんが、TPR と Recall は、正しく分類した正しいサンプルの数など、同じ表現をしています。 一方、FPR は、誤分類された負の例の割合です。 ROC プロットは、各しきい値での分類器のパフォーマンスを要約します。 したがって、各しきい値に対して、TPR と FPR の新しい混同行列値が得られ、最終的に ROC 2 次元空間内の点になります。 ROC 曲線の下の AUC (曲線下面積) 値が 1 に近いほど、モデルは優れています。 つまり、一般に、AUC が高い各しきい値では、当社のモデルは他のモデルよりも優れたパフォーマンスを発揮します。

次のように計算できます。

  1. sklearn.metricsからroc_auc_scoreをインポートします
  2.  
  3. roc_auc(y, y_pred)を定義します。
  4. roc_auc_score(y, y_pred)を返す

精度 @ k

Precision@k は、マルチラベル分類設定でよく使用されるメトリックの 1 つです。 この下で、特定の例の上位 k 個の予測を計算し、これらの k 個の予測のうち実際に真のラベルであるものがいくつあるかを数えます。 Precision@kは以下のように計算されます。

Precision@k = (k からの正しい予測の数) / (k 内の項目の数)

  1. 実際のラベル = [1, 1, 0, 0, 1]
  2. 予測ラベル = [1, 1, 1, 0, 0]
  3.  
  4. k=3とする
  5. 精度@k = 2/3 (TP/(TP+FP)同じ)

ログ損失

バイナリ分類の問題がある場合には、ログ損失は非常に有効です。 これは、予測が実際のラベルからどれだけ離れているかに基づいて予測の不確実性を考慮した確率を出力するモデルがある場合に使用されます。

次のように計算できます。

  1. def calculate_log_loss(y, y_pred_probs):
  2. ログ損失 = -1.0*(t*log(p) + (1-t)*(t*log(1-p))
  3. log_lossを返す

データセットのバランスが取れていない場合は、クラスの重みを追加して、多数クラスに比べて少数クラスのエラーにペナルティを課すこともできます。コードでは、w1 と w2 はそれぞれ正クラスと負クラスの重みに対応します。

  1. def calculate_log_loss_weighted(y, y_pred):
  2. ログ損失 = -1.0*(w1*t*log(p) + w2*(1-t)*(t*log(1-p))
  3. log_lossを返す

補足: クロスエントロピーと呼ばれるものを使用すると、これをマルチクラス設定に簡単に拡張できます。

ブライアースコア

Brier スコアは通常、タスクが本質的にバイナリ分類である場合に使用されます。 それは単に実際の値と予測値の差を二乗したものです。 N 個のサンプル グループについて、平均をとります。

次のように計算できます。

  1. brier_score(y, y_pred)を定義します。
  2. s=0
  3. i、jzip(y、y_pred)場合:
  4. s += (ji)**2
  5. s * (1/len(y))を返す

この記事では、問題の性質に基づいて機械学習分類モデルを評価する際に、すべてのデータ サイエンティストが念頭に置く必要がある一般的な評価メトリックをいくつか紹介しました。

<<:  嫌がらせ電話をかけてきた相手は実はAIロボットだった?

>>:  20年後には、すべての仕事の半分が人工知能に置き換えられるのでしょうか?これらの「高リスク産業」とは何でしょうか?

ブログ    
ブログ    
ブログ    

推薦する

...

Volcano Engineがビヨンドのクラシックコンサートを超高解像度で復元、その技術的能力が一般公開される

7月3日夜、TikTokはユニバーサルミュージック傘下のレーベル、ポリグラムと提携し、ボルケーノエン...

OpenAIも996に取り組んでいますか?元従業員が告白:コード貢献度4位、6日間勤務することが多かった

AI 業界の人なら、OpenAI が先進的な技術と高い給与で AI 業界のリーダーであることは知って...

大手企業がどのように人工知能を活用し、実践しているのかご覧ください。

人工知能に関しては、人々は複雑な感情を抱くことが多い。映画ファンなら、ウィル・スミスが『アイ、ロボッ...

FMI2017----人工知能とビッグデータが時代を力づける

2017年8月5日、ペガサスが主催する「FMI人工知能&ビッグデータサミットフォーラム」が北京国家会...

人工知能と機械学習でよく使われるアルゴリズムの概要と、よく使われる各アルゴリズムの精度の比較

[[319322]]この記事では、一般的に使用されている機械学習アルゴリズムの概要と、一般的に使用さ...

MNISTとCIFAR 10を100%の精度で「解いた」と主張する人もいる

MNIST 認識の精度は 100% に達しましたか?最近、プレプリントプラットフォームarXivに掲...

人工知能は患者と医療業界の両方にどのような利益をもたらすのでしょうか?

人工知能は医療業界のシステムと方法を変えています。半世紀以上にわたり、人工知能とヘルスケアは一緒に発...

最高の顔認識アルゴリズムでもマスクによって妨害される可能性がある:研究

海外メディアの報道によると、研究者らは、マスクはCOVID-19などの空気感染する病気の拡散を効果的...

放送・ホスティング業界における人工知能の限界についての簡単な分析

[[430680]]科学技術の継続的な発展により、人工知能は人間の生活のあらゆる側面に関わるだけでな...

AIが材料科学を覆す!ディープマインドの主要な研究がネイチャー誌に掲載され、220万の結晶構造を予測し、人類より800年も先を行く

テレンス・タオ氏は、ChatGPT が数学的証明を覆すだろうと常に楽観的でしたが、現在、化学分野にお...

将来の産業用ロボットは「金属を食べて」自ら動力を得るようになるのでしょうか?

このタイトルで説明されているのは、SF映画の架空の筋書きではなく、現実のことです。ペンシルバニア大学...

...

...