Ответ
Взвешенное среднее (Weighted Mean) — это обобщение среднего арифметического, где каждому элементу выборки присваивается вес, отражающий его важность или частоту. Элементы с большим весом вносят больший вклад в итоговое значение.
Формула:
weighted_mean = Σ (w_i * x_i) / Σ w_i
где x_i — значения, w_i — их веса.
Зачем это нужно в ML/Data Science:
- Обработка несбалансированных данных: При вычислении средней ошибки или метрики по классам можно дать больше веса редкому, но важному классу.
- Агрегация оценок моделей: Например, ensemble-модель, где итоговый прогноз — это взвешенное среднее прогнозов базовых моделей, а веса отражают их точность.
- Метрики качества:
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 — это вес, который ты на них накинул. Суммируешь все «циферку, умноженную на её вес», а потом делишь на сумму всех весов. Всё, делов-то.
А нахуя это в машинке или данных нужно?
- Данные кривые, несбалансированные. Представь, у тебя 999 собак и 1 котик в выборке. Если ты будешь считать обычное среднее по всем, то про котика нихуя не узнаешь, он потеряется. А так ты можешь котику вес, бля, овердохуища дать, чтобы его голос был слышен. Чистая политика, но работает.
- Ансамбли моделей. У тебя есть три алгоритма, один — гений, два — так, мудя. Так вот, ты можешь прогноз гения взять с большим весом, а этих двух полупидоров — с маленьким. Итоговый прогноз будет умнее.
- Метрики. Та же
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}")
Короче, суть в чём: Взвешенное среднее — это твой инструмент, чтобы сказать данным: «Ты, сука, важный, я на тебя смотрю», а другим: «А вы идите нахуй, вы не так значимы». Без этого в реальных данных, где всегда всё перекошено, делать нихуя.