分類評価指標


1.ハイブリッドマトリックス融合マトリックス


真位置TP:予測実位置値が位置(正しい)
True Negative TN:予測実際のNegative値がNegative(正しい)
False Positive FP:実際の負の値をPositive(エラー)-1型エラー(別名)と予測する
False Negative FN:予測(エラー)実績値がNegative(エラー)-2型エラー
混同行列を求めると,どれが正しいか,どれが間違っているかが分かる.

2.精度評価


すべてのデータでデータを正しく分類する割合.
モデルの分類がどれほど正確かを表す
分類モデルの主な評価方法として一般的に用いられる.
しかし、等級の割合が不均衡であれば、評価指標は信頼性を失う可能性がある.
Accuracy = TP+TN/P+N
P: TP+FN
N: TN+FP

3.精度PRECISION


モデルがPositiveに分類されたデータでは、
実績データの割合
重要なのは「ネガティブ」
(つまり、実際に負の値のデータをPositiveと見なすべきではない)
使用する指標
精度(Precision)=TP/TP+FP

負の値が重要-例


スパム分類の問題
メールがスパムの場合はPositive;
迷惑メール以外(通常メール)は使用できません
通常のメールエラーはスパムです!予測すると
重要メールが受信できない場合があります
このとき「精度」が大切

4.再現率Recoll、TPR)


実際の位置のデータでは、
モデルがPositiveに分類されたデータの割合
位置は非常に重要です
つまり、データを非アクティブと見なすことができなければ、使用する指標は
Recall = TP/TP+FN = TP/P

位置は非常に重要です


...悪性腫瘍の有無を判定する検査.
悪性腫瘍は陽性であり、
非悪性腫瘍すなわち良性腫瘍は陰性である
悪性腫瘍が良性腫瘍であると誤って予測した場合
治療を受けられないと、命が危ないかもしれません.

5.多種類の分類指標の運用


分類目的に基づいて各種指標を計算し評価する
  • の分類結果を完全に表示するには、->ハイブリッドマトリクス
  • を参照してください.
  • の正解数->正解率
  • FPまたはFNが重要である場合->精度(Precision)、再生率(Recall)
  • 追求する問題と目的に応じて,適切な分類指標を用いることができる.

    6.実習1-混同行列


    ハイブリッドマトリクス
    「ハイブリッドマトリックス」(Confusion Matrix)は、分類問題でモデルを学習し、モデル内のデータのX値を実際のデータのY値と比較して、正しく分類されているかどうかを決定するメトリックです.

    上記の表は混同行列であり、各表の値は次のように表されます.
    True Positive(TP):実績値はPositive、予測値もPositiveです.
    False Positive(FP):実績値は負、予測値はPositiveです.
    False Negative(FN):実際の値は正、予測値は負です.
    真陰性(TN):実績値は負、予測値も負.
    sklearnでは、上記の4つの評価値を取得するために使用できる機能が定義されています.
    本実験では2種類の分類データを用いて直接出力し,混同行列を検証する.
    マトリクスを混同するための中間実行関数/ライブラリconfusion_matrix(y_true, y_pred):Confusion matrixの値npを指定します.endarrayに戻ります.
    データ情報load_breast_cancer乳癌の判別データの有無の関数
    X(特徴データ):30患者データ
    Y(Label data):0陰性(悪性)、1陽性(正常)
    説明
    mixed matrixを使用してtest Yのmixedom matrixを計算し、cmに保存します.
    import numpy as np
    import pandas as pd
    import seaborn as sns
    from matplotlib import pyplot as plt
    from sklearn.datasets import load_breast_cancer
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn import tree
    from sklearn.metrics import confusion_matrix
    from sklearn.utils.multiclass import unique_labels
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
    
    # sklearn에 저장된 데이터를 불러 옵니다.
    X, Y = load_breast_cancer(return_X_y = True)
    X = np.array(X)
    Y = np.array(Y)
    
    # 데이터 정보를 출력합니다
    print('전체 샘플 개수: ',len(X))
    print('X의 feature 개수: ',len(X[0]))
    
    # 학습용 평가용 데이터로 분리합니다
    train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
    
    # 분리된 평가용 데이터 정보를 출력합니다
    print('평가용 샘플 개수: ',len(test_Y))
    print('클래스 0인 평가용 샘플 개수: ',len(test_Y)-sum(test_Y))
    print('클래스 1인 평가용 샘플 개수: ',sum(test_Y),'\n')
    
    # DTmodel에 의사결정나무 모델을 초기화 하고 학습합니다
    DTmodel = DecisionTreeClassifier()
    DTmodel.fit(train_X, train_Y)
    
    # test_X을 바탕으로 예측한 값을 저장합니다
    y_pred = DTmodel.predict(test_X)
    
    """
    1. 혼동 행렬을 계산합니다
    """
    cm = confusion_matrix(test_Y, y_pred)
    print('Confusion Matrix : \n {}'.format(cm))
    
    # 혼동 행렬을 출력합니다
    fig = plt.figure(figsize=(5,5))
    ax = sns.heatmap(cm, annot=True)
    ax.set(title='Confusion Matrix',
                ylabel='True label',
                xlabel='Predicted label')
    fig.savefig("decistion_tree.png")
    elice_utils.send_image("decistion_tree.png")

    7.練習2-計算精度Accession


    実験1の結果から,分類性能の単純で重要な精度を計算することによってモデルの性能を判別する.
    本実験では,学習データの計算と評価データの精度の比較を行い,それらの性能を比較する.
    正確な計算に使用される中間実行関数/ライブラリDTmodel.score(train_X, train_Y):train Xデータの精度(精度)値を計算します.
    データ情報load_breast_cancer乳癌の判別データの有無の関数
    X(特徴データ):30患者データ
    Y(Label data):0陰性(悪性)、1陽性(正常)
    説明
    scoreを使用してtrain Xの精度を計算し、acc trainに保存します.
    scoreを使用してtest Xの精度を計算し、acc testに保存します.
    Tips!accuracy_score(Y_true, Y_pred)を用いて精度を求めることができる.Y trueとY predはそれぞれ実値と予測値を表す.
    import numpy as np
    import pandas as pd
    import seaborn as sns
    from matplotlib import pyplot as plt
    from sklearn.datasets import load_breast_cancer
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn import tree
    from sklearn.metrics import confusion_matrix
    from sklearn.utils.multiclass import unique_labels
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
    
    # sklearn에 저장된 데이터를 불러 옵니다.
    X, Y = load_breast_cancer(return_X_y = True)
    X = np.array(X)
    Y = np.array(Y)
    
    # 학습용 평가용 데이터로 분리합니다
    train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
    
    # 분리된 데이터 정보를 출력합니다
    print('학습용 샘플 개수: ',len(train_Y))
    print('클래스 0인 학습용 샘플 개수: ',len(train_Y)-sum(train_Y))
    print('클래스 1인 학습용 샘플 개수: ',sum(train_Y),'\n')
    
    print('평가용 샘플 개수: ',len(test_Y))
    print('클래스 0인 평가용 샘플 개수: ',len(test_Y)-sum(test_Y))
    print('클래스 1인 평가용 샘플 개수: ',sum(test_Y),'\n')
    
    # DTmodel에 의사결정나무 모델을 초기화 하고 학습합니다
    DTmodel = DecisionTreeClassifier()
    DTmodel.fit(train_X, train_Y)
    
    
    # 예측한 값을 저장합니다
    y_pred_train = DTmodel.predict(train_X)
    y_pred_test = DTmodel.predict(test_X)
    
    # 혼동 행렬을 계산합니다
    cm_train = confusion_matrix(train_Y, y_pred_train)
    cm_test = confusion_matrix(test_Y, y_pred_test)
    print('train_X Confusion Matrix : \n {}'.format(cm_train))
    print('test_X Confusion Matrix : \n {}'.format(cm_test))
    
    """
    1. 정확도를 계산합니다.
    """
    acc_train = DTmodel.score(train_X, train_Y)
    acc_test = DTmodel.score(test_X, test_Y)
    acc_train_2 = accuracy_score(train_Y, y_pred_train)
    acc_test_2 = accuracy_score(test_Y, y_pred_test)
    
    # 정확도를 출력합니다.
    print('train_X Accuracy: %f' % (acc_train))
    print('test_X Accuracy: %f' % (acc_test))
    print('train_X Accuracy: %f' % (acc_train_2))
    print('test_X Accuracy: %f' % (acc_test_2))
    
    DTmodel.scoreを使用する場合は、予測で使用するX値と実際のY値のデータを順次入力するだけです.
    精度scoreを使用する場合は、実Y値、予測Y値データの順に入れればよい.

    8.実験3-計算精度(Precision)、再現率(Recoll)


    実験2の結果から,分類指標における精度と再現率を計算し,モデルの性能を判別する.
    本実験では,学習データを計算し,データの精度と再現率を評価し,それらの性能を比較する.
    精度と再現率を計算するためのSikerun関数/ライブラリprecision_score(train_Y, y_pred_train):学習に使用するデータの精度値を計算します.recall_score(train_Y, y_pred_train):学習に使用するデータのリコール率値を計算します.
    データ情報load_breast_cancer乳癌の判別データの有無の関数
    X(特徴データ):30患者データ
    Y(Label data):0陰性(悪性)、1陽性(正常)
    説明precision_scoreを使用して、学習および評価のためのデータの精度を計算し、精度train、精度testに格納する.recall_scoreを使用して、学習および評価のためのデータの再現率を計算し、recall train、recall testに格納する.
    import numpy as np
    import pandas as pd
    import seaborn as sns
    from matplotlib import pyplot as plt
    from sklearn.datasets import load_breast_cancer
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn import tree
    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import precision_score
    from sklearn.metrics import recall_score
    
    from elice_utils import EliceUtils
    elice_utils = EliceUtils()
    
    
    # sklearn에 저장된 데이터를 불러 옵니다.
    X, Y = load_breast_cancer(return_X_y = True)
    X = np.array(X)
    Y = np.array(Y)
    
    # 학습용 평가용 데이터로 분리합니다
    train_X, test_X, train_Y, test_Y = train_test_split(X, Y, test_size=0.2, random_state = 42)
    
    # DTmodel에 의사결정나무 모델을 초기화 하고 학습합니다
    DTmodel = DecisionTreeClassifier()
    DTmodel.fit(train_X, train_Y)
    
    
    # 예측한 값을 저장합니다
    y_pred_train = DTmodel.predict(train_X)
    y_pred_test = DTmodel.predict(test_X)
    
    # 혼동 행렬을 계산합니다
    cm_train = confusion_matrix(train_Y, y_pred_train)
    cm_test = confusion_matrix(test_Y, y_pred_test)
    print('train_X Confusion Matrix : \n {}'.format(cm_train))
    print('test_X Confusion Matrix : \n {}'.format(cm_test),'\n')
    
    """
    1. 정밀도를 계산합니다.
    """
    precision_train = precision_score(train_Y, y_pred_train)
    precision_test = precision_score(test_Y, y_pred_test)
    
    # 정밀도를 출력합니다.
    print('train_X Precision: %f' % (precision_train))
    print('test_X Precision: %f' % (precision_test),'\n')
    
    """
    2. 재현율을 계산합니다.
    """
    recall_train = recall_score(train_Y, y_pred_train)
    recall_test = recall_score(test_Y, y_pred_test
    
    # 재현율을 출력합니다.
    print('train_X Recall: %f' % (recall_train))
    print('test_X Recall: %f' % (recall_test))