일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ack
- cpp class
- Design Pattern
- Machine Learning
- 넘파이 배열
- 디자인 패턴
- lambda
- 클러스터링
- NumPy
- 코딩테스트
- 차원축소
- java
- python
- cpp
- 기계학습
- 넘파이
- 합성곱 신경망
- 머신러닝
- 네트워크 기초
- numpy 기초
- OOP
- 자바
- 코테
- c++
- 코딩테스트실력진단
- 데이터 분석
- 코드트리
- 넘파이 기초
- 파이썬
- 데이터 마이닝
- Today
- Total
준비하는 대학생
[기계학습] 선형회귀 모델 본문
선형회귀란?
선형회귀는 종속 변수 y와 하나 이상의 독립 변수(또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법입니다. 즉, 데이터를 가장 잘 대표하는 직선을 찾는 것이 목적입니다. 이때, 직선은 기울기와 절편을 가지며, 이를 통해 새로운 데이터에 대해 y 값을 예측하는 데 사용할 수 있습니다.
수식으로 표현하면, y = wx + b와 같이 나타낼 수 있습니다. 여기서 y는 종속 변수, x는 독립 변수, w는 가중치(기울기), b는 절편입니다.
회귀분석 모델의 종류
- 단순회귀분석(Simple Regression Analysis) : 독립 변수가 1개인 회귀분석 (Y=b+wx+ϵ)
- 다중회귀분석(Multiple Regression Analysis) : 독립 변수가 여러 개인 회귀분석 (Y=b+w_1 x_1+w_2 x_2+ϵ...)
데이터 준비하기
선형회귀 모델을 만들기 전에, 먼저 사용할 데이터를 준비해야 합니다. 이를 위해 간단한 예시 데이터를 생각해봅시다.
예를 들어, 학생들의 공부 시간에 따른 시험 성적을 예측하고자 합니다. 여기서 공부 시간은 독립 변수 X가 되고, 시험 성적은 종속 변수 y가 됩니다.
모델 학습하기
데이터가 준비되면, 이제 선형회귀 모델을 학습시킬 차례입니다. 기본적으로 선형회귀 모델은 데이터에 가장 잘 맞는 직선을 찾는 과정으로, 학습방법으로 최소제곱법, 정규방정식, 그리고 경사하강법이 있습니다.
최소제곱법 (Least Square Estimator)
선형회귀에서는 데이터에 가장 잘 맞는 직선을 찾습니다. 최소제곱법은 실제 값과 모델이 예측한 값 사이의 거리(오차)를 제곱하여 더한 값이 최소가 되도록 하는 가중치와 절편을 찾는 방법입니다.
정규방정식 (Normal Equation)
정규방정식은 최소제곱법을 수학적(편미분)으로 해결하는 방법 중 하나입니다. 정규방정식은 오차의 제곱합을 최소화하는 가중치를 직접적으로 구하는 공식입니다.
$$ SSE = \sum \epsilon^2_i = \sum{(Y_i-\hat{y_i})^2 } $$
$$ 1. \ \ \ \frac {\partial SSE}{\partial b} = 2 \sum{(Y_i -wx_i-b)(-1)} = 0 $$ $$ 2. \ \ \ \frac {\partial SSE}{\partial w} = 2 \sum{(Y_i -wx_i-b)(-x_i)} = 0 \\ $$ $$ 1 식 \times \bar{x} \ 한뒤 \ 정리시, $$ $$ 3.\ b \sum x_i + w\bar x \sum x_i= n\bar x \bar Y $$ $$ 4. \ b\sum x_i + w \sum x_i^2= \sum x_i Y_i $$
4번식에서 3번식을 뺀 뒤 정리하면
$$ \hat w = \frac {\sum (x_i - \bar x)(Y_i - \bar Y)}{\sum (x_i-\bar x)} $$ $$ \hat b = \bar Y - \hat w \bar x $$
가중치 𝐰는 위와 같이 주어집니다.
여기서 𝐗는 설계 행렬(design matrix), 𝐲는 종속 변수 벡터입니다.
이 방법의 장점은 반복이 필요 없이 해를 구할 수 있다는 것입니다. 하지만, 특성 수가 많아질수록 계산 비용이 높아질 수 있습니다.
경사하강법 (Gradient Descent)
경사하강법은 최소제곱법을 반복적으로 수행하여 최적의 해를 찾는 방법입니다. 경사하강법은 초기 가중치를 임의로 설정한 다음, 손실함수를 정의한 뒤 손실함수가 감소하는 방향으로 가중치를 변경합니다.
손실함수
$$ SE = \epsilon^2_i = (Y-\hat y_i)^2 $$ , $$\hat y_i = b + wx_i$$
이를 편미분하면
1. 기울기 (w)
$$ \frac{\partial SE}{\partial w} = \frac{\partial}{\partial w}(Y-\hat y)^2 = \frac{\partial}{\partial w}(Y-b-wx)^2 = 2(Y-b-wx)(-x) = -2(Y- \hat y)x $$ $$ w =w - \frac{\partial SE}{\partial w}= w - (-2(Y -\hat y)x) $$
2. 절편 (b)
$$ \frac{\partial SE}{\partial b} = \frac{\partial}{\partial b}(Y-\hat y)^2 = \frac{\partial}{\partial b}(Y-b-wx)^2 = 2(Y-b-wx)(-1) = -2(Y- \hat y) $$ $$ b =b - \frac{\partial SE}{\partial b}= b - (-2(Y -\hat y)) $$
즉, 가중치 와 절편은 위 공식대로 업데이트 할 수 있습니다.
예시 코드
class SimpleLinearRegression():
# 절편과 기울기 초기화
def __init__(self):
self.w = 1.0
self.b = 1.0
# 예측 x가 주어지면 절편과 기울기를 이용해서 예측값을 리턴
def predict(self, x):
y_hat = x * self.w + self.b
return y_hat
# epoch만큼 반복하면서 경사하강법을 수행
def fit(self, x, y, epoch = 100, learning_rate = 0.00001):
cost1 = 1000000000000
for i in range(epoch):
cost2 = 0
for x_i, y_i in zip(x, y):
# print(x_i, y_i, self.w, self.b)
y_hat = x_i * self.w + self.b
err = -(y_i - y_hat)
self.w = self.w - (err * x_i) * learning_rate
self.b = self.b - (err * 1) * learning_rate
cost2 = cost2 + ((1/2)*(y_i - y_hat) ** 2)
if (cost1 - cost2) < 0.00000001:
# return i , cost1 - cost2
break
else:
cost1 = cost2
return i , cost1-cost2
def score(self, x, y):
numerator = (y - self.predict(x)) ** 2
denominator = (y - y.mean()) ** 2
return 1 - numerator.sum() / denominator.sum()
# 데이터셋 불러오기
from sklearn.datasets import fetch_openml
boston = fetch_openml(name='Boston', version=1)
X = boston.data.to_numpy()
y = boston.target.to_numpy()
SLR = SimpleLinearRegression()
epo, cost_df = SLR.fit(X[:,0], y, 1000000, 0.000003)
print(SLR.w, SLR.b, epo, cost_df)
-0.41820862098631495 24.027256988575726 6333 4.423782229423523e-09
위 코드로 보스턴 주택의 첫번째 변수에 대한 단순선형회귀를 통해 기울기(w)와 졀편(b)를 구할 수 있습니다.
다항 회귀 (Polynomial Regression)
선형 회귀에서는 입력 특성과 타겟 변수 간의 선형 관계를 모델링합니다. 하지만, 실제 데이터는 선형적이지 않을 수도 있습니다. 이런 경우 다항 회귀를 사용하여 비선형 관계를 모델링 할 수 있습니다.
다항 회귀는 기본 아이디어로는 입력 특성의 거듭제곱을 새로운 특성으로 추가하고, 이 확장된 특성을 사용하여 선형 모델을 훈련시킵니다.
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# 다항 특성 추가
print(X.shape)
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
# 선형 회귀 적용
print(X_poly.shape)
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)
print(lin_reg.score(X_poly, y))
(506, 13)
(506, 104)
0.928996171459302
위 예제는 X의 변수를 2차식 까지 확장하여 13개의 특징을 104개로 확장하여 훈련하였습니다. 하지만 과하게 차수를 높여 회귀분석을 하는 경우 과대적합이 발생할 수 있습니다. 따라서 적절한 차수를 찾아 분석하는 것이 중요합니다.
규제 (Regularization)
모델이 훈련 데이터에 과적합(overfitting)되는 것을 방지하기 위해 규제를 사용할 수 있습니다. 규제는 모델의 복잡성에 패널티를 부과함으로써 작동합니다. 릿지(Ridge), 라쏘(Lasso), 엘라스틱넷(Elastic Net)이 대표적인 규제 기법들입니다.
L1 규제 (Lasso Regression)
라쏘 회귀는 L1 규제를 사용하여 손실 함수에 패널티를 추가합니다. 라쏘 회귀의 특징은 덜 중요한 특성의 가중치를 완전히 제거하는 경향이 있다는 것입니다.
손실함수 식은 아래와 같습니다.
$$ SE = (Y-\hat y_i)^2 + \alpha \sum^b_{i=1}|w_i| $$
$$ \frac {\partial SE}{\partial w} =2x_i(Y-wx_i-b)+ (\begin{cases} & \text{ if } w_i< 0 : -\alpha\\ & \text{ if } w_i\geq 0 : \alpha \end{cases}) $$
위 식과 같은 손실함수를 갖고 있기 때문에 이를 손실함수를 미분하게 되면 L1부분은 부호만 남게되어 alpha(α)값에 더 많은 영향을 끼치게 됩니다. 따라서 일부 가중치를 0으로 만들 수 있기 때문에 유효한 특성만 남게되어 차원 축소 방법으로도 사용가능합니다.
L2 규제 (Ridge Regression)
릿지 회귀는 선형 회귀의 손실 함수에 L2 규제 항을 추가합니다.
손실함수는 아래와 같습니다.
$$ SE = (Y-\hat y_i)^2 + \alpha \sqrt{\sum^n_{i=1}(w_i)^2} $$
L2규제는 손실함수를 미분하게 되면 alpha값이 영향을 주는데, 해당 alpha 값에 아직 기울기의 영향도가 남아있기 때문에 사라지지 않고 그 범위만 줄어들게 됩니다. L1규제와 같이 가중치를 0으로 만드는 것이 아니라 전체적인 scale을 줄여줍니다.
$$ \frac {\partial SE}{\partial w} =2x_i(Y-wx_i-b)+ \frac{2w_i \alpha}{\sqrt{\sum^n_{i=1}(w_i)^2}} $$
엘라스틱넷 회귀 (Elastic Net Regression)
엘라스틱넷은 L1 규제와 L2 규제를 결합한 형태입니다. 혼합 비율 r을 사용하여 L1과 L2규제의 비율을 조절할 수 있습니다.
손실함수는 아래와 같습니다.
$$ SE = (Y-\hat y_i)^2 +a \sum^n_{i=1}|w_i|+ b\sqrt{\sum^n_{i=1}(w_i)^2} $$
이처럼 두 규제를 결합하여 a값과 b의 값을 조절하여 규제를 유연하게 설정할 수 있습니다.
결론
이상으로, 선형 회귀에 대해 알아보았습니다. 다항 회귀는 비선형 관계를 모델링하는 데 사용되며, 규제는 모델의 과적합을 방지하기 위해 사용됩니다.
적절한 다항 차수와 규제 강도를 선택하여 데이터에 가장 적합한 모델을 만들어보세요. 다항 회귀와 규제는 머신러닝 분야에서 많이 사용되는 기법 중 하나이며, 데이터의 특성과 문제에 맞게 적용하면 더 좋은 예측 결과를 얻을 수 있습니다.
'Programming > Machine learning' 카테고리의 다른 글
[기계학습] 평가지표 (0) | 2023.06.19 |
---|---|
[기계학습] 로지스틱 회귀 (Logistic Regression) (0) | 2023.06.09 |
[기계학습] 에이다부스트, 그래디언트 부스트 (0) | 2023.06.08 |
[기계학습] 앙상블 학습 - 랜덤포레스트(Random Forest) (0) | 2023.06.08 |
[기계학습] 교차검증(Cross Validation) (0) | 2023.06.08 |