
머신러닝의 기초이자 핵심인 선형 회귀(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-learn 및 NumPy를 활용하여 실무에서 가중치를 추출하고, 시각화하며, 규제하는 구체적인 방법들을 담고 있습니다.
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)과 함께 가중치를 검토하는 습관이 필요합니다.
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 과적합(Overfitting)을 완벽하게 확인하고 해결하는 7가지 실무 전략 (0) | 2026.04.08 |
|---|---|
| [PYTHON] 결정 트리(Decision Tree) 과적합 이유 3가지와 해결 방법 7가지 완벽 가이드 (0) | 2026.04.08 |
| [PYTHON] 랜덤 포레스트가 단일 트리보다 성능이 좋은 3가지 이유와 해결 방법 (0) | 2026.04.08 |
| [PYTHON] K-평균(K-Means) 최적의 K값을 정하는 5가지 방법과 성능 해결 전략 (0) | 2026.04.08 |
| [PYTHON] SVM 커널 트릭의 3가지 핵심 원리와 비선형 데이터 해결 방법 (0) | 2026.04.08 |