【機械学習】 scikit-learn で精度・再現率・F値を算出する方法【Python】
今回は、2クラス分類で Python の scikit-learn を使った評価指標である、精度(Precision)、再現率(Recall)、F値(F-measure)について調べてみました。
Contents
混同行列(Confusion matrix)
2クラス分類で、精度や再現率を求めるときに必要になってくるのが、TP、TN、FP、FN という概念です。これらの4つは分類時の結果からいずれかに分けられるのですが、それを表形式で表したのが混同行列(Confusion matrix)になります。
1 2 3 4 |
Confusion matrix diff: same diff same 1789 289 diff 259 1819 |
この例では、「same」「diff」の2クラス分類結果を表しています。
2クラス分類では、陽性(Positive)であるクラスを決めないといけません。
今回は「diff」クラスを陽性として扱っています。ちなみに残りのクラスを陰性クラスと呼びます。
scikit-learn で陽性クラスを指定するには、labels で与えます。
1 2 |
labels = ['same', 'diff'] cm = confusion_matrix(正解ラベル, 予測ラベル, labels=labels) |
[‘same’, ‘diff’] として、後ろに与えたラベルが陽性クラスの扱いになるようです。
そうすると、以下のように4つの分類が割り当てられます。
1 2 3 4 |
予測 same diff 実際 same TN FP diff FN TP |
- TP(True Positive):陽性(diff)と予測した中で実際に陽性(diff)
- TN(True Negative):陰性(same)と予測した中で実際に陰性(same)
- FP(False Positive):陽性(diff)と予測した中で実際は陰性(same)
- FN(False Negative):陰性(same)と予測した中で実際は陽性(diff)
少し混乱しそうですが、True がつけば 正解 を表して、Positive が 陽性クラス を表しています。
TP、TN、FP、FN の数をそれぞれ取得するには、flatten 関数を使います。
1 2 3 4 5 6 |
# TN, FP, FN, TPの個数を取得 tn, fp, fn, tp = cm.flatten() print('tn...'+str(tn)) print('fp...'+str(fp)) print('fn...'+str(fn)) print('tp...'+str(tp)) |
結果は、以下のようになります。
1 2 3 4 |
tn...1789 fp...289 fn...259 tp...1819 |
精度(Precision)
精度(Precision)は、適合率や正確性などともいいます。
精度は「識別器が陽性と判断したもののうち、正しく陽性と判断した割合」を表します。
式で書くと「TP/(TP+FP)」となります。
検索エンジンの例でたとえると、「ある検索ワードで検索してヒットした件数のうち、欲しい(正しい)ページの件数」といえます。
scikit-learn では precision_score で精度を算出することができます。
1 2 |
from sklearn.metrics import precision_score print('Precision score: {:.2f}'.format(precision_score(正解ラベル, 予測ラベル)) |
正解ラベルは、テストデータの正解ラベル(same or diff)になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
0 same 1 same 2 same 3 same 4 same ... 59993 diff 60005 diff 60016 diff 60027 diff 60043 diff Name: class, Length: 4156, dtype: object |
今回は Series 型になっています。
予測ラベルは、テストデータについて分類器が予測したラベル(same or diff)になります。
1 |
['same' 'diff' 'diff' ... 'diff' 'diff' 'diff'] |
今回は リスト型になっています。
正解ラベルと予測ラベルは、Series型でもリスト型でもどちらでも問題ないようです。
以下のようなエラーがでました。
1 |
ValueError: pos_label=1 is not a valid label: array(['diff', 'same'], dtype='<U4') |
これは、ラベルデータ(pos_label)がデフォルトでは「1」となっているため、陽性のラベル(diff)を明示する必要があります。
1 |
print('Precision score: {:.2f}'.format(precision_score(正解ラベル, 予測ラベル, pos_label='diff'))) |
結果は、無事に以下のように出力されました。
1 |
Precision score: 0.86 |
再現率(Recall)
再現率(Recall)は、網羅性を表している指標です。
「テストデータの実際に陽性のデータのうち、正しく陽性と判断した割合」を表します。
式で書くと「TP/(TP+FN)」となります。
検索エンジンの例で例えると、「あるワードで検索して、欲しい情報が手に入る件数のうち、実際に正しく得られた件数」といえます。
scikit-learn では recall_score で再現率を算出することができます。
1 2 |
from sklearn.metrics import recall_score print('Recall score: {:.2f}'.format(recall_score(正解ラベル, 予測ラベル, pos_label='diff'))) |
結果は以下のとおり。
1 |
Recall score: 0.88 |
F値(F-measure)
F値(F-measure)は、精度と再現率を合わせたものになります。
scikit-learn では f1_score でF値を算出することができます。
1 2 |
from sklearn.metrics import f1_score print('F1 measure: {:.2f}'.format(f1_score(正解ラベル, 予測ラベル, pos_label='diff'))) |
結果は以下のとおり。
1 |
F1 measure: 0.87 |
関連記事
-
【Weka】ARFF 形式から CSV 形式に簡単に変換する方法。
フリーのデータマイニングツールである WEKA では、ARFF 形式と CSV 形式のデータを読み込
-
【機械学習】 scikit-learn で不正解データを抽出する方法【Python】
Python の scikit-learn ライブラリを使って機械学習でテストデータを識別(2クラス
-
【Weka】CSVファイルを読み込んで決定木を実行。
フリーの機械学習ソフト Weka を使って、CSVファイルを読み込んで決定木(Decision Tr
-
【機械学習】パーセプトロン(Perceptron)について。
パーセプトロンは、教師あり学習の中でも、入出力モデルベース(eager learning:働き者の学
-
【探索】縦型・横型・反復深化法の探索手法の比較。
探索とは、チェスや将棋や囲碁などのゲームをコンピュータがプレイするときに、どの手を指すかを決定するの
-
機械学習の手法のまとめ。
機械学習は、「与えられた入出力事例をモデル化する行為」のことで、ディープラーニングなどで注目を集めて
-
【機械学習・手法比較】決定木とナイーブベイズを比較してみた。
同じデータを使って、教師有り機械学習手法の 決定木(Decision Tree)とナイーブベイズ(N
-
【深層学習】 TensorFlow と Keras をインストールする【Python】
今回は、Google Colaboratory 上で、深層学習(DeepLearning)フレームワ
-
【転移学習】学習済みVGG16 による転移学習を行う方法【PyTorch】
今回は、PyTorch を使って、学習済みのモデル VGG16 を用いて転移学習をしてみました。
-
【Fashion-MNIST】ファッションアイテムのデータセットを使ってみた【TensorFlow】
今回は、機械学習用に公開されているデータセットの1つである「Fashion-MNIST」について紹介