회귀는 데이터를 기반으로 연속적인 값을 예측하는 머신러닝 기법
"회귀"라는 단어는 "다시 돌아간다"는 의미를 가지고 있으며, 이는 통계학에서 사용되는 회귀 분석(regression)의 초기 개념에서 파생되었습니다.
통계학에서의 어원
회귀 분석의 영어 단어인 "regression"은 영국의 통계학자 프랜시스 골턴(Francis Galton)에 의해 처음 사용되었습니다. 이 단어는 19세기 후반 골턴이 부모의 키와 자식의 키 간의 상관관계를 연구하면서 등장했는데, 그는 다음과 같은 현상을 발견했습니다.
부모가 평균보다 키가 크더라도, 자식의 키는 평균으로 "되돌아가는(regress)" 경향을 보임.
반대로, 부모가 평균보다 키가 작더라도 자식의 키는 다시 평균으로 "되돌아가는" 경향을 보임.
골턴은 이를 "regression to the mean"(평균으로의 회귀)라고 불렀습니다. 이후 이 개념이 확장되어, 데이터의 변수 간 관계를 모델링하여 하나의 변수(종속 변수)가 다른 변수(독립 변수)에 대해 변화하는지를 분석하는 기법으로 발전하게 됩니다.
분류와의 차이점: 분류는 범주(categorical) 예측, 회귀는 수치(numerical) 예측.
| 구분 | 회귀 | 분류 |
|---|---|---|
| 출력 | 연속적인 수치 값 (실수) | 정해진 범주 (이산적 값) |
| 예시 질문 | "얼마나?" (기온, 가격, 점수) | "어떤?" (상승/하락, 합격/불합격) |
| 대표 알고리즘 | 선형 회귀, 다항 회귀, 트리기반모델 등 | 로지스틱 회귀, SVM, 트리기반모델 등 |



| 구분 | 단순선형회귀 | 다중회귀(선형회귀) |
|---|---|---|
| 독립 변수의 개수 | 1개 | 2개 이상 |
| 방정식 형태 | y=Wx+b | y=W1x1+W2x2+⋯+b |
| 시각화 | 2D (직선) | 3D 이상 (평면 또는 초평면) |
| 모델 복잡도 | 낮음 | 상대적으로 높음 |
평균 제곱 오차(MSE), MAE, RMSE 등
수학적인 방법 or 경사하강법(Gradient Descent) 사용


from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 데이터 준비
X = [[1], [2], [3], [4], [5]]
y = [2, 4, 6, 8, 10]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 데이터 생성
# 독립 변수 (x1, x2)
X = np.array([[1, 2], [2, 3], [3, 5], [4, 6], [5, 8]])
# 종속 변수 (y)
y = np.array([3, 5, 7, 9, 11])
# 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 모델 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 결과 확인
print("회귀 계수 (W):", model.coef_)
print("절편 (b):", model.intercept_)
# 예측
y_pred = model.predict(X_test)
print("예측 값:", y_pred)
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 1. 데이터 준비
X = [[1, 2], [2, 3], [3, 5], [4, 6], [5, 8]] # 독립 변수
y = [3, 5, 7, 9, 11] # 종속 변수
# 2. 데이터 분리 (훈련/테스트 데이터셋)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 3. 데이터 표준화
scaler = StandardScaler() # SGD는 표준화된 데이터에서 더 잘 작동
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 4. 모델 학습
sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, random_state=42, learning_rate='optimal')
sgd_reg.fit(X_train, y_train)
# 5. 예측
y_pred = sgd_reg.predict(X_test)
# 6. 평가
mse = mean_squared_error(y_test, y_pred)
print("회귀 계수 (W):", sgd_reg.coef_) # 학습된 계수
print("절편 (b):", sgd_reg.intercept_) # 절편
print("테스트 데이터 MSE:", mse)

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
# 데이터 생성
X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)
y = np.array([1.5, 4.2, 9.3, 16.8, 25.1])
# 다항 특징 생성 (2차 다항식)
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X)
# 모델 학습
poly_reg = LinearRegression()
poly_reg.fit(X_poly, y)
# 예측
y_pred = poly_reg.predict(X_poly)
# 결과 출력
print("다항 회귀 계수:", poly_reg.coef_)
print("절편:", poly_reg.intercept_)
print("MSE:", mean_squared_error(y, y_pred))

from sklearn.linear_model import Ridge
# 모델 학습
ridge_reg = Ridge(alpha=1.0)
ridge_reg.fit(X, y)
# 예측
y_pred = ridge_reg.predict(X)
라쏘(Lasso)
- 수식

- 코드
from sklearn.linear_model import Lasso
# 모델 학습
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)
# 예측
y_pred = lasso_reg.predict(X)
엘라스틱넷(Elasticnet)
- 수식

- 코드
from sklearn.linear_model import ElasticNet
# 모델 학습
elastic_net_reg = ElasticNet(alpha=0.1, l1_ratio=0.5) # l1_ratio=0.5: L1과 L2의 균형
elastic_net_reg.fit(X, y)
# 예측
y_pred = elastic_net_reg.predict(X)
from sklearn.ensemble import RandomForestRegressor
# 모델 학습
rf_reg = RandomForestRegressor(n_estimators=100, random_state=42)
rf_reg.fit(X, y)
# 예측
y_pred = rf_reg.predict(X)
from xgboost import XGBRegressor
# 모델 학습
xgb_reg = XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=42)
xgb_reg.fit(X, y)
# 예측
y_pred = xgb_reg.predict(X)
from lightgbm import LGBMRegressor
# 모델 학습
lgbm_reg = LGBMRegressor(n_estimators=100, learning_rate=0.1, random_state=42)
lgbm_reg.fit(X, y)
# 예측
y_pred = lgbm_reg.predict(X)
from catboost import CatBoostRegressor
# 모델 학습
catboost_reg = CatBoostRegressor(iterations=100, learning_rate=0.1, depth=6, verbose=0, random_state=42)
catboost_reg.fit(X, y)
# 예측
y_pred = catboost_reg.predict(X)
# 결과 출력
print("CatBoost 예측 값:", y_pred)
print("MSE:", mean_squared_error(y, y_pred))
CNN
RNN
LSTM
GRU
Transformer
최근들어 산업계에서 단순히 결과만 잘 내고 끝내는 것이 아니라 왜 그런 결과를 냈는지 설명도 할 수 있는 것을 중요시함
ex) 특히, 금융, 의료, 제조 산업에서 중요!
데이터 가져오기
- 데이터 다운로드
- 데이터 구조 훑어 보기
- (테스트 데이터 만들기 → 현업에서는 이 과정 생략하고 실제 들어오는 데이터로 테스트 진행)
데이터 이해를 위한 탐색과 시각화 (EDA)
- 시각화
- 상관관계 조사
- 특정 조합 만들어 보기
머신러닝을 위한 데이터 전처리
- 데이터 정제 (결측값, 이상치 확인 등)
- 텍스트와 범주형 특성 다루기
- 스케일링 (정규화, 표준화 등)
모델 선택과 훈련
- 다양한 모델들을 선택
- 훈련 데이터로 훈련하기
모델 튜닝
- 그리드 탐색
- 랜덤 탐색
모델 평가하기
- 오차분석
- 성능평가