← Назад к вопросам
Что означает вес признака в линейной регрессии?
1.8 Middle🔥 142 комментариев
#Машинное обучение
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Вес признака в линейной регрессии: интерпретация и практика
Математическое определение
В линейной регрессии модель выглядит так:
y = w0 + w1*x1 + w2*x2 + ... + wn*xn
Где:
- y: предсказываемое значение (target)
- x1, x2, ..., xn: признаки (features)
- w1, w2, ..., wn: веса признаков (coefficients)
- w0: свободный член (intercept)
Физическая интерпретация веса
Вес признака w_i показывает: "На сколько единиц изменится y, если x_i увеличится на 1 единицу, при прочих равных"
Пример:
from sklearn.linear_model import LinearRegression
import numpy as np
# Датасет: зарплата = f(опыт, образование)
X = np.array([
[1, 10], # опыт=1 год, образование=10 лет
[5, 16], # опыт=5 лет, образование=16 лет
[10, 18]
])
y = np.array([30000, 60000, 90000]) # зарплата в тысячах
model = LinearRegression()
model.fit(X, y)
print(f"w0 (intercept): {model.intercept_}")
print(f"w1 (опыт): {model.coef_[0]}")
print(f"w2 (образование): {model.coef_[1]}")
# Пример вывода:
# w0: 10000
# w1: 4000 -> каждый год опыта добавляет 4000 к зарплате
# w2: 1500 -> каждый год образования добавляет 1500 к зарплате
Знак веса
Положительный вес (w > 0):
- x растет → y растет
- Прямая корреляция
Отрицательный вес (w < 0):
- x растет → y падает
- Обратная корреляция
Пример:
y = -100*age + 50000
Вес age = -100
-> каждый год возраста снижает значение на 100
-> возраст 20 лет: y = 50000 - 2000 = 48000
-> возраст 30 лет: y = 50000 - 3000 = 47000
Величина веса и масштабирование
Важно: величина веса зависит от масштаба признака!
# Без масштабирования
X = np.array([[1], [2], [3], [4]]) # Диапазон 1-4
y = np.array([10, 20, 30, 40])
model = LinearRegression().fit(X, y)
print(f"Вес: {model.coef_[0]}") # Около 10
# С другим масштабом
X = np.array([[100], [200], [300], [400]]) # Диапазон 100-400
y = np.array([10, 20, 30, 40])
model = LinearRegression().fit(X, y)
print(f"Вес: {model.coef_[0]}") # Около 0.1 (не 10!)
# Они описывают одно и то же, но веса разные!
Стандартизация для сравнения
Чтобы сравнивать важность признаков, нужно их стандартизировать:
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
model = LinearRegression()
model.fit(X_scaled, y)
# Теперь веса сравнимы!
# Больший |вес| = более важный признак
feature_importance = np.abs(model.coef_)
print(feature_importance) # Какой признак важнее?
Колинеарность и нестабильность весов
Проблема: если признаки коррелированы, веса становятся нестабильными:
# x1 и x2 очень коррелированы
X = np.array([
[1, 1.01],
[2, 2.01],
[3, 3.01],
[4, 4.01]
])
y = np.array([10, 20, 30, 40])
model = LinearRegression().fit(X, y)
print(f"w1: {model.coef_[0]}")
print(f"w2: {model.coef_[1]}")
# Выведет что-то вроде:
# w1: 15
# w2: -5
# Оба больших! Но один положительный, один отрицательный
# Это нестабильно и неинтерпретируемо
# Решение: regularization (Ridge или Lasso)
from sklearn.linear_model import Ridge
model_ridge = Ridge(alpha=1.0).fit(X, y)
print(f"Ridge w1: {model_ridge.coef_[0]}")
print(f"Ridge w2: {model_ridge.coef_[1]}")
# Теперь веса стабильнее и логичнее
Практическое использование весов
1. Интерпретация модели
model = LinearRegression().fit(X_scaled, y)
for i, weight in enumerate(model.coef_):
direction = "положительно" if weight > 0 else "отрицательно"
print(f"Признак {i}: {direction} влияет на результат (вес={weight:.3f})")
2. Feature selection: убери маленькие веса
threshold = 0.01
important_features = np.abs(model.coef_) > threshold
X_selected = X[:, important_features]
# Переобучи модель только на важных признаках
3. Регуляризация для уменьшения переобучения
# L1 (Lasso) может обнулить малые веса
from sklearn.linear_model import Lasso
model_lasso = Lasso(alpha=0.1).fit(X_scaled, y)
print(f"Веса после Lasso: {model_lasso.coef_}")
# Много нулей = модель проще
# L2 (Ridge) уменьшает веса
model_ridge = Ridge(alpha=0.1).fit(X_scaled, y)
print(f"Веса после Ridge: {model_ridge.coef_}")
# Все маленькие веса = уменьшено переобучение
Важные выводы
- Вес = эффект признака: увеличение x на 1 изменяет y на w
- Зависит от масштаба: стандартизируй перед интерпретацией
- Может быть нестабильен: если признаки коррелированы, используй регуляризацию
- Не путай с важностью: большой вес != важный признак (может быть из-за масштаба)
- Для причинности: нужно учитывать контекст и теорию, не только веса
Это базовый, но мощный инструмент для понимания, как модель принимает решения.