Что такое взвешенное среднее (Weighted Mean)?

Ответ

Взвешенное среднее (Weighted Mean) — это обобщение среднего арифметического, где каждому элементу выборки присваивается вес, отражающий его важность или частоту. Элементы с большим весом вносят больший вклад в итоговое значение.

Формула: weighted_mean = Σ (w_i * x_i) / Σ w_i где x_i — значения, w_i — их веса.

Зачем это нужно в ML/Data Science:

  1. Обработка несбалансированных данных: При вычислении средней ошибки или метрики по классам можно дать больше веса редкому, но важному классу.
  2. Агрегация оценок моделей: Например, ensemble-модель, где итоговый прогноз — это взвешенное среднее прогнозов базовых моделей, а веса отражают их точность.
  3. Метрики качества: F1-score с параметром average='weighted' вычисляет метрику для каждого класса, а затем усредняет их, взвешивая по поддержке класса (количеству экземпляров).

Примеры на Python:

import numpy as np

# Пример 1: Базовый расчет
values = np.array([85, 90, 78])
weights = np.array([0.3, 0.5, 0.2])  # Важность каждой оценки
weighted_mean = np.average(values, weights=weights)
print(f"Взвешенное среднее оценок: {weighted_mean}")  # 85.7

# Пример 2: Имитация вычисления взвешенного MSE для несбалансированных классов
y_true = np.array([1, 1, 0, 0, 0, 0, 0])  # 2 позитивных, 5 негативных
predicted = np.array([0.9, 0.8, 0.3, 0.2, 0.1, 0.4, 0.2])
class_weights = np.array([2.5, 0.4])  # Вес для класса 1 и класса 0
# Создаем массив весов для каждого образца
sample_weights = np.where(y_true == 1, class_weights[1], class_weights[0])

# Вычисляем взвешенную среднеквадратичную ошибку
weighted_mse = np.average((y_true - predicted) ** 2, weights=sample_weights)
print(f"Взвешенная MSE: {weighted_mse:.4f}")

# Сравним с обычным MSE
regular_mse = np.mean((y_true - predicted) ** 2)
print(f"Обычная MSE: {regular_mse:.4f}")

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

Ответ 18+ 🔞

А, взвешенное среднее, говоришь? Ну это, бля, такая штука, когда ты не просто тупо складываешь всё и делишь, как дурак. Ты типа смотришь: вот этот кусок данных — он важный, пиздатый, на него надо обратить внимание. А вот этот — так, мусорок, пусть меньше влияет. И ты им веса разные навешиваешь, как гирьки на весы, понимаешь? Важному — гирю потяжелее, похуй на что — полегче.

Формула-то проще некуда, ёпта: weighted_mean = Σ (w_i * x_i) / Σ w_i Где x_i — это сами циферки, а w_i — это вес, который ты на них накинул. Суммируешь все «циферку, умноженную на её вес», а потом делишь на сумму всех весов. Всё, делов-то.

А нахуя это в машинке или данных нужно?

  1. Данные кривые, несбалансированные. Представь, у тебя 999 собак и 1 котик в выборке. Если ты будешь считать обычное среднее по всем, то про котика нихуя не узнаешь, он потеряется. А так ты можешь котику вес, бля, овердохуища дать, чтобы его голос был слышен. Чистая политика, но работает.
  2. Ансамбли моделей. У тебя есть три алгоритма, один — гений, два — так, мудя. Так вот, ты можешь прогноз гения взять с большим весом, а этих двух полупидоров — с маленьким. Итоговый прогноз будет умнее.
  3. Метрики. Та же F1-score. Можно посчитать её взвешенную версию, где каждый класс вносит вклад по своему размеру. Удобно, когда классов много и они по-разному представлены.

Смотри, как на Питоне выглядит, тут всё чётко:

import numpy as np

# Пример 1: Банальный расчёт
values = np.array([85, 90, 78])
weights = np.array([0.3, 0.5, 0.2])  # Вот тут вес каждой оценки
weighted_mean = np.average(values, weights=weights)
print(f"Взвешенное среднее оценок: {weighted_mean}")  # 85.7

# Пример 2: Более жизненный — MSE для кривых данных
y_true = np.array([1, 1, 0, 0, 0, 0, 0])  # Класс "1" — всего 2 штуки, класс "0" — 5 штук
predicted = np.array([0.9, 0.8, 0.3, 0.2, 0.1, 0.4, 0.2])
class_weights = np.array([2.5, 0.4])  # Вес для класса 0 и класса 1 (смотри, для миноритарного класса 1 вес меньше!)
# Делаем массив весов для каждого образца отдельно
sample_weights = np.where(y_true == 1, class_weights[1], class_weights[0])

# Считаем взвешенную MSE
weighted_mse = np.average((y_true - predicted) ** 2, weights=sample_weights)
print(f"Взвешенная MSE: {weighted_mse:.4f}")

# Для сравнения — обычная MSE, которая всем похуй
regular_mse = np.mean((y_true - predicted) ** 2)
print(f"Обычная MSE: {regular_mse:.4f}")

Короче, суть в чём: Взвешенное среднее — это твой инструмент, чтобы сказать данным: «Ты, сука, важный, я на тебя смотрю», а другим: «А вы идите нахуй, вы не так значимы». Без этого в реальных данных, где всегда всё перекошено, делать нихуя.