Оценки: среднее, дисперсия и смещённость

Оценка — это формула, по которой мы угадываем параметр совокупности из выборки; хорошая оценка в среднем не врёт.

Оценка (estimator) — правило вычисления параметра совокупности по выборке. Оценка несмещённая, если её среднее по многим выборкам равно истинному параметру.

Выборочное среднее оценивает среднее совокупности

Самая частая оценка — выборочное среднее. Оно несмещённое: если усреднить оценки по множеству выборок, получим истинное среднее совокупности. С дисперсией всё интереснее — там кроется тонкость, из-за которой в формуле появляется загадочное n−1.

Два способа посчитать дисперсию

Дисперсию выборки можно посчитать, деля сумму квадратов отклонений либо на n, либо на n−1. Какая разница? Когда мы оцениваем дисперсию совокупности, используя выборочное среднее (а не истинное, которого не знаем), деление на n систематически занижает результат. Деление на n−1 (поправка Бесселя) это компенсирует и даёт несмещённую оценку.

import statistics

data = [4, 8, 6, 5, 3, 7]
m = statistics.mean(data)
n = len(data)

var_n   = sum((x - m) ** 2 for x in data) / n       # делим на n
var_n1  = sum((x - m) ** 2 for x in data) / (n - 1)  # делим на n-1

print("Среднее:", m)
print("Дисперсия / n   =", round(var_n, 4))
print("Дисперсия / n-1 =", round(var_n1, 4))
print("statistics.pvariance (на n)   =", round(statistics.pvariance(data), 4))
print("statistics.variance  (на n-1) =", round(statistics.variance(data), 4))

Вывод:

Среднее: 5.5
Дисперсия / n   = 2.9167
Дисперсия / n-1 = 3.5
statistics.pvariance (на n)   = 2.9167
statistics.variance  (на n-1) = 3.5

Модуль statistics прямо разделяет: pvariance (population, на n) и variance (sample, на n−1). Это не прихоть — у них разный смысл.

Доказываем смещённость экспериментом

Утверждение «деление на n занижает дисперсию» можно не принимать на веру, а проверить. Возьмём совокупность с известной дисперсией, многократно вытащим маленькие выборки и усредним обе оценки. Несмещённая (n−1) должна в среднем попасть в истину, смещённая (n) — оказаться ниже.

import random, statistics
random.seed(1)

# Совокупность с истинной дисперсией = 25 (сигма 5)
population = [random.gauss(50, 5) for _ in range(200000)]
true_var = statistics.pvariance(population)

est_n, est_n1 = [], []
for _ in range(5000):
    sample = random.sample(population, 5)   # маленькие выборки по 5
    m = statistics.mean(sample)
    est_n.append(sum((x - m) ** 2 for x in sample) / 5)
    est_n1.append(sum((x - m) ** 2 for x in sample) / 4)

print("Истинная дисперсия совокупности:", round(true_var, 2))
print("Средняя оценка / n   (смещённая) :", round(statistics.mean(est_n), 2))
print("Средняя оценка / n-1 (несмещённая):", round(statistics.mean(est_n1), 2))

Вывод:

Истинная дисперсия совокупности: 25.05
Средняя оценка / n   (смещённая) : 20.24
Средняя оценка / n-1 (несмещённая): 25.3

Оценка с делением на n в среднем дала ~20 вместо ~25 — заметно занизила. Оценка с n−1 попала почти точно. Вот зачем нужна поправка Бесселя: на малых выборках разница между n и n−1 огромна.

Почему это важно для ML

Понятие смещённости — ядро диагностики моделей. Смещённая (biased) модель систематически ошибается в одну сторону — недообучение. Разброс оценок при разных выборках — это дисперсия модели, связанная с переобучением. Компромисс смещение-дисперсия (bias-variance tradeoff), о котором постоянно говорят в ML, — это ровно те же два понятия, что мы здесь измерили на дисперсии.

Итог

  • Оценка — формула вычисления параметра совокупности по выборке.
  • Несмещённая оценка в среднем (по многим выборкам) равна истинному параметру.
  • Выборочная дисперсия делится на n−1 (поправка Бесселя), иначе занижается.
  • Смещение и дисперсия оценок — основа компромисса bias-variance в ML.
Проверьте себя
1. Что значит, что оценка несмещённая?
AОна всегда даёт точное значение на одной выборке
BЕё среднее по многим выборкам равно истинному параметру совокупности
CОна не зависит от данных
DОна всегда меньше истинного значения
2. Почему выборочную дисперсию делят на n−1, а не на n?
AТак быстрее считать
BДеление на n систематически занижает дисперсию; поправка n−1 (Бесселя) делает оценку несмещённой
Cn−1 всегда даёт меньшее число
DЭто требование Python
3. Как связаны смещённость и дисперсия оценок с обучением моделей?
AНикак не связаны
BЭто и есть компромисс bias-variance: смещение — недообучение, дисперсия — переобучение
CОни влияют только на скорость обучения
DОни относятся только к статистике, но не к ML
Поддержать проект