続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))
ここで
Claffisicatoin Report
Confusion_matrix から、各種評価値をつくる
- Accuracy(正解率): 全体のうち、どれだけ正しく予測しているか
- Recall(再現率、検出率): 本来真のもののうち、どれだけ真と予測されたか
- Precision(適合率、精度): 真と予測されたもののうち、どれだけ本来真か
- F1: 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))