본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 선형 회귀 모델 가중치(Weight)의 3가지 핵심 의미와 최적화 해결 방법

by Papa Martino V 2026. 4. 8.
728x90

가중치(Weight)와 편향(Bias)
가중치 (Weight)와 편향 (Bias)

머신러닝의 기초이자 핵심인 선형 회귀(Linear Regression)에서 '가중치(Weight)'는 단순히 숫자가 아닙니다. 이는 데이터 속에 숨겨진 변수 간의 관계를 수치화한 지표이며, 모델의 예측력을 결정짓는 가장 중요한 요소입니다. 본 포스팅에서는 가중치의 수학적, 통계적 의미를 분석하고 파이썬 실무 예제를 통해 이를 어떻게 해석하고 최적화하는지 상세히 다룹니다.


1. 선형 회귀에서 가중치(Weight)와 편향(Bias)의 차이

수학적으로 선형 회귀 식은 $y = WX + b$로 표현됩니다. 여기서 $W$가 바로 가중치입니다. 가중치는 입력 특성(Feature)이 출력 결과(Target)에 미치는 영향력의 크기를 나타내며, 편향(Bias)은 데이터가 원점을 지나지 않을 때 이를 보정해주는 역할을 합니다.

항목 가중치 (Weight, $W$) 편향 (Bias, $b$)
기하학적 의미 회귀 직선의 '기울기' 회귀 직선의 'y절편'
역할 입력 변수의 중요도 조절 기본적인 예측값 수준 결정
변화에 따른 결과 결과값의 민감도(Slope) 변화 결과값의 전체적인 상하 이동
최적화 대상 경사 하강법을 통해 업데이트됨 가중치와 함께 동시에 최적화됨

2. 가중치가 갖는 3가지 실무적 의미

첫째, 변수의 중요도(Feature Importance)

가중치의 절대값이 클수록 해당 독립 변수는 종속 변수 예측에 큰 영향을 미칩니다. 단, 이는 모든 변수가 동일한 스케일(Scale)로 정규화되었을 때만 유효한 해석입니다.

둘째, 상관관계의 방향성

가중치가 양수(+)이면 양의 상관관계(비례), 음수(-)이면 음의 상관관계(반비례)를 의미합니다. 예를 들어 '공부 시간' 변수의 가중치가 5.2라면, 1시간 공부할 때마다 점수가 평균 5.2점 상승한다는 인과 관계를 추론할 수 있습니다.

셋째, 손실 함수의 기울기

학습 과정에서 가중치는 손실 함수(Loss Function)를 최소화하는 방향으로 이동합니다. 가중치의 미분값은 곧 모델이 나아가야 할 방향을 제시하는 나침반과 같습니다.


3. 실무자를 위한 파이썬 가중치 제어 및 활용 Example 7가지

아래 예제들은 scikit-learnNumPy를 활용하여 실무에서 가중치를 추출하고, 시각화하며, 규제하는 구체적인 방법들을 담고 있습니다.

Example 01. Scikit-learn을 이용한 기본 가중치($W$) 및 절편($b$) 추출

from sklearn.linear_model import LinearRegression
import numpy as np

# 데이터 구성 (공부 시간 대비 성적)
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([12, 24, 35, 48, 59])

model = LinearRegression()
model.fit(X, y)

# 가중치와 편향 확인
weight = model.coef_[0]
bias = model.intercept_

print(f"회귀 계수(Weight): {weight:.2f}")
print(f"절편(Bias): {bias:.2f}")
# 출력: 가중치 11.80, 절편 0.20

Example 02. 다중 선형 회귀에서 특성별 가중치 비교

from sklearn.datasets import load_diabetes
import pandas as pd

# 당뇨병 데이터셋 로드
diabetes = load_diabetes()
df_X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
y = diabetes.target

model = LinearRegression()
model.fit(df_X, y)

# 각 피처별 가중치 매핑
weights = pd.Series(model.coef_, index=df_X.columns)
print("각 변수의 가중치:")
print(weights.sort_values(ascending=False))

Example 03. 가중치 시각화를 통한 변수 중요도 파악

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
weights.sort_values().plot(kind='barh', color='skyblue')
plt.title('Weight Importance by Feature')
plt.xlabel('Weight Value')
plt.ylabel('Features')
plt.grid(axis='x', linestyle='--')
plt.show()

Example 04. L1 규제(Lasso)를 이용한 불필요한 가중치 0 만들기

from sklearn.linear_model import Lasso

# Lasso 모델은 영향력이 적은 가중치를 완전히 0으로 만들어 변수를 선택함
lasso = Lasso(alpha=0.1)
lasso.fit(df_X, y)

lasso_weights = pd.Series(lasso.coef_, index=df_X.columns)
print("Lasso를 통한 희소 가중치 확인:")
print(lasso_weights[lasso_weights == 0])

Example 05. 스케일링(Standardization) 후 가중치 재해석

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(df_X)

model_scaled = LinearRegression()
model_scaled.fit(X_scaled, y)

scaled_weights = pd.Series(model_scaled.coef_, index=df_X.columns)
print("표준화 후 가중치 (상대적 중요도 비교 가능):")
print(scaled_weights.sort_values(ascending=False))

Example 06. 경사 하강법(Gradient Descent) 가중치 업데이트 수동 구현

W = 0.0
b = 0.0
learning_rate = 0.01

# 가중치 업데이트 공식 (단순화)
for epoch in range(100):
    prediction = W * X.flatten() + b
    error = prediction - y
    
    # Gradient 계산
    W_grad = (2/len(X)) * np.dot(error, X.flatten())
    b_grad = (2/len(X)) * np.sum(error)
    
    # 가중치 갱신
    W = W - learning_rate * W_grad
    b = b - learning_rate * b_grad

print(f"수동 최적화 가중치: {W:.2f}")

Example 07. 다중 공선성(Multicollinearity) 해결을 통한 가중치 안정화

from statsmodels.stats.outliers_influence import variance_inflation_factor

# VIF(분산 팽창 지수) 확인하여 가중치 왜곡 방지
vif_data = pd.DataFrame()
vif_data["feature"] = df_X.columns
vif_data["VIF"] = [variance_inflation_factor(df_X.values, i) for i in range(len(df_X.columns))]

print("VIF 지수 (10 이상이면 가중치 왜곡 위험):")
print(vif_data)

4. 총평: 가중치 해석 시 주의사항

선형 회귀에서 가중치는 매우 직관적이지만 위험성도 내포하고 있습니다. 첫째, 변수 간 상관관계가 높은 다중 공선성 문제가 있을 경우 가중치 값이 비정상적으로 커지거나 부호가 바뀔 수 있습니다. 둘째, 데이터에 이상치(Outlier)가 많으면 가중치가 크게 왜곡되어 일반화 성능이 떨어집니다. 따라서 항상 잔차 분석(Residual Analysis)과 함께 가중치를 검토하는 습관이 필요합니다.

내용 출처 및 참고 자료:

  • Scikit-learn (v1.4) User Guide: Linear Models
  • Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow (Aurélien Géron)
  • Python Data Science Handbook (Jake VanderPlas)
  • 통계학의 이해 (회귀 분석 파트)
728x90