分類モデルの6評価
トレーニング、チューニングおよびモデリングは、ライフサイクルの全体的な分析の重要な部分であるが、より重要なのは知ってどのようにこれらのモデルのパフォーマンス。分類モデルの一般的なパフォーマンスに基づいて、新しいデータのためのモデルの出力を予測します。一般的に、テスト・データ・セットまたは保持性能測定データセットは、データセットまたはデータが分類器を訓練するためにどのような方法で影響を与えません。通常、観測値の数と対応するラベルを含む試験データセット。
特徴的なトレーニングモデルの抽出方法の使用と同様に。訓練されたモデルに送信されたこれらの機能は、我々は、各データの予測結果を得ました。次に、予測結果と実際のラベルには、観測モデルは、正確な結果や状況を予測と一致します。
いくつかの指標はモデルの性能が決定された予測することができますが、以下のいくつかの指標に焦点を当てるがあります。
- 精度(正確さ)。
- 正解率(精度)。
- リコール(リコール)。
- F1スコア。
これらの指標を計算する方法を見てみましょう、のは、実用的な例を見てみましょう。「スパム」(スパム)として分類されたメッセージ、または「ハム」(通常のメール)1のバイナリ分類を考えてみましょう。各メッセージの20件のメッセージは、これらのメッセージは、分類器に内蔵された、実際の手動ラベルを持っている、それは各メッセージのラベルを予測されているがあるとします。今、我々は2つの予測値と実際のラベルを比較することにより、分類器の性能を測定します。次のコードは、依存関係、および予測実際のラベルタグを初期化するために提供されます。
from
sklearn
import
metrics
import
numpy as np
import
pandas as pd
from
collections
import
Counter
actual_labels
=
[
'spam'
,
'ham'
,
'spam'
,
'spam'
,
'spam'
,
'ham'
,
'ham'
,
'spam'
,
'ham'
,
'spam'
,
'spam'
,
'ham'
,
'ham'
,
'ham'
,
'spam'
,
'ham'
,
'ham'
,
'spam'
,
'spam'
,
'ham'
]
predicted_labels
=
[
'spam'
,
'spam'
,
'spam'
,
'ham'
,
'spam'
,
'spam'
,
'ham'
,
'ham'
,
'spam'
,
'spam'
,
'ham'
,
'ham'
,
'spam'
,
'ham'
,
'ham'
,
'ham'
,
'spam'
,
'ham'
,
'spam'
,
'spam'
]
ac
=
Counter(actual_labels)
pc
=
Counter(predicted_labels)
|
さて、次のコードラベルとラベル「スパン」または「ハム」のカテゴリを予測するために属するメッセージの実際の合計数を見てみましょう:
In [
4
]:
print
(
'Actual counts:'
, ac.most_common())
...:
print
(
'Predicted counts:'
, pc.most_common())
Actual counts: [(
'ham'
,
10
), (
'spam'
,
10
)]
Predicted counts: [(
'spam'
,
11
), (
'ham'
,
9
)]
|
そのため、10電子メールの合計を見ると、「スパム」、電子メールで、10は「ハム」です。分類器は、11の電子メール「スパム」の合計を予想されており、9メールは「ハム」です。今では分類されているものを、これらの電子メールが「迷惑メール」真であるかを比較?混同マトリックスは、2クラス分類の性能を測定するための良い方法です。混同行列は、分類器のパフォーマンスを視覚化するのに役立ちます、テーブル構造です。予測された分類の例の行列を表すの各列は、分類マトリックスは、各列は、実際の分類ラベル(所望であれば、逆にしてもよい)の例を表しています。一般的に、正クラスのクラスラベルを定義し、これは我々が興味を持っているクラスです。次の表では、pは正の種類を表す一般的なバイナリ分類混同行列を与え、n型トランス表します。
|
P」 (予測) |
N」 (予測) |
---|---|---|
P (実績) |
真の陽性 | 偽陽性 |
n個 (実績) |
偽陽性 | 真の陽性 |
上記の表は、マトリックス中の用語のいくつかを見ることができます。真陽性(TP)は、ヒットまたは予測ポジティブ・クラスの適切な数を示しています。偽陰性(FN)は、間違ったクラスの負の予測のこの種の例と言ってもエラーを示します。偽陽性(FP)が、それは間違って実際にはそうではない、ポジティブ・クラスを予測しています。真のネガティブ(TN)が正しく、クラスのインスタンスの負の数として予測されます。
我々のデータについては、以下のコードは混乱行列を再開する。
In [
7
]: cm
=
metrics.confusion_matrix(y_true
=
actual_labels,
...: y_pred
=
predicted_labels,
...: labels
=
[
'spam'
,
'ham'
])
...:
In [
8
]:
print
(pd.DataFrame(
...: data
=
cm,
...: columns
=
pd.MultiIndex(levels
=
[[
'Predicted:'
],
...: [
'spam'
,
'ham'
]],
...: labels
=
[[
0
,
0
],[
0
,
1
]]),
...: index
=
pd.MultiIndex(levels
=
[[
'Actual:'
],
...: [
'spam'
,
'ham'
]],
...: labels
=
[[
0
,
0
],[
0
,
1
]])))
...:
Predicted:
spam ham
Actual: spam
5
5
ham
6
4
|
今混同行列の図に似た画像を取得します。スパム「であるようなものです。」と仮定 今、前のインデックス次のコードセグメントで定義できます。
positive_class
=
'spam'
true_positive
=
5.
false_positive
=
6.
false_negative
=
5.
true_negative
=
4.
|
混同行列から得られる必要な値は、4つのパフォーマンス指標に一つずつ計算することができるからです。除算計算を容易にするために、浮動小数点数としてこれらの値。、関数内でこれらの指標を計算するために有用な非常に強力であるscikit学習(metriss)モジュールのインジケータの使用。これらの指標を手動で定義、計算、あなたが明確にそれらを理解することができ、かつmetrissモジュールからこれらの関数の内部実装を見ているよう。
精度は、以下の式によって、モデルや正しい予測の割合の全体的な精度として定義されます。
本明細書で使用される場合、正しく出力の数の総数で割った分子と分母で予測。次のコードは、計算の正確さを示しています。
In [
10
]: accuracy
=
np.
round
(
...: metrics.accuracy_score(y_true
=
actual_labels,
...: y_pred
=
predicted_labels),
2
)
...: accuracy_manual
=
np.
round
(
...: (true_positive
+
true_negative)
/
...: (true_positive
+
true_negative
+
...: false_negative
+
false_positive),
2
)
...:
print
(
'Accuracy:'
, accuracy)
...:
print
(
'Manually computed accuracy:'
, accuracy_manual)
...:
Accuracy:
0.45
Manually computed accuracy:
0.45
|
すべての関連するタイミング精度クラスの予測数の比は、一般式を使用することができるように積極的に、クラスを予測するように定義されます。
偽陽性の数の予測を含む正カテゴリを分割することで正しい予測、多数の通常のクラスのすべての予測数。次のコードは、正確なレートの計算を示します。
In [
11
]: precision
=
np.
round
(
...: metrics.precision_score(y_true
=
actual_labels,
...: y_pred
=
predicted_labels,
...: pos_label
=
positive_class),
2
)
...: precision_manual
=
np.
round
(
...: (true_positive)
/
...: (true_positive
+
false_positive),
2
)
...:
print
(
'Precision:'
, precision)
...:
print
(
'Manually computed precision:'
, precision_manual)
...:
Precision:
0.45
Manually computed precision:
0.45
|
リコールが正しく定義もヒット率、カバレッジや感度の割合として知られているn型のインスタンスの数を予測し、式は次のように記述することができます。
その中でも、正しくの数で正規を使用ヒット率を取得し、正しく予測と不正確数の合計を分割することによって予測しました。次のコードは、計算されたリコールを示しています。
In [
12
]: recall
=
np.
round
(
...: metrics.recall_score(y_true
=
actual_labels,
...: y_pred
=
predicted_labels,
...: pos_label
=
positive_class),
2
)
...: recall_manual
=
np.
round
(
...: (true_positive)
/
...: (true_positive
+
false_negative),
2
)
...:
print
(
'Recall:'
, recall)
...:
print
(
'Manually computed recall:'
, recall_manual)
...:
Recall:
0.5
Manually computed recall:
0.5
|
F1スコアは、以下の式で表される精度と再現率の調和平均を計算することによって得られた別の標準的な指標です。
F1スコアとして、次のコードを使用して計算することができます。
In [
13
]: f1_score
=
np.
round
(
...: metrics.f1_score(y_true
=
actual_labels,
...: y_pred
=
predicted_labels,
...: pos_label
=
positive_class),
2
)
...: f1_score_manual
=
np.
round
(
...: (
2
*
precision
*
recall)
/
...: (precision
+
recall),
2
)
...:
print
(
'F1 score:'
, f1_score)
...:
print
(
'Manually computed F1 score:'
, f1_score_manual)
...:
F1 score:
0.48
Manually computed F1 score:
0.47
|
ここでは主な指標の分類を評価するための最も一般的に使用されるモデルのほんの一部です、パフォーマンス指標は、アップルのより正式なモデルに使用されます。