Привет, Хабр!

Сегодня мы хотим рассказать о методе Variance weighted estimator (VWE), который помогает снизить дисперсию

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

Для борьбы с высокой дисперсией традиционно используют несколько подходов. Один из них — это увеличение объема выборки. Чем больше данных, тем точнее оценка, но в жизни не всегда возможно собрать большое количество данных из-за ограничений времени и ресурсов.

Другой путь — применение методов сглаживания, таких как метод наименьших квадратов или его вариации. Эти методы помогают уменьшить влияние отдельных выбросов, но не всегда справляются с систематическими ошибками.

Есть также методы, использующие регуляризацию, например, Ridge и Lasso регрессии, которые добавляют штраф за сложность модели и таким образом снижают дисперсию. Однако такие методы могут вносить свои собственные ограничения, влияя на интерпретацию модели и требуя точной настройки параметров.

Все эти подходы имеют свои ограничения. Увеличение объема выборки — дорогостоящее и трудоемкое решение. Методы сглаживания и регуляризации могут не справляться с неоднородностью данных и требуют тщательной настройки.

VWE учитывает неоднородность данных, обрабатывая выбросы и систематические ошибки. Рассмотрим этот метод в этой статье.

VWE

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

Принцип работы метода VWE можно описать следующим образом:

Каждому наблюдению присваивается вес, обратный его дисперсии. Формула веса wi для i-го наблюдения:

 w_i = \frac{1}{\sigma_i^2}

где σ2/i​ — дисперсия i-го наблюдения.

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

\lambda_i = \frac{w_i}{\sum_j w_j}


где λi — нормализованный вес i-го наблюдения.

Итоговая оценка вычисляется как взвешенное среднее значений, где весами выступают нормализованные веса:

\bar{X}_{VWE} = \sum_i \lambda_i x_i


где xi​ — значение i-го наблюдения.

Основная формула для оценки с использованием VWE:

  \bar{X}{VWE} = \frac{\sum_i \frac{x_i}{\sigma_i^2}}{\sum_i \frac{1}{\sigma_i^2}}

XVWE - это взвешенное по дисперсии ср. значение. Такая формула позволяет минимизировать общую дисперсию итоговой оценки, используя информацию о точности каждого отдельного наблюдения.

Снижение дисперсии достигается за счет взвешивания наблюдений с меньшей дисперсией более сильно, чем наблюдений с большей дисперсией.

Рассмотрим пример использования VWE в A/B тесте. Допустим есть два набора данных — A и B, каждый из которых содержит результаты эксперимента. Дисперсия результатов в наборе A значительно ниже, чем в наборе B.

Используя метод простого среднего, можно получить общую оценку, которая не будет учитывать различия в точности наборов данных. Однако, с VWE, мы придадим больший вес результатам из набора A, что приведет к снижению общей дисперсии оценки.

Пример расчета:

  • Набор данных A: Xa= [1, 2, 2, 3, 3] с дисперсией σA2=0.5

  • Набор данных B: Xb= [1, 4, 5, 6, 7] с дисперсией σB2=2

Веса для каждого набора:

  • wA​=0.51​=2

  • w_B = \frac{1}{2} = 0.5

Нормализованные веса:

  • \lambda_A = \frac{2}{2 + 0.5} = \frac{2}{2.5} = 0.8

  • \lambda_B = \frac{0.5}{2 + 0.5} = \frac{0.5}{2.5} = 0.2

Итоговое взвешенное среднее:
 \bar{X}_{VWE} = 0.8 \cdot \bar{x}_A + 0.2 \cdot \bar{x}_B = 0.8 \cdot 2.2 + 0.2 \cdot 4.6 = 2.64

Таким образом, взвешенное среднее значительно точнее и имеет меньшую дисперсию по сравнению с простым средним, учитывающим все данные равноправно.

Примеры в python

Ипользуем метод VWE для анализа результатов A/B тестирования. Данные включают результаты двух групп тестирования с различной дисперсией:

import numpy as np

# данные для группы A и B
group_A_results = np.array([1, 2, 2, 3, 3])
group_B_results = np.array([1, 4, 5, 6, 7])

# дисперсии для групп
variance_A = 0.5
variance_B = 2.0

# вычисляем веса
weights_A = 1 / variance_A
weights_B = 1 / variance_B

# нормализуем веса
total_weight = weights_A + weights_B
lambda_A = weights_A / total_weight
lambda_B = weights_B / total_weight

# вычисляем взвешенное среднее
mean_A = np.mean(group_A_results)
mean_B = np.mean(group_B_results)

vwe_result = lambda_A * mean_A + lambda_B * mean_B

print(f"VWE результат для A/B тестирования: {vwe_result}")
VWE результат для A/B тестирования: 2.68

Применим VWE для улучшения точности прогнозирования модели ML, объединяя предсказания нескольких моделей с разной точностью:

from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np

# обучающие данные
X_train, y_train = ...  #  данные

# обучение моделей
model1 = RandomForestRegressor()
model2 = LinearRegression()

model1.fit(X_train, y_train)
model2.fit(X_train, y_train)

# прогнозы моделей
pred1 = model1.predict(X_train)
pred2 = model2.predict(X_train)

# вычисление дисперсий ошибок
variance1 = mean_squared_error(y_train, pred1)
variance2 = mean_squared_error(y_train, pred2)

# вычисляем веса
weights1 = 1 / variance1
weights2 = 1 / variance2

# гормализуем веса
total_weight = weights1 + weights2
lambda1 = weights1 / total_weight
lambda2 = weights2 / total_weight

# итоговый взвешенный прогноз
final_prediction = lambda1 * pred1 + lambda2 * pred2

Применим VWE для агрегирования прогнозов цен акций, используя данные с различной дисперсией:

import numpy as np
import pandas as pd

# данные для двух различных источников прогнозов
source1_predictions = np.array([100, 102, 101, 103, 104])
source2_predictions = np.array([99, 101, 100, 102, 103])

# дисперсии для источников
variance_source1 = 1.0
variance_source2 = 4.0

# вычисляем веса
weights_source1 = 1 / variance_source1
weights_source2 = 1 / variance_source2

# нормализуем веса
total_weight = weights_source1 + weights_source2
lambda_source1 = weights_source1 / total_weight
lambda_source2 = weights_source2 / total_weight

# итоговый взвешенный прогноз
final_prediction = lambda_source1 * source1_predictions + lambda_source2 * source2_predictions

print(f"Итоговый взвешенный прогноз цен акций: {final_prediction}")
Итоговый взвешенный прогноз цен акций: [ 99.8 101.8 100.8 102.8 103.8]

Конечно, есть некоторые проблемы...

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

VWE может быть чувствителен к выбросам, особенно если они имеют низкую дисперсию и, следовательно, большой вес.

Весовые коэффициенты в VWE рассчитываются на основе дисперсии, и ошибки в оценке дисперсии могут привести к неправильным весам.

Тем не менее, VWE - очень полезный инструмент в умелых руках и полезен в ситуациях, когда данные неоднородны и имеют различные уровни точности.

Для успешного применения VWE важно тщательно подбирать и проверять исходные данные, учитывать возможные корреляции и выбросы, а также использовать корректные методы оценки дисперсии.


Статья подготовлена в преддверии старта курса Machine Learning. Advanced

Комментарии (0)