質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

6556閲覧

再現率・適合率の計算方法を教えてください

rickey

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/03/20 07:34

編集2018/03/20 09:19

恐らくどのサイトを見ても計算方法は載っていて
それに沿って何度も計算しました。
以下のプログラムで計算した結果と、
HPに乗っている計算方法で公式に沿って電卓で計算した結果がどうしても合いません。
プログラムが異なるのか、計算の考え方が違うのか、ご教授ください。
以下のプログラムは、プログラムの勉強サイトAidemyの「機械学習概論3.1.5性能評価指標を実装する」の回答に書かれているものを参考にしています。
URL https://aidemy.net/courses/2010/exercises/HJglFn8sUez

★プログラムによる計算

Python

1from sklearn.metrics import precision_score 2from sklearn.metrics import confusion_matrix 3from sklearn.metrics import recall_score, f1_score 4 5# データを格納します。今回は0が陽性、1が陰性を示しています 6y_true = [0,0,0,1,1,1] 7y_pred = [1,0,0,1,1,1] 8confmat = confusion_matrix(y_true, y_pred) 9#y_trueには、正解データの実際のクラスが配列で格納 10#y_predには、予想されたクラスが配列で格納 11# 結果を出力します。 12print (confmat) 13 14# 適合率と再現率をあらかじめ計算します 15precision = precision_score(y_true, y_pred) 16recall = recall_score(y_true, y_pred) 17print(precision) 18print(recall)

プログラムの算出した答え
[[2 1]
[0 3]]
0.75←precision 適合率
1.0←recall再現率

★以下手計算
配列の0が陽性positive、1が陰性negative
(TP)事実陽性・予想陽性[2 1]←(FN)事実陰性・予想陽性
(FP)事実陽性・予想陰性[0 3]←(TN)事実陰性・予想陰性
○適合率/精度(precision):陽性と予測されたデータのうち、実際に陽性であるものの割合
TP/FP+TP 
2/(0+2)=2/2=1

○ 再現率(recall):実際の陽性のデータのうち、陽性と予測できたものの割合
TP/ FN+TP 
2/(1+2)=2/3=0.66

となり、プログラムと合いません。
計算の考え方が異なるのか、プログラムが異なるのか?
気が付いた点がありましたらご指摘ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

TP[3 0]FN
FP[1 2]TN
ですね。

http://www.baru-san.net/archives/141

confusion_metrixが混乱しました。
失礼しました。

配列の1が陽性positive、0が陰性negative
をconfusion_metrixの計算でsklearnが察してくれていなくって、labelsのキーワードを与えます。

python

1from sklearn.metrics import precision_score 2from sklearn.metrics import confusion_matrix 3from sklearn.metrics import recall_score, f1_score 4 5y_true = [0,0,0,1,1,1] 6y_pred = [1,0,0,1,1,1] 7confmat = confusion_matrix(y_true, y_pred, labels=[1, 0]) 8 9print (confmat) 10 11precision = precision_score(y_true, y_pred) 12recall = recall_score(y_true, y_pred) 13print(precision) 14print(recall)

追記:
逆に0を陽性にしたいのであれば、
precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)
がデフォルトのところ、
pos_label=0
をつけてください。


TP/ FN+TP 
2/(1+2)=2/3=0.33 -> 0.66


もともとも問題設定を重視するのであれば、

confmat: [[2 1] [0 3]] precision: 1.0 recall: 0.6666666666666666

コードはこう。

python

1from sklearn.metrics import precision_score 2from sklearn.metrics import confusion_matrix 3from sklearn.metrics import recall_score, f1_score 4 5y_true = [0,0,0,1,1,1] 6y_pred = [1,0,0,1,1,1] 7confmat = confusion_matrix(y_true, y_pred, labels=[0, 1]) 8 9print (confmat) 10 11precision = precision_score(y_true, y_pred, pos_label=0) 12recall = recall_score(y_true, y_pred, pos_label=0) 13print(precision) 14print(recall)

追記2
https://aidemy.net/courses/2010/exercises/HJglFn8sUez
をやってきました。

私が最初に混乱したように、このサイトに書かれていることはねじれています。
[TP FN] [2 1]
[FP TN] [0 3]
を信じてやるとうまく計算できません。
多分作成者がconfmat = confusion_matrix(y_true, y_pred)を持ってきて満足したと思われます。

そして、ヒントに従ってsklearnのprecision_score()とrecall_score()を使うと、
[TP FN] [3 0]
[FP TN] [1 2]
として計算されて、そしてこの作者、またもやlabelを指定せずに答えを作ったものだからパスします。

そして真面目にやっている人は詰まるわけです。

たぶん作者は最初は1が陽性のつもりで書いたが、confusion_matrixとの整合性が取れなくなって、
0が陽性であると、コメントを付け加えたものと想像します。

検索してみましたが、この誤植についての情報はありませんでした。
やっている人口が著しく少ないのか、誰も確かめずにスルーしてしまったか、という状況のようです。

投稿2018/03/20 08:06

編集2018/03/20 09:11
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rickey

2018/03/21 07:57 編集

ご丁寧に本当にありがとうございます。 私の勘違いは、 陽性0、陰性1は、今回作成側が作った定義であること。 むしろ、陽性1、陰性0の方が通常であることでした。 これで、ひとつは解決して、答えは出せました。 陽性1、陰性0とすると、以下の回答がでて、 TP[3 0]FN FP[1 2]TN で、手計算すると、回答につながりました。 また、陽性1、陰性0にするにはプログラムで行うことができる。 配列を出力するときは、 confmat = confusion_matrix(y_true, y_pred, labels=[0, 1]) このように labels=[0, 1]陽性0、陰性1 labels=[1, 0]陽性1、陰性0 再現率、適合率を出力するときは、 precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None) これのpos_label=1だと陽性1で計算されて、0にすると陽性0となるということですね。 作成者がわの意図、どうやったら正しく計算できるか、どうプログラムを組むと狙ったものになるのか、 それぞれの結果がわかりました。 サイトも実際に見ていただき、本当にありがとうございました。
mkgrei

2018/03/20 16:06

おっしゃっていることは正しいと思います。 多分混乱はサイトの左側に、 [TP FN] [2 1] [FP TN] [0 3] と書かれているせいだと思います。 そして課題をパスするコードを書くと、 陰性を1にしたときのf1スコアが計算されます。 陽性を1にしたときのf1スコアを計算すると課題をパスできません。 でもまさか、陰性を1にしたときのf1スコアが本当に出題の意図とも思えないのです。 何がともあれそれぞれの概念が正しく理解できているのならよいのです。
guest

0

ベストアンサー

計算の考え方が異なる

  • 適合率は1と推定したもののうち、実際に1であるものの割合
  • 再現率は実際に1であるもののうち、1と推定されたものの割合

ですぞ。

投稿2018/03/20 08:00

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rickey

2018/03/20 14:31

陽性1、陰性0とすると計算値が合うのですね。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問