PyInv

プログラミングのメモ、海外投資のメモ

続Modelの評価 - Dummy ClassifierとConfusion Matrix

Accuracy以外での評価

例えばImbalance Data(不均衡データ)の評価はどうあってもAccuracyが高くなるため、他の指標を用いる必要がある

  • Dummy Classifierで基準となる評価値を取得
  • 探索的にDummy ClassifierよりよいModelを発見
  • Confusion MatrixでAccuracy以外の評価値を比較

Dummy Classifier

説明変数を用いず、被説明変数を使ってシンプルな予測を返す。つまり単純に被説明変数の分布を再現する。
Modelによる推定ではないのでスタートとしてよい。Dummy Classifierより評価が高いことがModelの最低限の条件となる。

Usage
from sklearn.dummy import DummyClassifier
class sklearn.dummy.DummyClassifier(strategy='warn', random_state=None, constant=None)

Parameter: strategy (default as stratified)
choose

  • frequency
  • most_frequent
  • prior
  • uniform
  • constant


Confusion Matrix

Modelの予測値と観測地の関係を表した行列。統計でいう第1種の過誤と第2種の過誤を返す

  Predicted Negative Predicted Positive
True Negative TN FP
Tru Positive FN TP

Structure
from sklearn.metrics import confusion_matrix
sklearn.metrics.confusion_matrix(y_true,
                               y_pred,
                               labels=None,
                               sample_weight=None,
                               normalize=None)
Sample
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.metrics import confusion_matrix

cancer = load_breast_cancer()
X = pd.DataFrame(cancer.data, columns=cancer.feature_names)
y = pd.Series(cancer.target)

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

clf = DecisionTreeClassifier(criterion='gini', max_depth=5,min_samples_leaf=3 ,random_state=0)
clf.fit(X_train,y_train)

#Score
print('{} train score: {:.3f}'.format(clf.__class__.__name__, clf.score(X_train, y_train)))
print('{} test score: {:.3f}'.format(clf.__class__.__name__, clf.score(X_test, y_test)))

#Confusion Matrix
y_pred = clf.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print('Confusion Matrix:\n{}'.format(cm))

f:id:singapp:20200918155353p:plain




ここで

Claffisicatoin Report

Confusion_matrix から、各種評価値をつくる

  1. Accuracy(正解率): 全体のうち、どれだけ正しく予測しているか

     \displaystyle{\frac{(TN+TP)}{(TN+FP+FN+TP)}}
      

  1. Recall(再現率、検出率): 本来真のもののうち、どれだけ真と予測されたか

      \displaystyle{\frac{TP}{(FN+TP)}}

  1. Precision(適合率、精度): 真と予測されたもののうち、どれだけ本来真か

     \displaystyle{\frac{TP}{(FP+TP)}}

  1. F1: PrecisionとRecallの調和平均

   \displaystyle{2\times\frac{Precision\times Recall}{(Precision+Recall)}}

Structure
from sklearn.metrics import classification_report
sklearn.metrics.classification_report(y_true,
                                      y_pred, labels=None,
                                      target_names=None,
                                      sample_weight=None,
                                      digits=2,
                                      output_dict=False,
                                      zero_division='warn')

Sample
from sklearn.metrics import classification_report
target_names = ['class 0', 'class 1']

#classificationをDataFrameにする(Jupyter上の見た目がきれいになる)
pd.DataFrame(classification_report(y_test,y_pred, target_names=target_names, output_dict=True))



f:id:singapp:20200918161345p:plain