回答編集履歴

9

edit

2018/03/20 09:11

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -143,3 +143,53 @@
143
143
  print(recall)
144
144
 
145
145
  ```
146
+
147
+
148
+
149
+ ---
150
+
151
+
152
+
153
+ 追記2
154
+
155
+ https://aidemy.net/courses/2010/exercises/HJglFn8sUez
156
+
157
+ をやってきました。
158
+
159
+
160
+
161
+ 私が最初に混乱したように、このサイトに書かれていることはねじれています。
162
+
163
+ [TP FN] [2 1]
164
+
165
+ [FP TN] [0 3]
166
+
167
+ を信じてやるとうまく計算できません。
168
+
169
+ 多分作成者が`confmat = confusion_matrix(y_true, y_pred)`を持ってきて満足したと思われます。
170
+
171
+
172
+
173
+ そして、ヒントに従ってsklearnのprecision_score()とrecall_score()を使うと、
174
+
175
+ [TP FN] [3 0]
176
+
177
+ [FP TN] [1 2]
178
+
179
+ として計算されて、そしてこの作者、またもやlabelを指定せずに答えを作ったものだからパスします。
180
+
181
+
182
+
183
+ そして真面目にやっている人は詰まるわけです。
184
+
185
+
186
+
187
+ たぶん作者は最初は1が陽性のつもりで書いたが、confusion_matrixとの整合性が取れなくなって、
188
+
189
+ 0が陽性であると、コメントを付け加えたものと想像します。
190
+
191
+
192
+
193
+ 検索してみましたが、この誤植についての情報はありませんでした。
194
+
195
+ やっている人口が著しく少ないのか、誰も確かめずにスルーしてしまったか、という状況のようです。

8

edit

2018/03/20 09:11

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -107,3 +107,39 @@
107
107
  0.6666666666666666
108
108
 
109
109
  ```
110
+
111
+
112
+
113
+ コードはこう。
114
+
115
+ ```python
116
+
117
+ from sklearn.metrics import precision_score
118
+
119
+ from sklearn.metrics import confusion_matrix
120
+
121
+ from sklearn.metrics import recall_score, f1_score
122
+
123
+
124
+
125
+ y_true = [0,0,0,1,1,1]
126
+
127
+ y_pred = [1,0,0,1,1,1]
128
+
129
+ confmat = confusion_matrix(y_true, y_pred, labels=[0, 1])
130
+
131
+
132
+
133
+ print (confmat)
134
+
135
+
136
+
137
+ precision = precision_score(y_true, y_pred, pos_label=0)
138
+
139
+ recall = recall_score(y_true, y_pred, pos_label=0)
140
+
141
+ print(precision)
142
+
143
+ print(recall)
144
+
145
+ ```

7

edit

2018/03/20 08:31

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -56,6 +56,10 @@
56
56
 
57
57
 
58
58
 
59
+ ---
60
+
61
+
62
+
59
63
  追記:
60
64
 
61
65
  逆に0を陽性にしたいのであれば、
@@ -67,3 +71,39 @@
67
71
  `pos_label=0`
68
72
 
69
73
  をつけてください。
74
+
75
+
76
+
77
+ ---
78
+
79
+
80
+
81
+ TP/ FN+TP 
82
+
83
+ 2/(1+2)=2/3=0.33 -> 0.66
84
+
85
+
86
+
87
+ ---
88
+
89
+
90
+
91
+ もともとも問題設定を重視するのであれば、
92
+
93
+ ```
94
+
95
+ confmat:
96
+
97
+ [[2 1]
98
+
99
+ [0 3]]
100
+
101
+ precision:
102
+
103
+ 1.0
104
+
105
+ recall:
106
+
107
+ 0.6666666666666666
108
+
109
+ ```

6

edit

2018/03/20 08:30

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -53,3 +53,17 @@
53
53
  print(recall)
54
54
 
55
55
  ```
56
+
57
+
58
+
59
+ 追記:
60
+
61
+ 逆に0を陽性にしたいのであれば、
62
+
63
+ `precision_score(y_true, y_pred, labels=None, pos_label=1, average=’binary’, sample_weight=None)`
64
+
65
+ がデフォルトのところ、
66
+
67
+ `pos_label=0`
68
+
69
+ をつけてください。

5

edit

2018/03/20 08:23

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -1,6 +1,6 @@
1
- TP[3 1]FN
1
+ TP[3 0]FN
2
2
 
3
- FP[0 2]TN
3
+ FP[1 2]TN
4
4
 
5
5
  ですね。
6
6
 
@@ -16,6 +16,12 @@
16
16
 
17
17
 
18
18
 
19
+ 配列の`1`が陽性positive、`0`が陰性negative
20
+
21
+ をconfusion_metrixの計算でsklearnが察してくれていなくって、labelsのキーワードを与えます。
22
+
23
+
24
+
19
25
  ```python
20
26
 
21
27
  from sklearn.metrics import precision_score
@@ -26,25 +32,17 @@
26
32
 
27
33
 
28
34
 
29
- # データを格納します。今回は0が陽性、1が陰性を示しています
30
-
31
35
  y_true = [0,0,0,1,1,1]
32
36
 
33
37
  y_pred = [1,0,0,1,1,1]
34
38
 
35
39
  confmat = confusion_matrix(y_true, y_pred, labels=[1, 0])
36
40
 
37
- #y_trueには、正解データの実際のクラスが配列で格納
38
41
 
39
- #y_predには、予想されたクラスが配列で格納
40
-
41
- # 結果を出力します。
42
42
 
43
43
  print (confmat)
44
44
 
45
45
 
46
-
47
- # 適合率と再現率をあらかじめ計算します
48
46
 
49
47
  precision = precision_score(y_true, y_pred)
50
48
 

4

edit

2018/03/20 08:21

投稿

mkgrei
mkgrei

スコア8560

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

3

edit

2018/03/20 08:18

投稿

mkgrei
mkgrei

スコア8560

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

2

edit

2018/03/20 08:12

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -1,6 +1,6 @@
1
- [3 0]
1
+ [3 1]
2
2
 
3
- [1 2]
3
+ [0 2]
4
4
 
5
5
  ですね。
6
6
 

1

edit

2018/03/20 08:10

投稿

mkgrei
mkgrei

スコア8560

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