PyTorch Tensorboard で PR 曲線を使って二値分類モデルの性能を評価する方法

2024-04-09

PyTorch Tensorboard の torch.utils.tensorboard.writer.SummaryWriter.add_pr_curve() 関数解説

torch.utils.tensorboard.writer.SummaryWriter.add_pr_curve() 関数は、Tensorboard で精密-再現曲線 (PR 曲線) を可視化するために使用されます。PR 曲線は、二値分類モデルの性能を評価する指標の一つであり、陽性予測値 (Precision) と再現率 (Recall) の関係を表します。

この関数の利点

  • Tensorboard を使って PR 曲線を簡単に可視化できる
  • 複数の PR 曲線を比較できる
  • 曲線下面積 (AUC) を計算できる

この関数の使い方

# ライブラリのインポート
import torch
from torch.utils.tensorboard import SummaryWriter

# データの準備
labels = torch.tensor([0, 1, 1, 0, 1, 0, 1, 1, 0, 1])
predictions = torch.tensor([0.2, 0.8, 0.7, 0.1, 0.9, 0.3, 0.6, 0.5, 0.4, 0.8])

# SummaryWriter のインスタンスを作成
writer = SummaryWriter()

# PR 曲線を追加
writer.add_pr_curve(tag="my_pr_curve", labels=labels, predictions=predictions)

# イベントファイルを閉じる
writer.close()

パラメータ

  • tag (str): データ識別子
  • labels (torch.Tensor): 正解ラベル (0 または 1 の値を持つ)
  • predictions (torch.Tensor): 予測確率 (0 から 1 の範囲)
  • global_step (int, オプション): グローバルステップ値
  • num_thresholds (int, オプション): 曲線を描画するために使用する閾値の数

出力

Tensorboard を起動すると、my_pr_curve という名前のタブが表示され、PR 曲線が可視化されます。

補足

  • PR 曲線は、ROC 曲線と比較して、不均衡データセットでより有用な指標となる場合があります。
  • add_pr_curve() 関数は、PyTorch 1.7 以降で使用できます。

関連キーワード

  • PyTorch
  • Tensorboard
  • 精密-再現曲線
  • PR 曲線
  • AUC


PyTorch Tensorboard add_pr_curve() 関数のサンプルコード

複数 PR 曲線の比較

import torch
from torch.utils.tensorboard import SummaryWriter

# データの準備
labels1 = torch.tensor([0, 1, 1, 0, 1, 0, 1, 1, 0, 1])
predictions1 = torch.tensor([0.2, 0.8, 0.7, 0.1, 0.9, 0.3, 0.6, 0.5, 0.4, 0.8])

labels2 = torch.tensor([1, 0, 0, 1, 0, 1, 0, 1, 1, 0])
predictions2 = torch.tensor([0.9, 0.1, 0.2, 0.8, 0.3, 0.7, 0.4, 0.6, 0.5, 0.9])

# SummaryWriter のインスタンスを作成
writer = SummaryWriter()

# 複数の PR 曲線を追加
writer.add_pr_curve(tag="model1", labels=labels1, predictions=predictions1)
writer.add_pr_curve(tag="model2", labels=labels2, predictions=predictions2)

# イベントファイルを閉じる
writer.close()

曲線下面積 (AUC) の計算

import torch
from torch.utils.tensorboard import SummaryWriter

# データの準備
labels = torch.tensor([0, 1, 1, 0, 1, 0, 1, 1, 0, 1])
predictions = torch.tensor([0.2, 0.8, 0.7, 0.1, 0.9, 0.3, 0.6, 0.5, 0.4, 0.8])

# SummaryWriter のインスタンスを作成
writer = SummaryWriter()

# PR 曲線と AUC を追加
writer.add_pr_curve(tag="my_pr_curve", labels=labels, predictions=predictions)

# イベントファイルを閉じる
writer.close()

# AUC を取得
auc = writer.get_pr_curve("my_pr_curve").auc

異なる閾値を使用した PR 曲線

import torch
from torch.utils.tensorboard import SummaryWriter

# データの準備
labels = torch.tensor([0, 1, 1, 0, 1, 0, 1, 1, 0, 1])
predictions = torch.tensor([0.2, 0.8, 0.7, 0.1, 0.9, 0.3, 0.6, 0.5, 0.4, 0.8])

# SummaryWriter のインスタンスを作成
writer = SummaryWriter()

# 異なる閾値を使用した PR 曲線を追加
writer.add_pr_curve(tag="my_pr_curve", labels=labels, predictions=predictions, num_thresholds=10)

# イベントファイルを閉じる
writer.close()

マルチクラス分類

import torch
from torch.utils.tensorboard import SummaryWriter

# データの準備
labels = torch.tensor([0, 1, 2, 0, 1, 2, 0, 1, 2, 0])
predictions = torch.tensor([[0.2, 0.8, 0.1],
                          [0.1, 0.7, 0.2],
                          [0.3, 0.6, 0.1],
                          [0.2, 0.8, 0.1],
                          [0.1, 0.7, 0.2],
                          [0.3, 0.6, 0.1],
                          [0.2, 0.8, 0.1],
                          [0.1, 0.7, 0.2],
                          [0.3, 0.6, 0.1],
                          [0.2, 0.8, 0.1]])

# SummaryWriter のインスタンスを作成
writer = SummaryWriter()

# マルチクラス分類用の PR 曲線を追加
writer.add_pr_curve(tag="my_pr_curve", labels=labels, predictions=predictions)

# イベントファイルを閉じる
writer.close()


PyTorch Tensorboard で PR 曲線を可視化する他の方法

  • matplotlib は Python でグラフ作成ライブラリ
  • PR 曲線を描画するために直接使用可能
  • コード量は Tensorboard より多い
  • 詳細なカスタマイズが可能

scikit-learn を使用

  • scikit-learn は Python で機械学習ライブラリ
  • precision_recall_curve 関数で PR 曲線計算可能
  • Tensorboard よりもシンプルなコード

seaborn を使用

  • seaborn は Python でデータ可視化ライブラリ
  • matplotlib よりも洗練されたデザイン

自作の関数を使用

  • 上記のライブラリを使用せず、自作の関数で PR 曲線計算・描画可能
  • 柔軟性が高い
  • コード量は増える

それぞれの方法のメリットとデメリット

方法メリットデメリット
Tensorboard簡単カスタマイズ性が低い
matplotlib詳細なカスタマイズが可能コード量が多い
scikit-learnシンプルTensorboard より機能が少ない
seaborn洗練されたデザインmatplotlib よりコード量が多い
自作関数柔軟性が高いコード量が多い
  • 簡単さを求める場合は Tensorboard
  • 詳細なカスタマイズが必要場合は matplotlib
  • シンプルなコードを求める場合は scikit-learn
  • 洗練されたデザインを求める場合は seaborn
  • 柔軟性を求める場合は自作関数



PyTorchのC++バックトレースを取得:torch.utils.get_cpp_backtraceの使い方

torch. utils. get_cpp_backtrace は、PyTorch の C++ バックトレースを取得するための関数です。これは、C++ コードで発生したエラーのデバッグに役立ちます。機能この関数は、現在のスレッドの C++ バックトレースをリストとして返します。各要素は、フレームの情報を含むディクショナリです。



PyTorch初心者向け:torch.var_mean関数でテンソルの分散と平均値をマスターしよう

この関数を使うと、以下のようなメリットがあります。コードの簡潔化: 分散と平均値を個別に計算する必要がなくなり、コードがスッキリします。効率的な処理: 分散と平均値を同時に計算するため、処理速度が向上します。柔軟な計算: 軸指定やバイアス補正など、さまざまなオプションを指定して計算できます。


PyTorch vmap チュートリアル:ベクトル化による高速化とコード簡潔化をマスターしよう!

そこで、この解説では、torch. vmap の基本的な概念、使い方、そして具体的な例を通して、その利点と制限を分かりやすく解説します。ベクトル化とは、複数の演算をまとめて実行することで、処理速度を向上させる手法です。従来のループ処理では、各要素に対して個別に演算を実行するため、処理速度が遅くなります。一方、ベクトル化では、複数の要素をまとめて処理することで、処理速度を大幅に向上させることができます。



PyTorch の Optimization における torch.optim.SGD.step() の詳細解説

torch. optim. SGD. step() は、PyTorch の torch. optim モジュールで提供される 確率的勾配降下法 (SGD) アルゴリズムに基づくオプティマイザーの更新ステップを実行する関数です。SGD は、ニューラルネットワークの学習において最も広く使用される最適化アルゴリズムの一つです。


PyTorch Profiler入門:torch.profiler.itt.range_push()で詳細な分析を実現

torch. profiler. itt. range_push()は、Intel VTune Amplifierとの統合を可能にするProfiler APIの一部です。この関数は、特定の範囲(コードブロック)の実行時間を計測するために使用されます。


PyTorchで画像処理: torch.fft.fftshift() を活用した高度なテクニック

PyTorch は、Python で機械学習モデルを構築するためのオープンソースライブラリです。torch. fft モジュールは、離散フーリエ変換 (DFT) と関連する関数を提供します。DFT とはDFT は、連続時間信号を離散時間信号に変換するための数学的な操作です。これは、信号処理、画像処理、音声処理など、さまざまな分野で使用されています。


PyTorch vmap チュートリアル:ベクトル化による高速化とコード簡潔化をマスターしよう!

そこで、この解説では、torch. vmap の基本的な概念、使い方、そして具体的な例を通して、その利点と制限を分かりやすく解説します。ベクトル化とは、複数の演算をまとめて実行することで、処理速度を向上させる手法です。従来のループ処理では、各要素に対して個別に演算を実行するため、処理速度が遅くなります。一方、ベクトル化では、複数の要素をまとめて処理することで、処理速度を大幅に向上させることができます。


PyTorchの torch.linalg.matrix_norm 関数:行列の大きさを計算して機械学習モデルを強化する

torch. linalg. matrix_norm は、PyTorch の Linear Algebra モジュールで提供される重要な関数であり、行列のノルム (大きさ) を計算するために使用されます。ノルムは、行列の要素の絶対値の総和または最大値に基づいて計算される数値であり、行列のスケール、行列間の距離、行列の安定性などを評価する際に役立ちます。