На первый взгляд, добавление новых признаков в модель кажется очевидным способом повысить производительность. Если модель может учиться на большем объёме информации, она должна делать более точные прогнозы. Однако на практике такой подход часто приводит к скрытым структурным рискам.
Каждый дополнительный признак создаёт дополнительную зависимость от входных данных, внешних систем и проверок качества данных. Одно пропущенное поле, изменение схемы или задержка набора данных могут незаметно ухудшить прогнозы в производственной среде.
Проблема не в вычислительных затратах или сложности системы, а в нестабильности весов
В регрессионных моделях, особенно когда признаки коррелированы или слабо информативны, оптимизатору сложно корректно распределить веса. Коэффициенты могут непредсказуемо меняться, поскольку модель пытается распределить влияние между перекрывающимися признаками, а малоинформативные переменные могут казаться важными просто из-за шума в данных.
Со временем это приводит к тому, что модели выглядят сложными на бумаге, но ведут себя нестабильно при развёртывании.
В этой статье мы рассмотрим, почему добавление дополнительных признаков может сделать регрессионные модели менее надёжными, а не более точными. Мы изучим, как коррелированные признаки искажают оценки коэффициентов, как слабые сигналы принимаются за реальные закономерности и почему каждый дополнительный признак увеличивает хрупкость производства.
Для наглядности мы рассмотрим примеры, используя набор данных о ценах на недвижимость, и сравним поведение крупных моделей с более компактными и стабильными альтернативами.
Код для создания синтетического набора данных
Этот код создаёт синтетический набор данных, имитирующий сценарий ценообразования недвижимости, где только небольшое количество переменных действительно влияет на целевую переменную, в то время как многие другие вносят избыточность или шум.
«`python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import meansquarederror
from sklearn.modelselection import traintest_split
import warnings
warnings.filterwarnings(«ignore»)
plt.rcParams.update({
«figure.facecolor»: «#FAFAFA»,
«axes.facecolor»: «#FAFAFA»,
«axes.spines.top»: False,
«axes.spines.right»:False,
«axes.grid»: True,
«grid.color»: «#E5E5E5»,
«grid.linewidth»: 0.8,
«font.family»: «monospace»,
})
SEED = 42
np.random.seed(SEED)
N = 800 # training samples
── True signal features ────────────────────────────────────
sqft = np.random.normal(1800, 400, N) # strong signal
bedrooms = np.round(sqft / 550 + np.random.normal(0, 0.4, N)).clip(1, 6)
neighborhood = np.random.choice([0, 1, 2], N, p=[0.3, 0.5, 0.2]) # categorical
── Derived / correlated features (multicollinearity) ───────
total_rooms = bedrooms + np.random.normal(2, 0.3, N) # ≈ bedrooms
flooraream2 = sqft * 0.0929 + np.random.normal(0, 1, N) # ≈ sqft in m²
lot_sqft = sqft * 1.4 + np.random.normal(0, 50, N) # ≈ sqft scaled
── Weak / spurious features ────────────────────────────────
doorcolorcode = np.random.randint(0, 10, N).astype(float)
busstopage_yrs = np.random.normal(15, 5, N)
nearestmcdonaldsm = np.random.normal(800, 200, N)
── Pure noise features (simulate 90 random columns) ────────
noise_features = np.random.randn(N, 90)
noise_df = pd.DataFrame(
noise_features,
columns=[f»noise_{i:03d}» for i in range(90)]
)
── Target: house price ─────────────────────────────────────
price = (
120 * sqft
+ 8_000 * bedrooms
+ 30_000 * neighborhood
— 15 * busstopage_yrs # tiny real effect
+ np.random.normal(0, 15_000, N) # irreducible noise
)
── Assemble DataFrames ──────────────────────────────────────
signal_cols = [«sqft», «bedrooms», «neighborhood»,
«totalrooms», «flooraream2″, «lotsqft»,
«doorcolorcode», «busstopage_yrs»,
«nearestmcdonaldsm»]
df_base = pd.DataFrame({
«sqft»: sqft,
«bedrooms»: bedrooms,
«neighborhood»: neighborhood,
«totalrooms»: totalrooms,
«flooraream2″: flooraream2,
«lotsqft»: lotsqft,
«doorcolorcode»: doorcolorcode,
«busstopageyrs»: busstopageyrs,
«nearestmcdonaldsm»: nearestmcdonaldsm,
«price»: price,
})
dffull = pd.concat([dfbase.drop(«price», axis=1), noise_df,
df_base[[«price»]]], axis=1)
«`
Этот код создаёт синтетический набор данных, который имитирует сценарий ценообразования недвижимости. В наборе данных только несколько переменных действительно влияют на цену недвижимости, в то время как многие другие вносят избыточность или шум.
Весовая нестабильность при переобучении
Эксперимент имитирует то, что происходит в реальных производственных системах, где модели периодически переобучаются на новых данных. За 30 циклов переобучения код случайным образом выбирает подмножества набора данных и подгоняет две модели:
* Lean model (минимальная модель) использует только три основные сигнальные функции.
* Noisy model (шумная модель) использует полный набор признаков, содержащий коррелированные и случайные переменные.
Отследив коэффициенты ключевых признаков в каждом цикле переобучения, мы можем наблюдать, насколько стабильными остаются изученные веса с течением времени.
Результаты показывают, что шумная модель демонстрирует значительно более высокую вариативность коэффициентов. Например, стандартное отклонение коэффициента sqft увеличивается в 2,6 раза, а коэффициент bedrooms становится в 2,2 раза более нестабильным по сравнению с минимальной моделью.
Симуляция дрейфа признаков
Этот эксперимент иллюстрирует, как дрейф признаков может незаметно влиять на прогнозы модели в производственной среде. Код постепенно вводит дрейф в слабый признак (busstopage_yrs) и измеряет, насколько меняются прогнозы модели.
Поскольку минимальная модель не включает этот признак, её прогнозы остаются полностью стабильными, в то время как шумная модель становится всё более чувствительной по мере увеличения величины дрейфа.
Полученный график показывает, что ошибка прогноза неуклонно увеличивается по мере дрейфа признака, подчёркивая важную реальность производства: каждый дополнительный признак становится ещё одной потенциальной точкой отказа. Даже слабоинформативные переменные могут внести нестабильность, если их распределение данных изменится или изменятся исходные конвейеры.
1. Какие риски могут возникнуть при добавлении новых признаков в регрессионные модели?
При добавлении новых признаков в регрессионные модели может возникнуть риск нестабильности весов. Это происходит, когда признаки коррелированы или слабо информативны, и оптимизатору сложно корректно распределить веса. Коэффициенты могут непредсказуемо меняться, поскольку модель пытается распределить влияние между перекрывающимися признаками, а малоинформативные переменные могут казаться важными просто из-за шума в данных.
2. Почему добавление дополнительных признаков может сделать регрессионные модели менее надёжными?
Добавление дополнительных признаков может сделать регрессионные модели менее надёжными, потому что каждый дополнительный признак создаёт дополнительную зависимость от входных данных, внешних систем и проверок качества данных. Это может привести к нестабильности весов и непредсказуемым изменениям коэффициентов.
3. Какие методы используются для демонстрации нестабильности весов в статье?
В статье используется метод имитации переобучения моделей на новых данных. За 30 циклов переобучения код случайным образом выбирает подмножества набора данных и подгоняет две модели: Lean model (минимальная модель) и Noisy model (шумная модель). Отслеживая коэффициенты ключевых признаков в каждом цикле переобучения, можно наблюдать, насколько стабильными остаются изученные веса с течением времени.
4. Какие выводы можно сделать из эксперимента с дрейфом признаков?
Эксперимент с дрейфом признаков показывает, что даже слабоинформативные переменные могут внести нестабильность, если их распределение данных изменится или изменятся исходные конвейеры. Минимальная модель, не включающая слабоинформативный признак, демонстрирует стабильность прогнозов, в то время как шумная модель становится всё более чувствительной по мере увеличения величины дрейфа.
5. Какие практические рекомендации можно извлечь из статьи для улучшения надёжности регрессионных моделей?
Из статьи можно извлечь следующие практические рекомендации:
* избегать добавления избыточных, дублирующих и малоинформативных признаков в модель;
* использовать более компактные и стабильные альтернативы для регрессионных моделей;
* регулярно проверять и переобучать модели на новых данных, чтобы минимизировать риск нестабильности весов.