Введение
В этом лабораторном занятии мы сравним калибровку четырех различных моделей: Логистическая регрессия, Гауссовский наивный байесовский классификатор, Случайный лес классификатор и Линейный SVM. Для каждой модели будут построены графики калибровки, которые показывают зависимость между предсказанными вероятностями и фактическими результатами. Это важно, потому что хорошо калиброванные модели дают точные и надежные вероятности.
Советы по работе с ВМ
После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике в Jupyter Notebook.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем библиотеки и генерируем датасет
Начнем с импорта необходимых библиотек и генерации синтетического бинарного датасета классификации с 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, чтобы улучшить свои навыки.