Гистограмма предсказаний

Как простая гистограмма предсказаний готовит сюрпризы и помогает выигрывать, а не гадать!

Гистограмма предсказаний – это визуальный инструмент, позволяющий быстро оценить распределение вероятностей, выдаваемых моделью машинного обучения; Она помогает понять, насколько уверена модель в своих ответах, выявить перекосы классов и найти аномалии в данных․

Почему гистограмма предсказаний так важна?

Самое главное помнить, что гистограмма позволяет сравнить распределение предсказаний на обучающем и тестовом наборе, а также увидеть, где модель переоценивает или недооценивает вероятность того или иного класса․

Очень важно, что без визуального контроля можно упустить систематические ошибки, которые потом будет трудно исправлять․

Подготовка данных

  1. Получите массив предсказанных вероятностей от модели (например, model․predict_proba(X))․
  2. Отделите предсказания по каждому классу, если их несколько․
  3. Если необходимо, превратите массив в DataFrame для удобства․

Пример кода на Python:

import numpy as np
import pandas as pd

proba = clf․predict_proba(X_test) # shape = (n_samples, n_classes)
df_proba = pd․DataFrame(proba, columns=['Class_0', 'Class_1', 'Class_2'])

Построение гистограммы средствами matplotlib

Самый базовый способ – использовать функцию plt․hist․ Ниже пример, показывающий распределение предсказаний для первого класса․

import matplotlib․pyplot as plt

class0 = df_proba['Class_0']
plt․figure(figsize=(8, 4))
plt․hist(class0, bins=20, color='steelblue', edgecolor='black', alpha=0․7)
plt․title('Гистограмма предсказаний класса 0')
plt․xlabel('Вероятность')
plt․ylabel('Количество образцов')
plt․grid(True, linestyle='--', alpha=0․5)
plt․tight_layout
plt․show

Гистограмма предсказаний нескольких классов на одном графике

Для сравнения удобно построить боковые столбцы (side‑by‑side bars)․ Ниже – готовый шаблон, взятый из примеров в интернете․

import numpy as np

n_classes = df_proba․shape[1]
counts_train = [] # если есть отдельный train‑set
counts_test = []

for i in range(n_classes):
 prob_i = df_proba․iloc[:, i]
 # Условие «предсказанный» класс = i
 pred_i = np․argmax(proba, axis=1) == i
 counts_test․append(pred_i․sum / len(pred_i))

x = np․arange(n_classes)
width = 0․35

plt․figure(figsize=(9,5))
plt․bar(x ⎼ width/2, counts_test, width, label='Тест', color='tomato', alpha=0․8)
plt․xticks(x, [f'Класс {i}' for i in range(n_classes)])
plt․ylabel('Доля предсказаний')
plt․title('Распределение предсказаний по классам')
plt․legend
plt․grid(axis='y', linestyle='--', alpha=0․6)
plt․tight_layout
plt․show

Более продвинутый вариант: seaborn и KDE

Библиотека seaborn позволяет сразу добавить плотность распределения (KDE) и удобно группировать по классам․

import seaborn as sns

plt․figure(figsize=(10,4))
for cls in df_proba․columns:

 sns․histplot(df_proba[cls], kde=True, bins=20,
 label=cls, stat='density', alpha=0․5)

plt․title('Гистограммы предсказаний всех классов с KDE')
plt․xlabel('Вероятность')
plt․ylabel('Плотность')
plt․legend
plt․grid(True, linestyle='--', alpha=0․4)
plt․show

Интерпретация полученных графиков

  • Смещение в сторону 1․0 – модель уверенно предсказывает данный класс․
  • Большой разброс по всему диапазону [0,1] – модель «нерешительна», вероятно, данные недостаточно информативны․
  • Пики в середине (≈0․5) часто указывают на два‑классовую задачу, где модель часто «сомневается» между двумя вариантами․
  • Различия между обучающим и тестовым набором могут свидетельствовать о переобучении: если на train‑set вероятность почти всегда 1․0, а на test‑set распределена, модель слишком «запомнила» обучающие примеры․

Типичные ошибки и способы их избежать

  1. Недостаточное количество бинов․ При малом числе столбцов (bins) скрываются детали․ Рекомендуем пробовать 20‑30 бинов и проверять стабильность графика․
  2. Отсутствие нормализации․ Если сравниваете разные наборы, используйте параметр density=True в hist или stat='density' в seaborn․
  3. Переполнение оси Y․ При перекрытии нескольких гистограмм столбцы могут «съедать» друг друга – используйте полупрозрачность (alpha) или отдельные подграфики (subplot)․
  4. Игнорирование несбалансированности классов․ Если один класс сильно преобладает, добавьте взвешивание или визуализируйте относительные частоты, а не абсолютные количества․

Полезные рекомендации

  • Сохраняйте графики в векторных форматах (PDF, SVG) – они не теряют качества при печати․
  • Для публикаций используйте plt․savefig('histogram․pdf', dpi=300, bbox_inches='tight')․
  • Записывайте в комментариях к графику основные выводы – так они будут видны сразу, без необходимости перечитывать текст статьи․
  • Объединяйте гистограммы с другими типами визуализаций (ROC‑кривые, confusion‑matrix) – комплексный подход дает более полную картину․

Контакты для обращений

Если у вас возникли вопросы по построению гистограмм, интерпретации результатов или настройке визуализаций, вы можете связаться со мной любым удобным способом:

  • Электронная почта: ml․helper@example․com
  • Telegram: @ml_helper_bot
  • GitHub: github․com/ml-helper (откройте issue с темой «Histogram Help»)
  • Телефон (рабочее время 10:00–18:00 МСК): +7 (495) -23‑45‑67

Не стесняйтесь делиться своими результатами, задавать уточняющие вопросы и предлагать улучшения – совместно мы сделаем анализ предсказаний ещё более эффективным!


Дата публикации: 10 марта 2026 г․