Оценки: среднее, дисперсия и смещённость
Оценка — это формула, по которой мы угадываем параметр совокупности из выборки; хорошая оценка в среднем не врёт.
Оценка (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.