한자
통계학에서의 어원
→ 경향성 분석, 경향 예측
→ continuous(연속형) vs. discrete(이산형)
구분 | 회귀 | 분류 |
---|---|---|
출력 | 연속적인 수치 값(실수) | 정해진 범주(이산적 값) |
예시 질문 | "얼마나?"(기온, 가격, 점수) | "어떤?"(상승/하락, 합격/불합격) |
대표 알고리즘 | 선형 회귀, 다항 회귀, 트리기반모델 등 | 로지스틱 회귀, SVM, 트리기반모델 등 |
→ 머신 러닝도 결국 크게 보면 하나의 함수라고 생각할 수 있어요!(x를 넣으면 y가 나옴)
만약 독립변수(X)가 여러 개라면?
→ 평면도 직선이라고 볼 수 있기 때문
구분 | 단순선형회귀 | 다중회귀(선형회귀) |
---|---|---|
독립 변수의 개수 | 1개 | 2개 이상 |
방정식 형태 | y=Wx+b | y=W1x1+W2x2+⋯+b |
시각화 | 2D (직선) | 3D 이상 (평면 또는 초평면) |
모델 복잡도 | 낮음 | 상대적으로 높음 |
※ 선형 회귀: 경향성을 확인할 수 있으면서 오차를 최소화하는 직선(또는 평면)을 찾는 것
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))
→ 데이터를 추가 가공해서 다항을 맞추는 것: 보면 모델은 그대로임
→ 포인트는 "다항 특징 생성(2차 다항식)"
from sklearn.linear_model import Ridge
# 모델 학습
ridge_reg = Ridge(alpha=1.0)
ridge_reg.fit(X, y)
# 예측
y_pred = ridge_reg.predict(X)
→ alpha는 규제를 얼마나 강하게 걸 것인지 결정하는 것(0~1 사이 값)
from sklearn.linear_model import Lasso
# 모델 학습
lasso_reg = Lasso(alpha=0.1)
lasso_reg.fit(X, y)
# 예측
y_pred = lasso_reg.predict(X)
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(n_estimators=100, learning_rate=0.1, random_state=42)
catboost_reg.fit(X, y)
# 예측
y_pred = catboost_reg.predict(X)