Стандартизация
Чтобы градиентному спуску было легче работать с признаками разных масштабов, изменим их шкалу. Километры останутся километрами по смыслу, но вместо самого расстояния будем записывать, насколько оно отличается от среднего.
Стандартизация признака (z-score) — вычесть среднее и поделить на стандартное отклонение:
x′ = (x − μ) / s
Здесь x — исходное значение признака, x′ — значение после стандартизации, μ — среднее этого признака по обучающей выборке, s — его стандартное отклонение, мера разброса значений.
Среднее и стандартное отклонение считаем отдельно для каждого столбца признаков. В нашей программе стандартное отклонение вычисляется так:
s = sqrt(среднее((x − μ)²))
Посмотрим на отдельный пример. Пусть среднее расстояние равно 4 км, а стандартное отклонение — 2 км. Тогда:
2 км → (2 − 4) / 2 = −1
4 км → (4 − 4) / 2 = 0
6 км → (6 − 4) / 2 = 1
Ноль теперь означает «расстояние равно среднему», единица — «на одно стандартное отклонение больше среднего», а минус единица — «на одно стандартное отклонение меньше».
После такого преобразования у каждого непостоянного признака на обучающей выборке среднее равно 0, а стандартное отклонение равно 1. Масштабы становятся сопоставимыми, хотя связи между признаками никуда не исчезают.
Меняем только признаки. Фактическое время доставки оставляем в минутах. Значит, прогноз модели тоже по-прежнему выражается в минутах.
В разговорной речи это иногда называют нормализацией. Но нормализация — более широкое название для разных преобразований шкалы. Здесь мы используем именно стандартизацию: вычитание среднего и деление на стандартное отклонение.
Что получилось в нашем примере. Сравним два запуска по одному критерию: сколько шагов нужно, чтобы MSE стала меньше 1e-6, то есть одной миллионной. В обоих случаях начинаем с нулевых параметров.
| Признаки |
lr |
Шагов до MSE < 1e-6 |
| Исходные |
0.02 |
7138 |
| Стандартизированные |
0.3 |
50 |
После стандартизации удалось взять больший lr и достичь той же точности значительно быстрее. В программе ниже выполним 120 шагов с запасом. К этому моменту MSE будет примерно 1.6 · 10−16 — очень маленькой, но не равной точному нулю.
После пересчёта коэффициентов в исходные единицы они окажутся настолько близки к правильным значениям, что при печати четырёх знаков после точки различия будут незаметны.
Это результат для нашей учебной таблицы, а не обещание для любых данных. Стандартизация не делает возможный минимум MSE ниже: для нашей линейной модели со свободным членом она меняет способ записи той же задачи и помогает спуску быстрее приблизиться к решению.
Возврат коэффициентов к исходным единицам
После обучения на стандартизированных признаках модель считает прогноз так:
прогноз = w′₁ · x′₁
+ w′₂ · x′₂
+ w′₃ · x′₃
+ b′
Штрих здесь обозначает стандартизированную шкалу, а не производную.
Эти коэффициенты тоже можно прочитать. Вес w′₁ показывает, на сколько минут изменится прогноз, если расстояние увеличить на одно его стандартное отклонение, оставив остальные признаки неизменными.
Но обычно удобнее спросить: на сколько минут изменится прогноз при увеличении расстояния на один километр? Для этого перепишем модель в исходных единицах.
Сначала разберём один признак. Вернёмся к отдельному примеру со средним 4 км и стандартным отклонением 2 км. Допустим, после обучения получили:
x′ = (x − 4) / 2
прогноз = 6 · x′ + 10
Подставим выражение для x′ и раскроем скобки:
прогноз = 6 · (x − 4) / 2 + 10
= 3 · (x − 4) + 10
= 3 · x − 12 + 10
= 3 · x − 2
Получилась та же модель, только теперь она принимает исходное расстояние. Вес стал равен 3, а свободный член — −2. Обратите внимание: пересчитывать нужно не только вес, но и свободный член, потому что при стандартизации мы вычитали среднее.
Проверим на расстоянии 6 км:
Через стандартизированный признак:
x′ = (6 − 4) / 2 = 1
прогноз = 6 · 1 + 10 = 16
Через исходный признак:
прогноз = 3 · 6 − 2 = 16
Прогноз совпал. Повторно обучать модель для такого пересчёта не нужно.
Для нескольких признаков правило такое же:
w_j = w′_j / s_j
b = b′ − Σ (w′_j · μ_j / s_j)
Здесь j — номер признака; w′_j и b′ — параметры модели на стандартизированных признаках; w_j и b — параметры в исходных единицах. Числа μ_j и s_j — сохранённые среднее и стандартное отклонение этого признака.
Знак Σ означает сумму по всем признакам. В нашей модели их три, поэтому:
b = b′
− w′₁ · μ₁ / s₁
− w′₂ · μ₂ / s₂
− w′₃ · μ₃ / s₃
У свободного члена тоже меняется смысл. В стандартизированной шкале b′ — прогноз для объекта, у которого все признаки равны своим средним значениям: тогда все x′ равны нулю. Поэтому b′ нельзя напрямую называть временем сборки заказа.
И ещё: вес — это коэффициент изменения прогноза при фиксированных остальных признаках, а не универсальная мера важности. Стандартизация делает масштабы сопоставимыми, но сама по себе не превращает веса в рейтинг важности признаков.
Для новых прогнозов есть два равноправных способа. Можно стандартизировать новые признаки сохранёнными μ и s и использовать параметры со штрихами. А можно один раз пересчитать коэффициенты и дальше подставлять исходные признаки. Прогнозы будут одинаковыми с учётом погрешности вычислений.
Средние и стандартные отклонения для новых заказов заново не вычисляем: используем те, которые получили по обучающей выборке.
Программа целиком, со стандартизацией
Соберём всё вместе. Сначала вычислим средние и стандартные отклонения по трём столбцам признаков и подготовим стандартизированную таблицу. Затем запустим уже знакомый цикл: прогнозы, промахи, четыре компоненты градиента, обновление параметров.
Правило обучения остаётся прежним. Но теперь оно работает с признаками в другой шкале, поэтому используем lr = 0.3 и 120 шагов. В конце пересчитаем коэффициенты в исходные единицы, чтобы сравнить их с известными нам значениями 3, 1.5, −0.5 и 8.
В коде переменные w1, w2, w3 и b хранят параметры в стандартизированной шкале. После обратного пересчёта параметры в исходных единицах попадут в v1, v2, v3 и sborka.