Сравнение калибровки классификаторов

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы сравним калибровку четырех различных моделей: Логистическая регрессия, Гауссовский наивный байесовский классификатор, Случайный лес классификатор и Линейный SVM. Для каждой модели будут построены графики калибровки, которые показывают зависимость между предсказанными вероятностями и фактическими результатами. Это важно, потому что хорошо калиброванные модели дают точные и надежные вероятности.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике в Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/naive_bayes("Naive Bayes") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/calibration("Probability Calibration") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/naive_bayes -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/ensemble -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/svm -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/model_selection -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/calibration -.-> lab-49088{{"Сравнение калибровки классификаторов"}} sklearn/datasets -.-> lab-49088{{"Сравнение калибровки классификаторов"}} ml/sklearn -.-> lab-49088{{"Сравнение калибровки классификаторов"}} end

Импортируем библиотеки и генерируем датасет

Начнем с импорта необходимых библиотек и генерации синтетического бинарного датасета классификации с 100 000 образцами и 20 признаками. Из 20 признаков только 2 информативны, 2 избыточны, а оставшиеся 16 не несут информации. Из 100 000 образцов 100 будут использоваться для настройки модели, а остальные для тестирования.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

## Generate dataset
X, y = make_classification(
    n_samples=100_000, n_features=20, n_informative=2, n_redundant=2, random_state=42
)

train_samples = 100  ## Samples used for training the models
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    shuffle=False,
    test_size=100_000 - train_samples
)

Построение графиков калибровки

Мы обучаем каждую из четырех моделей на маленьком тренировочном наборе данных и строим графики калибровки, используя предсказанные вероятности для тестового набора данных. Графики калибровки создаются путем группировки предсказанных вероятностей по ящикам, а затем построения средней предсказанной вероятности в каждом ящике против наблюдаемой частоты («доля положительных»). Под графиком калибровки мы строим гистограмму, показывающую распределение предсказанных вероятностей, или более конкретно, количество образцов в каждом ящике предсказанной вероятности.

import numpy as np
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibrationDisplay
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

## Create classifiers
lr = LogisticRegression()
gnb = GaussianNB()
svc = NaivelyCalibratedLinearSVC(C=1.0, dual="auto")
rfc = RandomForestClassifier()

clf_list = [
    (lr, "Logistic"),
    (gnb, "Naive Bayes"),
    (svc, "SVC"),
    (rfc, "Random forest"),
]

fig = plt.figure(figsize=(10, 10))
gs = GridSpec(4, 2)
colors = plt.get_cmap("Dark2")

ax_calibration_curve = fig.add_subplot(gs[:2, :2])
calibration_displays = {}
markers = ["^", "v", "s", "o"]
for i, (clf, name) in enumerate(clf_list):
    clf.fit(X_train, y_train)
    display = CalibrationDisplay.from_estimator(
        clf,
        X_test,
        y_test,
        n_bins=10,
        name=name,
        ax=ax_calibration_curve,
        color=colors(i),
        marker=markers[i],
    )
    calibration_displays[name] = display

ax_calibration_curve.grid()
ax_calibration_curve.set_title("Calibration plots")

## Add histogram
grid_positions = [(2, 0), (2, 1), (3, 0), (3, 1)]
for i, (_, name) in enumerate(clf_list):
    row, col = grid_positions[i]
    ax = fig.add_subplot(gs[row, col])

    ax.hist(
        calibration_displays[name].y_prob,
        range=(0, 1),
        bins=10,
        label=name,
        color=colors(i),
    )
    ax.set(title=name, xlabel="Mean predicted probability", ylabel="Count")

plt.tight_layout()
plt.show()

Интерпретация графиков калибровки

Графики калибровки показывают зависимость между предсказанными вероятностями и фактическими результатами для каждой модели. Хорошо калиброванные модели дают графики, которые следуют по диагональной линии, что означает, что предсказанные вероятности соответствуют фактическим результатам. Четыре модели дают разные результаты:

  • Логистическая регрессия дает хорошо калиброванные предсказания, так как напрямую оптимизирует log-loss.
  • Гауссовский наивный байесовский классификатор имеет тенденцию к тому, чтобы вероятности были приближены к 0 или 1, главным образом потому, что уравнение наивного байеса дает правильную оценку вероятностей только при условии, что выполняется предположение о условной независимости признаков.
  • Случайный лес классификатор демонстрирует противоположное поведение: гистограммы показывают пики при вероятностях приблизительно 0,2 и 0,9, в то время как вероятности, близкие к 0 или 1, очень редки.
  • Линейный SVM демонстрирует еще более сигмоидальный график, чем Случайный лес классификатор, что характерно для методов с максимальным отступом.

Заключение

В этом лабораторном занятии мы сравнили калибровку четырех различных моделей: Логистическая регрессия, Гауссовский наивный байесовский классификатор, Случайный лес классификатор и Линейный SVM. Мы построили графики калибровки для каждой модели и заметили, что хорошо калиброванные модели дают графики, которые следуют по диагональной линии. Четыре модели дали разные результаты, при этом Логистическая регрессия была хорошо калибрована, а другие модели показали различную степень искажения. Калибровка является важной аспектом машинно-обучаемых моделей, и хорошо калиброванные модели дают точные и надежные вероятности.

Резюме

Поздравляем! Вы завершили лабораторную работу по сравнению калибровки классификаторов. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.