본문 바로가기
두두 IT/머신런닝(ML)

[ML-12] 선형모델_선형회귀

by DoDo's 2026. 5. 20.
반응형

1부. 선형 회귀 (Linear Regression) : 뼈대 잡기

📖 1. 이론: 선형 회귀란 무엇인가요?

동네 집값을 예측해 봅시다. AI는 아주 단순한 1차 방정식(직선)을 하나 만듭니다.

  • 집값(y) = (방 개수 x W1) + (지하철역 거리 x W2) + 기본요금(b)
  • 여기서 가중치(W)는 '이 조건이 집값에 얼마나 중요한가?'를 나타내는 점수고,
    편향(b)은 아무 조건이 없을 때 깔고 가는 '기본 집값'입니다.

💻 2. 코드와 실행 결과 완벽 해설

Python
 
import pandas as pd
from sklearn.model_selection import train_test_split

# [1] 데이터 불러오기와 문제/정답 나누기
df = pd.read_csv("data/boston_dataset.csv")
X = df.drop(columns='MEDV') # X (문제지): 집값(MEDV)만 뺀 나머지 모든 힌트들 (방 개수, 범죄율 등)
y = df['MEDV']              # y (정답지): 우리가 맞혀야 할 진짜 집값

# [2] 공부용(Train)과 시험용(Test)으로 데이터 쪼개기
# AI가 힌트를 그냥 외우지 못하게 80%는 공부용으로, 20%는 진짜 시험용으로 랜덤하게 쪼갭니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 실행값: X_train.shape 등을 찍어보면 (404, 13) 같은 숫자가 나옵니다. 
# "404개의 집 데이터(공부용)가 있고, 힌트는 13개다"라는 뜻입니다.
Python
 
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

# [3] 데이터 전처리 (스케일링)
# '방 개수'는 3개, '범죄율'은 0.01 등 단위가 다르면 AI가 헷갈립니다. 
# StandardScaler()는 이 힌트들의 단위를 공평하게(체급을 똑같이) 맞춰주는 마법의 도구입니다.
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) 
X_test_scaled = scaler.transform(X_test)

# [4] 모델 만들고 학습시키기
lr = LinearRegression()       # "직선으로 예측하는 AI야 나와라!"
lr.fit(X_train_scaled, y_train) # 80%의 문제와 정답을 주고 "열심히 규칙(W와 b)을 찾아봐!" 하고 시킵니다.
Python
 
# [5] AI가 찾아낸 규칙 확인하기
print(lr.coef_)      # 가중치(W)들을 보여줍니다. 양수(+)면 집값을 올리는 좋은 힌트, 음수(-)면 집값을 깎는 나쁜 힌트입니다.
print(lr.intercept_) # 편향(b). 즉, 이 동네 집값의 기본 베이스 금액입니다.
  • 파이프라인(Pipeline) 코드 설명: 위에서 했던 '전처리(스케일링)'와 '모델 학습' 두 단계를 매번 따로 쓰기 귀찮으니까, 한 캡슐 안에 묶어서 한 번에 실행되게 만든 자동화 도구입니다.

2부. 다항 회귀 (Polynomial Regression) : 융통성 기르기

📖 1. 이론: 왜 다항 회귀를 쓰나요?

방금 배운 선형 회귀는 직선밖에 못 그립니다. 하지만 현실의 데이터(예: 곡선 형태로 오르락내리락하는 집값)는 일직선으로 설명이 안 됩니다. 이렇게 AI가 융통성 없이 너무 멍청하게 예측하는 것을 과소적합(Underfitting)이라고 합니다.

그래서 원래 있던 힌트들($X$)을 제곱하고, 세제곱하고, 서로 곱해서 억지로 힌트를 수십 개로 뻥튀기해줍니다. 그러면 AI가 직선 대신 꼬불꼬불한 '곡선'을 그릴 수 있게 됩니다.

💻 2. 코드와 실행 결과 완벽 해설

(강사님이 func(X)로 U자 모양의 가짜 곡선 데이터를 만드는 부분은 실습용이니 넘어가셔도 됩니다. 핵심은 아래부터입니다.)

Python
 
from sklearn.preprocessing import PolynomialFeatures

# [1] 힌트 뻥튀기 기계 만들기 (degree=2는 제곱을 의미)
pnf = PolynomialFeatures(degree=2, include_bias=False)
X_poly = pnf.fit_transform(X)

# 실행값: print(X.shape, X_poly.shape)를 해보면 원래 힌트가 1개였는데 2개(x와 x제곱)로 늘어난 것을 볼 수 있습니다. 
# 보스턴 집값 데이터에 적용하면 13개였던 힌트가 100개 넘게 뻥튀기됩니다!
Python
 
# [2] 뻥튀기된 문제지로 다시 학습
lr2 = LinearRegression()
lr2.fit(X_poly, y)

🚨 주의: degree=25 코드의 의미

강사님이 굳이 degree=25 (25제곱) 코드를 보여주신 이유가 있습니다. 힌트를 25번이나 뻥튀기하면 힌트가 수천 개로 늘어납니다.

이렇게 되면 AI가 너무 예민해져서 시험지의 오타와 낙서까지 달달 외워버립니다(과대적합, Overfitting). 그래프 시각화 결과를 보면 직선이 아니라 점들을 다 맞추려고 미친 듯이 널뛰기하는 엉망진창 선이 그려집니다.


3부. 규제 (Regularization) : 폭주하는 AI 달래기

📖 1. 이론: 규제가 왜 필요한가요?

다항 회귀로 힌트를 너무 많이 늘려줬더니 AI가 과대적합(Overfitting)에 걸려 미쳐 날뜁니다. 쓸데없는 힌트에 너무 높은 점수(가중치)를 줘버린 탓이죠.

이제 선생님이 등장해 "너 가중치 너무 크게 잡으면 벌점(Penalty) 줄 거야!" 하고 혼을 냅니다. 이게 바로 규제입니다.

  • Ridge (릿지 / L2 규제): "다 같이 사이좋게 가중치를 조금씩 줄이자." (가중치를 0에 가깝게 작게 만듭니다. 가장 무난하고 기본적으로 씁니다.)
  • Lasso (라쏘 / L1 규제): "쓸모없는 힌트는 가차 없이 버린다." (영향력이 적은 힌트의 가중치를 아예 0으로 만들어버려 계산에서 지워버립니다.)
  • ElasticNet (엘라스틱넷): 릿지와 라쏘를 반반 섞은 짬짜면입니다.

💻 2. 코드와 실행 결과 완벽 해설

Python
 
from sklearn.linear_model import Ridge, Lasso
from sklearn.metrics import r2_score

# [1] 선생님의 회초리 강도(alpha) 리스트
alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]

# [2] 회초리 강도를 점점 세게 하면서 반복 학습해보기
for alpha in alpha_list:
    # 릿지(Ridge) 모델 생성. alpha가 커질수록 규제가 빡세집니다.
    model = Ridge(alpha=alpha, random_state=0) 
    model.fit(X_train_scaled, y_train) # 스케일링된 데이터로 학습
    
    # 평가 점수(r2_score) 확인. 점수는 1에 가까울수록 좋습니다.
    pred_test = model.predict(X_test_scaled)
    print(f"Alpha {alpha} - Test: {r2_score(y_test, pred_test)}")
  • 실행결과 (coef_df, bias_list): 코드를 실행해서 표(DataFrame)를 보면, alpha(회초리) 값이 0.001에서 100으로 커질수록, 가중치(Weight) 숫자들이 점점 작아져 0에 가까워지는 것을 눈으로 볼 수 있습니다.
  • Lasso 코드 실행결과: 라쏘 코드를 돌려보면 더 신기합니다. alpha가 커지면 수많은 가중치들이 정말로 0.000으로 바뀌어 버립니다. 쓸모없는 힌트는 아예 지워버린 것이죠.

📝 핵심 세 줄 요약

  1. 예측을 할 때는 기본 뼈대인 선형 회귀(LinearRegression)를 쓴다.
  2. 직선이라 너무 못 맞히면(과소적합) 다항 회귀(PolynomialFeatures)로 힌트를 뻥튀기해서 곡선을 긋게 해준다.
  3. 힌트가 너무 많아 꼼수만 달달 외운다면(과대적합), 릿지(Ridge)나 라쏘(Lasso)를 써서 가중치를 깎아내려 정상으로 되돌린다.
반응형