teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

9

edit

2018/03/20 09:11

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -70,4 +70,29 @@
70
70
  recall = recall_score(y_true, y_pred, pos_label=0)
71
71
  print(precision)
72
72
  print(recall)
73
- ```
73
+ ```
74
+
75
+ ---
76
+
77
+ 追記2
78
+ https://aidemy.net/courses/2010/exercises/HJglFn8sUez
79
+ をやってきました。
80
+
81
+ 私が最初に混乱したように、このサイトに書かれていることはねじれています。
82
+ [TP FN] [2 1]
83
+ [FP TN] [0 3]
84
+ を信じてやるとうまく計算できません。
85
+ 多分作成者が`confmat = confusion_matrix(y_true, y_pred)`を持ってきて満足したと思われます。
86
+
87
+ そして、ヒントに従ってsklearnのprecision_score()とrecall_score()を使うと、
88
+ [TP FN] [3 0]
89
+ [FP TN] [1 2]
90
+ として計算されて、そしてこの作者、またもやlabelを指定せずに答えを作ったものだからパスします。
91
+
92
+ そして真面目にやっている人は詰まるわけです。
93
+
94
+ たぶん作者は最初は1が陽性のつもりで書いたが、confusion_matrixとの整合性が取れなくなって、
95
+ 0が陽性であると、コメントを付け加えたものと想像します。
96
+
97
+ 検索してみましたが、この誤植についての情報はありませんでした。
98
+ やっている人口が著しく少ないのか、誰も確かめずにスルーしてしまったか、という状況のようです。

8

edit

2018/03/20 09:11

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -52,4 +52,22 @@
52
52
  1.0
53
53
  recall:
54
54
  0.6666666666666666
55
+ ```
56
+
57
+ コードはこう。
58
+ ```python
59
+ from sklearn.metrics import precision_score
60
+ from sklearn.metrics import confusion_matrix
61
+ from sklearn.metrics import recall_score, f1_score
62
+
63
+ y_true = [0,0,0,1,1,1]
64
+ y_pred = [1,0,0,1,1,1]
65
+ confmat = confusion_matrix(y_true, y_pred, labels=[0, 1])
66
+
67
+ print (confmat)
68
+
69
+ precision = precision_score(y_true, y_pred, pos_label=0)
70
+ recall = recall_score(y_true, y_pred, pos_label=0)
71
+ print(precision)
72
+ print(recall)
55
73
  ```

7

edit

2018/03/20 08:31

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -27,9 +27,29 @@
27
27
  print(recall)
28
28
  ```
29
29
 
30
+ ---
31
+
30
32
  追記:
31
33
  逆に0を陽性にしたいのであれば、
32
34
  `precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)`
33
35
  がデフォルトのところ、
34
36
  `pos_label=0`
35
- をつけてください。
37
+ をつけてください。
38
+
39
+ ---
40
+
41
+ TP/ FN+TP 
42
+ 2/(1+2)=2/3=0.33 -> 0.66
43
+
44
+ ---
45
+
46
+ もともとも問題設定を重視するのであれば、
47
+ ```
48
+ confmat:
49
+ [[2 1]
50
+ [0 3]]
51
+ precision:
52
+ 1.0
53
+ recall:
54
+ 0.6666666666666666
55
+ ```

6

edit

2018/03/20 08:30

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -25,4 +25,11 @@
25
25
  recall = recall_score(y_true, y_pred)
26
26
  print(precision)
27
27
  print(recall)
28
- ```
28
+ ```
29
+
30
+ 追記:
31
+ 逆に0を陽性にしたいのであれば、
32
+ `precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)`
33
+ がデフォルトのところ、
34
+ `pos_label=0`
35
+ をつけてください。

5

edit

2018/03/20 08:23

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,5 +1,5 @@
1
- TP[3 1]FN
1
+ TP[3 0]FN
2
- FP[0 2]TN
2
+ FP[1 2]TN
3
3
  ですね。
4
4
 
5
5
  http://www.baru-san.net/archives/141
@@ -7,21 +7,20 @@
7
7
  confusion_metrixが混乱しました。
8
8
  失礼しました。
9
9
 
10
+ 配列の`1`が陽性positive、`0`が陰性negative
11
+ をconfusion_metrixの計算でsklearnが察してくれていなくって、labelsのキーワードを与えます。
12
+
10
13
  ```python
11
14
  from sklearn.metrics import precision_score
12
15
  from sklearn.metrics import confusion_matrix
13
16
  from sklearn.metrics import recall_score, f1_score
14
17
 
15
- # データを格納します。今回は0が陽性、1が陰性を示しています
16
18
  y_true = [0,0,0,1,1,1]
17
19
  y_pred = [1,0,0,1,1,1]
18
20
  confmat = confusion_matrix(y_true, y_pred, labels=[1, 0])
19
- #y_trueには、正解データの実際のクラスが配列で格納
21
+
20
- #y_predには、予想されたクラスが配列で格納
21
- # 結果を出力します。
22
22
  print (confmat)
23
23
 
24
- # 適合率と再現率をあらかじめ計算します
25
24
  precision = precision_score(y_true, y_pred)
26
25
  recall = recall_score(y_true, y_pred)
27
26
  print(precision)

4

edit

2018/03/20 08:21

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,7 +1,29 @@
1
- 失礼しました。何か勘違いしました…
1
+ TP[3 1]FN
2
+ FP[0 2]TN
3
+ ですね。
2
4
 
5
+ http://www.baru-san.net/archives/141
6
+
7
+ confusion_metrixが混乱しました。
3
- ~~[3 1]
8
+ 失礼しました。
9
+
4
- [0 2]
10
+ ```python
5
- ですね。
11
+ from sklearn.metrics import precision_score
12
+ from sklearn.metrics import confusion_matrix
13
+ from sklearn.metrics import recall_score, f1_score
14
+
6
- 配列の0が陽性positive、1が陰性negative
15
+ # データを格納します。今回は0が陽性、1が陰性を示しています
7
- これをsklearnが察してくれていません。~~
16
+ y_true = [0,0,0,1,1,1]
17
+ y_pred = [1,0,0,1,1,1]
18
+ confmat = confusion_matrix(y_true, y_pred, labels=[1, 0])
19
+ #y_trueには、正解データの実際のクラスが配列で格納
20
+ #y_predには、予想されたクラスが配列で格納
21
+ # 結果を出力します。
22
+ print (confmat)
23
+
24
+ # 適合率と再現率をあらかじめ計算します
25
+ precision = precision_score(y_true, y_pred)
26
+ recall = recall_score(y_true, y_pred)
27
+ print(precision)
28
+ print(recall)
29
+ ```

3

edit

2018/03/20 08:18

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,7 +1,7 @@
1
+ 失礼しました。何か勘違いしました…
2
+
1
- [3 1]
3
+ ~~[3 1]
2
4
  [0 2]
3
5
  ですね。
4
-
5
- > 配列の0が陽性positive、1が陰性negative
6
+ 配列の0が陽性positive、1が陰性negative
6
-
7
- これをsklearnが察してくれていません。
7
+ これをsklearnが察してくれていません。~~

2

edit

2018/03/20 08:12

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,5 +1,5 @@
1
- [3 0]
1
+ [3 1]
2
- [1 2]
2
+ [0 2]
3
3
  ですね。
4
4
 
5
5
  > 配列の0が陽性positive、1が陰性negative

1

edit

2018/03/20 08:10

投稿

mkgrei
mkgrei

スコア8562

answer CHANGED
@@ -1,3 +1,7 @@
1
1
  [3 0]
2
2
  [1 2]
3
- ですね。
3
+ ですね。
4
+
5
+ > 配列の0が陽性positive、1が陰性negative
6
+
7
+ これをsklearnが察してくれていません。