Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.

Оценка качества классификатора с помощью матрицы ошибок

Пример использования матрицы ошибок для оценки качества результатов классификатора на наборе данных ирисов. Элементы диагонали показывают количество объектов, для которых предсказанная метка совпадает с истинной, а элементы вне диагонали — количество объектов, которым классификатор присвоил неверные метки. Чем выше значения на диагонали матрицы ошибок, тем лучше: это означает, что было сделано много правильных предсказаний.

На рисунках показана матрица ошибок с нормализацией по количеству объектов в каждом классе и без неё. Такая нормализация может быть полезна при несбалансированности классов, поскольку помогает нагляднее увидеть, какие классы классифицируются неверно.

Результаты не так хороши, как могли бы быть, поскольку мы выбрали не самое подходящее значение параметра регуляризации C. В реальных приложениях этот параметр обычно выбирают с помощью метода Настройка гиперпараметров оценивателя.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

import matplotlib.pyplot as plt
import numpy as np

from sklearn import datasets
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split

# import some data to play with
iris = datasets.load_iris()
X = iris.data
y = iris.target
class_names = iris.target_names

# Split the data into a training set and a test set
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# Run classifier, using a model that is too regularized (C too low) to see
# the impact on the results
classifier = LogisticRegression(C=0.01).fit(X_train, y_train)

np.set_printoptions(precision=2)

# Plot non-normalized confusion matrix
titles_options = [
    ("Confusion matrix, without normalization", None),
    ("Normalized confusion matrix", "true"),
]
for title, normalize in titles_options:
    disp = ConfusionMatrixDisplay.from_estimator(
        classifier,
        X_test,
        y_test,
        display_labels=class_names,
        cmap=plt.cm.Blues,
        normalize=normalize,
    )
    disp.ax_.set_title(title)

    print(title)
    print(disp.confusion_matrix)

plt.show()
  • Confusion matrix, without normalization
  • Normalized confusion matrix
Confusion matrix, without normalization
[[13  0  0]
 [ 0  3 13]
 [ 0  0  9]]
Normalized confusion matrix
[[1.   0.   0.  ]
 [0.   0.19 0.81]
 [0.   0.   1.  ]]

Бинарная классификация

Для бинарной классификации используйте sklearn.metrics.confusion_matrix с методом ravel, чтобы получить количество истинно отрицательных, ложноположительных, ложноотрицательных и истинно положительных результатов.

Чтобы получить количество истинно отрицательных, ложноположительных, ложноотрицательных и истинно положительных результатов при разных пороговых значениях, можно использовать sklearn.metrics.confusion_matrix_at_thresholds. Это необходимо для таких метрик бинарной классификации, как roc_auc_score и det_curve.

from sklearn.datasets import make_classification
from sklearn.metrics import confusion_matrix_at_thresholds

X, y = make_classification(
    n_samples=100,
    n_features=20,
    n_informative=20,
    n_redundant=0,
    n_classes=2,
    random_state=42,
)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

classifier = LogisticRegression(C=0.01)
classifier.fit(X_train, y_train)

y_score = classifier.predict_proba(X_test)[:, 1]

tns, fps, fns, tps, thresholds = confusion_matrix_at_thresholds(y_test, y_score)

# Plot TNs, FPs, FNs and TPs vs Thresholds
plt.figure(figsize=(10, 6))

plt.plot(thresholds, tns, label="True Negatives (TNs)")
plt.plot(thresholds, fps, label="False Positives (FPs)")
plt.plot(thresholds, fns, label="False Negatives (FNs)")
plt.plot(thresholds, tps, label="True Positives (TPs)")
plt.xlabel("Thresholds")
plt.ylabel("Count")
plt.title("TNs, FPs, FNs and TPs vs Thresholds")
plt.legend()
plt.grid()

plt.show()
TNs, FPs, FNs and TPs vs Thresholds

Общее время выполнения скрипта: (0 минут 0.329 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_confusion_matrix.ipynb

Download Python source code: plot_confusion_matrix.py

Download zipped: plot_confusion_matrix.zip

Связанные примеры

Распознавание рукописных цифр

Классификация методом ближайшего центроида

Построение поверхности принятия решений для деревьев решений, обученных на наборе данных ирисов

Основные нововведения scikit-learn 1.5

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/model_selection/plot_confusion_matrix.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API