← Назад к вопросам
Что такое метрика Weighted Mean?
2.0 Middle🔥 132 комментариев
#Метрики и оценка моделей#Статистика и A/B тестирование
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Weighted Mean (взвешенное среднее): использование в ML
Weighted Mean — это обобщение обычного среднего арифметического, где каждому элементу присваивается вес. Это мощный инструмент в Data Science для различных задач.
Определение
Взвешенное среднее:
Weighted Mean = Σ(x_i * w_i) / Σ(w_i)
Где:
x_i — i-е значение
w_i — вес для i-го значения
Обычное среднее это частный случай когда все w_i = 1:
Mean = (1*x_1 + 1*x_2 + 1*x_3) / (1 + 1 + 1) = (x_1 + x_2 + x_3) / 3
Практические примеры
Пример 1: Средняя оценка студента
import numpy as np
# Оценки и их веса (важность)
grades = np.array([85, 90, 78, 92]) # История, Математика, Физика, Английский
weights = np.array([2, 3, 2, 1]) # Математика важнее всего (3), Английский меньше (1)
# Обычное среднее (все одинаково важны)
simple_mean = grades.mean()
print(f'Простое среднее: {simple_mean:.2f}')
# Output: 86.25 (все веса = 1)
# Взвешенное среднее
weighted_mean = np.average(grades, weights=weights)
print(f'Взвешенное среднее: {weighted_mean:.2f}')
# Output: 87.33 (математика и история имеют больший вес)
# Вручную
weighted_sum = 85*2 + 90*3 + 78*2 + 92*1
total_weight = 2 + 3 + 2 + 1
weighted_mean_manual = weighted_sum / total_weight
print(f'Взвешенное среднее (вручную): {weighted_mean_manual:.2f}')
# Output: 87.33
# Разница видна:
print(f'Разница: {weighted_mean - simple_mean:.2f}') # 1.08
# Математика (90) имеет вес 3, поэтому среднее смещено вверх
Пример 2: Portfolio средний return
# Инвестиционный портфель
stocks = ['AAPL', 'GOOGL', 'MSFT', 'TSLA']
returns = np.array([0.15, 0.22, 0.18, 0.35]) # Годовые возвраты
investment = np.array([10000, 5000, 8000, 2000]) # Инвестированная сумма
# Среднее return без весов (плохо)
simple_return = returns.mean()
print(f'Простое среднее return: {simple_return:.2%}')
# Output: 22.50%
# Взвешенное среднее return (правильно)
weighted_return = np.average(returns, weights=investment)
print(f'Взвешенное среднее return: {weighted_return:.2%}')
# Output: 20.07%
# Разница: AAPL имеет наибольший вес (10000), а его return (15%) ниже
# Поэтому взвешенное среднее ниже простого
Пример 3: Взвешенная точность в классификации
from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
# Несбалансированный датасет
X, y = make_classification(
n_samples=1000,
n_features=10,
weights=[0.9, 0.1], # 90% класс 0, 10% класс 1
random_state=42
)
model = RandomForestClassifier()
model.fit(X, y)
y_pred = model.predict(X)
# Метрики БЕЗ весов (macro)
precision_macro = precision_score(y, y_pred, average='macro')
recall_macro = recall_score(y, y_pred, average='macro')
f1_macro = f1_score(y, y_pred, average='macro')
print('Метрики Macro (без весов):')
print(f' Precision: {precision_macro:.4f}')
print(f' Recall: {recall_macro:.4f}')
print(f' F1: {f1_macro:.4f}')
# Метрики С ВЕСАМИ (weighted)
precision_weighted = precision_score(y, y_pred, average='weighted')
recall_weighted = recall_score(y, y_pred, average='weighted')
f1_weighted = f1_score(y, y_pred, average='weighted')
print('\nМетрики Weighted (с весами):')
print(f' Precision: {precision_weighted:.4f}')
print(f' Recall: {recall_weighted:.4f}')
print(f' F1: {f1_weighted:.4f}')
# Разница: Macro среднее одинаково для обоих классов
# Weighted усредняет с учётом количества примеров каждого класса
# Поэтому weighted F1 выше (класс 0 имеет больше примеров)
Weighted Mean в Machine Learning
1. Взвешенная точность (Weighted Accuracy)
# Классификация с несбалансированными классами
from sklearn.metrics import accuracy_score
y_true = np.array([0, 0, 0, 0, 0, 1, 1]) # 5 класс 0, 2 класс 1
y_pred = np.array([0, 0, 0, 1, 0, 1, 0]) # Одна ошибка на каждом классе
# Обычная точность
acc = accuracy_score(y_true, y_pred)
print(f'Обычная точность: {acc:.4f}') # 5/7 = 0.7143
# Взвешенная точность (вес = количество примеров класса)
weights = np.bincount(y_true)
print(f'Веса классов: {weights}') # [5, 2]
# Для каждого класса считаем accuracy
acc_class_0 = np.sum((y_true[y_true==0] == y_pred[y_true==0])) / weights[0]
acc_class_1 = np.sum((y_true[y_true==1] == y_pred[y_true==1])) / weights[1]
weighted_acc = (acc_class_0 * weights[0] + acc_class_1 * weights[1]) / sum(weights)
print(f'Взвешенная точность: {weighted_acc:.4f}') # Обычно то же самое
2. Взвешенная средняя квадратичная ошибка (WMSE)
# Когда одни примеры важнее других
y_true = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y_pred = np.array([1.1, 1.9, 3.2, 3.8, 5.5])
importance = np.array([1, 1, 10, 1, 1]) # Пример 3 очень важен!
# Обычное MSE (все примеры одинаково важны)
mse = np.mean((y_true - y_pred) ** 2)
print(f'Обычное MSE: {mse:.4f}')
# Взвешенное MSE
weighted_mse = np.average((y_true - y_pred) ** 2, weights=importance)
print(f'Взвешенное MSE: {weighted_mse:.4f}')
# Разница видна! Ошибка на примере 3 (0.04) увеличивается в вес 10
# Поэтому weighted MSE выше
3. Weighted Average Precision (WAP) в ранжировании
# Рекомендательная система с разными типами товаров
relevance = np.array([1, 1, 0, 1, 0, 1]) # Релевантность товаров
weights = np.array([10, 5, 1, 20, 1, 15]) # Веса товаров (видимость, прибыль)
# Обычная Average Precision
ap = np.sum(relevance) / len(relevance)
print(f'Обычная Average Precision: {ap:.4f}') # 4/6 = 0.6667
# Weighted Average Precision
wap = np.sum(relevance * weights) / np.sum(weights)
print(f'Weighted Average Precision: {wap:.4f}')
# WAP выше потому что релевантные товары имеют больший вес
4. Взвешенное расстояние в кластеризации
import numpy as np
from scipy.spatial.distance import cdist
# Пример: расстояние между двумя точками с разной важностью размеров
point1 = np.array([0, 0, 0])
point2 = np.array([1, 1, 1])
# Размеры: рост, вес, возраст
weights = np.array([1, 10, 1]) # Вес важнее
# Обычное евклидово расстояние
euclidean = np.sqrt(np.sum((point1 - point2) ** 2))
print(f'Обычное расстояние: {euclidean:.4f}') # sqrt(3) = 1.732
# Взвешенное расстояние
weighted_dist = np.sqrt(np.sum(weights * (point1 - point2) ** 2))
print(f'Взвешенное расстояние: {weighted_dist:.4f}') # sqrt(12) = 3.464
# Взвешенное расстояние больше потому что различие в весе (второй компонент) больше
Weighted Mean в Pandas
import pandas as pd
# DataFrame с данными
df = pd.DataFrame({
'Product': ['A', 'B', 'C', 'D'],
'Price': [100, 150, 200, 250],
'Quantity': [10, 20, 15, 5]
})
print(df)
# Product Price Quantity
# 0 A 100 10
# 1 B 150 20
# 2 C 200 15
# 3 D 250 5
# Простое среднее цены
avg_price = df['Price'].mean()
print(f'Простое среднее цены: {avg_price:.2f}') # 175.00
# Взвешенное среднее цены (вес = количество)
weighted_avg_price = (df['Price'] * df['Quantity']).sum() / df['Quantity'].sum()
print(f'Взвешенное среднее цены: {weighted_avg_price:.2f}') # 156.67
# Или через np.average
weighted_avg_price_2 = np.average(df['Price'], weights=df['Quantity'])
print(f'Взвешенное среднее (np.average): {weighted_avg_price_2:.2f}') # 156.67
# Разница: товар B имеет меньшую цену (150) но больше количество (20)
# Поэтому взвешенное среднее ниже простого
Weighted Mean в Time Series
# Временные ряды с экспоненциальным взвешиванием
import pandas as pd
data = pd.Series([100, 105, 95, 110, 115])
# Простое скользящее среднее
simple_ma = data.rolling(window=3).mean()
print('Простое скользящее среднее:')
print(simple_ma)
# Экспоненциально взвешенное среднее (недавние значения важнее)
expanded_ma = data.ewm(span=3, adjust=False).mean()
print('\nЭкспоненциально взвешенное среднее:')
print(expanded_ma)
# EMA даёт больший вес последним значениям
# Полезно для трендов в финансовых данных
Когда использовать Weighted Mean
# ✓ ИСПОЛЬЗУЙ Weighted Mean когда:
# 1. Несбалансированные классы
from sklearn.metrics import f1_score
f1_weighted = f1_score(y_true, y_pred, average='weighted')
# 2. Разная важность примеров
model.fit(X, y, sample_weight=sample_weights)
# 3. Временной ряд (экспоненциальное взвешивание)
df['EMA'] = df['price'].ewm(span=20).mean()
# 4. Портфели и комбинации
portfolio_return = np.average(returns, weights=allocations)
# 5. Оценка качества с несбалансированными данными
from sklearn.metrics import precision_recall_fscore_support
p, r, f, s = precision_recall_fscore_support(y_true, y_pred, average='weighted')
# ✗ НЕ используй Weighted Mean когда:
# - Все примеры одинаково важны
# - Классы сбалансированы
# - Нет причины для весов
Практический пример: ML Pipeline
from sklearn.model_selection import cross_validate
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
# Несбалансированный датасет
X, y = make_classification(
n_samples=1000,
weights=[0.8, 0.2], # 80% vs 20%
random_state=42
)
model = RandomForestClassifier()
# Валидация с weighted метриками
scores = cross_validate(
model, X, y,
scoring=['precision_weighted', 'recall_weighted', 'f1_weighted'],
cv=5
)
print(f'Weighted F1: {scores["test_f1_weighted"].mean():.4f}')
print(f'Weighted Precision: {scores["test_precision_weighted"].mean():.4f}')
print(f'Weighted Recall: {scores["test_recall_weighted"].mean():.4f}')
# Weighted метрики учитывают дисбаланс классов
Заключение
Weighted Mean — это:
- Обобщение обычного среднего с весами
- Формула: Σ(x_i * w_i) / Σ(w_i)
- Essential для несбалансированных данных
- Используется в классификации, регрессии, ранжировании
- В ML часто используется как метрика качества
Ключевые применения:
- Несбалансированные классы → weighted F1-score
- Разная важность примеров → sample_weight
- Временные ряды → EMA (exponentially weighted moving average)
- Портфели → weighted average returns
- Разные эксперименты → weighted average results
Правило: когда веса разные → используй weighted mean!