Scikit-learn: sklearn.metrics.classification_report salah?

Dibuat pada 1 Apr 2020  ·  3Komentar  ·  Sumber: scikit-learn/scikit-learn

Jelaskan bugnya

sklearn.metrics.classification dapat melaporkan nilai terbalik untuk presisi dan perolehan?

Langkah / Kode untuk Direproduksi

from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets

def calc_precision_recall(conf_matrix, class_labels):

    # for each class
    for i in range(len(class_labels)):

        # calculate true positives
        true_positives =(conf_matrix[i, i])

        # false positives
        false_positives = (conf_matrix[i, :].sum() - true_positives)

        # false negatives
        false_negatives = 0
        for j in range(len(class_labels)):
            false_negatives += conf_matrix[j, i]
        false_negatives -= true_positives

        # and finally true negatives
        true_negatives= (conf_matrix.sum() - false_positives - false_negatives - true_positives)

        # print calculated values
        print(
            "Class label", class_labels[i],
            "T_positive", true_positives,
            "F_positive", false_positives,
            "T_negative", true_negatives,
            "F_negative", false_negatives,
            "\nSensitivity/recall", true_positives / (true_positives + false_negatives),
            "Specificity", true_negatives / (true_negatives + false_positives),
            "Precision", true_positives/(true_positives+false_positives), "\n"
        )

    return

# import some data to play with
iris = datasets.load_iris()
X = iris.data[:, 0:3]  # we only take the first two features.
y = iris.target

# Random_state parameter is just a random seed that can be used to reproduce these specific results.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=27)

# Instantiate a K-Nearest Neighbors Classifier:
KNN_model = KNeighborsClassifier(n_neighbors=2)

# Fit the classifiers:
KNN_model.fit(X_train, y_train)

# Predict and store the prediction:
KNN_prediction = KNN_model.predict(X_test)

# Generate the confusion matrix
conf_matrix = confusion_matrix(KNN_prediction, y_test)

# Print the classification report
print(classification_report(KNN_prediction, y_test))

# Dummy class labels for the three iris classes
class_labels = [0,1,2]

# Own function to calculate precision and recall from the confusion matrix
calc_precision_recall(conf_matrix, class_labels)

Hasil yang diharapkan

Fungsi saya mengembalikan yang berikut untuk setiap kelas:

Label kelas 0 T_positive 7 F_positive 0 T_negative 23 F_negative 0
Sensitivitas / recall 1.0 Specificity 1.0 Presisi 1.0

Label kelas 1 T_positif 11 F_positif 1 T_negatif 18 F_ negatif 0
Sensitivitas / recall 1.0 Specificity 0.9473684210526315 Presisi 0.9166666666666666

Label kelas 2 T_positif 11 F_positif 0 T_negatif 18 F_ negatif 1
Sensitivitas / recall 0.9166666666666666 Specificity 1.0 Presisi 1.0

          precision    recall  

       0       1.00      1.00      
       1       0.92      1.00    
       2       1.00      0.92

Fungsi saya mengasumsikan matriks kebingungan terstruktur dengan nilai aktual di sumbu x atas dan nilai prediksi di bawah sumbu y kiri. Ini adalah struktur yang sama dengan yang digunakan di Wikipedia dan yang direferensikan dalam dokumentasi untuk fungsi matriks kebingungan.

Hasil nyata

Sebaliknya, ini adalah hasil yang dilaporkan oleh sklearn.metrics import klasifikasi_report

           precision    recall  f1-score   support

       0       1.00      1.00      1.00         7
       1       1.00      0.92      0.96        12
       2       0.92      1.00      0.96        11

Versi

Sistem:
python: 3.8.1 (default, 8 Jan 2020, 22:29:32) [GCC 7.3.0]
dapat dieksekusi: / home / will / anaconda3 / envs / ElStatLearn / bin / python
mesin: Linux-4.15.0-91-generic-x86_64-with-glibc2.10

Dependensi Python:
pip: 20.0.2
setuptools: 38.2.5
sklearn: 0.22.1
numpy: 1.18.1
scipy: 1.4.1
Cython: Tidak ada
panda: 1.0.1
matplotlib: 3.1.3
joblib: 0.14.1

Dibangun dengan OpenMP: True

triage metrics

Komentar yang paling membantu

Saya pikir y_test harus menjadi yang pertama dalam print(classification_report(KNN_prediction, y_test)) .

Jadi: print(classification_report(y_test, KNN_prediction)) .

Fungsi sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn') memiliki y_true sebagai argumen pertama. Ini akan membalik presisi dan perolehan.

Lihat klasifikasi_laporan .

Sunting: matriks kebingungan Anda juga mundur, tetapi berhasil karena matriks kebingungan sklearn mundur dari wikipedia.

>>> from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

Anda dapat melihat bahwa ada 1 observasi di baris 1 dan 0 di kolom 1, jadi baris-baris tersebut adalah kebenaran dasar dan kolom adalah prediksi. Jadi, Anda dapat menggunakan notasi C[i, j] ditampilkan di confusion_matrix

Semua 3 komentar

Saya pikir y_test harus menjadi yang pertama dalam print(classification_report(KNN_prediction, y_test)) .

Jadi: print(classification_report(y_test, KNN_prediction)) .

Fungsi sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False, zero_division='warn') memiliki y_true sebagai argumen pertama. Ini akan membalik presisi dan perolehan.

Lihat klasifikasi_laporan .

Sunting: matriks kebingungan Anda juga mundur, tetapi berhasil karena matriks kebingungan sklearn mundur dari wikipedia.

>>> from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

Anda dapat melihat bahwa ada 1 observasi di baris 1 dan 0 di kolom 1, jadi baris-baris tersebut adalah kebenaran dasar dan kolom adalah prediksi. Jadi, Anda dapat menggunakan notasi C[i, j] ditampilkan di confusion_matrix

Terima kasih banyak telah memperjelas hal itu - referensi wikipedia membuat saya bingung!

Tidak masalah, mungkin sebaiknya Wikipedia mengalihkan contoh mereka ke orientasi sklearn.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat