Lec5.Regression
Regression(회귀)
1. 선형회귀 정의
- 독립 변수 : x값이 변함에 따라 y값도 변한다 는 이 정의 안에서, 독립적으로 변할 수 있는 x값
- 종속 변수 : 독립 변수에 따라 종속적으로 변하는 값
- 선형 회귀 : 독립 변수 x를 사용해 종속 변수 y의 움직임을 예측하고 설명하는 작업을 말한다.
2. 선형회귀 종류(2)
- 단순 선형 회귀 : 하나의 x값 만으로도 y값을 설명할 수 있을 때
- 다중 선형 회귀 : x값이 여러 개 필요할 때
- 단순선형회귀 예시
x, y값으로 이뤄진 어떤 테이블이 있을 때, 2차원 그래프로 선형 그래프를 나타낼 수 있다.
최소 제곱법(method of least squares)
y = ax + b일때, 다음을 이용해서 구할 수 있다.
a = (x-x평균)(y-y평균)의 합/ (x-x평균)^2의 합
b = y의 평균 - (x의 평균 * 기울기 a)
y^ = ax + b (여기서 나온 a, b는 위에서 구한 값으로 넣은 새로운 y다.)
y^에 원래 주어진 x값을 넣어 새로운 y값 즉, 예측값이라 할 수 있는 y^을 구해서 선형 그래프로 나타낸다. -> 예측값에 대한 기울기
Θ = {a, b} : 파라미터 값은 a, b란 의미
argmin J(Θ) : 파라미터값을 통해 J가 최소가 되는 Θ값을 찾기
3. 오차 수정
오차
- 평균 제곱 오차(MSE)
import numpy as np
fake_a_b = [3, 76]
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
def predict(x):
return fake_a_b[0]*x + fake_a_b[1]
def mse(y, y_hat):
return ((y-y_hat) ** 2).mean()
def mse_eval(y, predict_result):
return mse(np.array(y), np.array(predict_result))
predict_result = []
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("Study=%.f, Real_Score=%.f, Prec_Score=%.f" % (x[i], y[i], predict(x[i])))
print("MSE result : " + str(mse_eval(predict_result, y)))
학습률
(어느 만큼 이동시킬지를 신중히 결정해야 하는데, 이 때) 이동 거리를 정해주는 것
경사하강법에서 매우 중요한 하이퍼파라미터이다.
학습률은 각 스텝에서 매개변수를 얼마나 크게 업데이트할지를 제어한다.
너무 작은 학습률은 수렴이 느리게 되거나 지역 최솟값에 빠질 가능성이 있으며, 너무 큰 학습률은 수렴하지 못하거나 발산할 수 있다.
따라서, 적절한 학습률을 선택하는 것이 중요하다.
경사하강법
오차의 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설정해 미분 값이 0인 지점을 구하는 것
즉, 경사하강법은 기계학습과 최적화 문제를 해결하기 위해 사용되는 중요한 최적화 알고리즘 중 하나이다.
주로 모델을 훈련시키거나 손실 함수를 최소화하는데 활용된다.
매개변수 공간에서 손실 함수의 기울기를 따라 내려가면서 손실을 최소화하는 최적의 매개변수 값을 찾는 과정을 수행한다.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = [[2,81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
plt.figure(figsize=(8,5))
plt.scatter(x,y)
plt.show()
x_data = np.array(x)
y_data = np.array(y)
a = 0
b = 0
lr = 0.03
epochs = 2001
for i in range(epochs):
y_hat = a*x_data + b
error = y_data - y_hat
a_diff = -(2/len(x_data)) * sum(x_data * (error))
b_diff = -(2/len(x_data)) * sum(error)
a = a - lr * a_diff
b = b - lr * b_diff
if i % 100 == 0:
print("epoch = %.f, grdient = %.04f, y = %.04f" % (i, a, b))
from sklearn.linear_model import LinearRegression
data = [[2,81], [4, 93], [6, 91], [8, 97]]
y = [i[1] for i in data]
x = [[2], [4], [6], [8]]
model = Linearregression()
model.fit(x, y)
print("Gradient : ", model.coer_, "y : ", model.intercept_)
선형회귀, 경사하강법
다중선형회귀 예측 모델
y^ = Θ0 + Θ1x1 + Θ2x2 + .... + Θnxn
Θ0 : bias(x값의 변화가 없다.)
y^ : 예측 값
n : features의 값
xi : f번째 특징 값
Θj : j번째 모델의 파라미터 값
다중 선형 회귀 모델은 여러 개의 입력 변수(독립 변수)를 사용하여 연속적인 종속 변수를 예측하는 통계적 모델링 기법 중 하나이다.
다중 선형 회귀는 각 입력 변수의 가중치를 모두 곱한 후 모두 더해 선형 방정식을 통해 예측을 수행한다.
y = β₀ + β₁x₁ + β₂x₂ + ... + βₖxₖ + ε
- y는 예측하려는 종속 변수(예를 들면, 주택 가격이나 판매량)입니다.
- x₁, x₂, ..., xₖ는 입력 변수(독립 변수)들을 나타냅니다. 각 입력 변수는 예측에 영향을 미치는 특성(feature)입니다.
- β₀, β₁, β₂, ..., βₖ는 각 입력 변수에 대한 가중치(weight) 또는 회귀 계수(regression coefficient)를 나타냅니다. 이 가중치는 해당 입력 변수의 중요도와 방향을 결정합니다.
- ε은 오차 항(residual)으로, 모델이 종속 변수를 완벽하게 예측하지 못하는 노이즈를 나타냅니다
이 과정은 주어진 입력 변수와 관련된 회귀 계수를 찾는 것이다.
주로 최소제곱법을 사용해서 수행되며, 이는 실제 관측값과 모델의 예측값 간의 제곱 오차를 최소화하는 회귀 계수를 찾는 방법이다.
특징 :
1. 여러 개의 입력 변수를 고려해서 복잡한 관계를 모델링 할 수 있다.
2. 입력 변수와 종속 변수 간 선형 관계를 가정한다.
3. 회귀 계수를 통해 입력 변수 간 상대적인 영향력을 파악할 수 있다.
4. 오차 항은 정규 분포를 따르고 독립적이라고 가정한다.
BGD
전체 훈련 데이터 집합에 대한 손실 함수의 기울기를 계산해서 매개변수를 업데이트한다.
모든 훈련 데이터를 한 번에 업데이트하므로 업데이트가 매우 안정적이다.
대규모 데이터집합에 대해서도 잘 작동하지만, 데이터가 많으면 계산 비용이 높아질 수 있다.
안정적인 수렴을 보장하므로 더 정확한 결과를 얻을 수 있지만, 계산 시간이 오래 걸릴 수 있다.
SGD
매개변서 업데이트를 위해 무작위로 선택한 하나의 훈련 데이터 포인트에 대한 손실 함수의 경사를 계산한다.
이는 무작위성을 도입하므로 업데이트가 불안정하며, 수렴 과정이 불규칙할 수 있다.
빠른 수렴이 가능하고, 데규모 데이터 집합에 대해서도 효과적으로 작동한다.
그러나, 수렴은 더 불안정하고, 노이즈가 있는 데이터에 민감하다.
MBGD
BGD와 SGD 사이의 절충안
훈련 데이터를 작은 미니배치로 나누고, 각 미니 배치에 대한 손실 함수의 기울기를 계산해서 매개변수를 업데이트한다.
1. 미니배치 크기
미니배치 경사하강법에서는 미니배치 크기를 사용자가 정의해야 한다.
일반적으로 1~전체 훈련 데이터셋 크기 사잇 값
ex. minibatch = 32, => 각 업데이트 당 32개의 데이터 포인트를 사용한다.
2. 미니배치 선택
미니배치 경사하강법은 각 업데이트마다 훈련 데이터를 임의로 선택하여 미니배치를 구성한다.
이 무작위성은 SGD와 마찬가지로 활용되지만, 미니배치의 크기만큼 데이터를 고려하므로 노이즈가 작고 안정적인 업데이트를 제공한다.
3. 업데이트
각 미니배치에 대한 손실 함수의 경사를 계산하고, 이를 이용해서 매개변수를 업데이트한다.
업데이트는 BGD와 마찬가지로 다음과 같이 수행한다.
θ_new = θ_old - learning_rate * ∇J(θ_old)
- θ_new는 업데이트된 매개변수 값입니다.
- θ_old는 현재의 매개변수 값입니다.
- learning_rate는 학습률(learning rate)로, 매개변수를 얼마나 크게 업데이트할지 결정하는 하이퍼파라미터입니다.
- ∇J(θ_old)는 미니배치에 대한 손실 함수 J(θ)의 경사(기울기)를 나타냅니다.
장점(3) :
BGD에 비해 계산 비용은 낮고, SGD에 비해 더 안정적인 업데이트를 제공한다.
대규모 데이터 집합에 대해서도 효과적이며, 병령 처리를 통해 계산 속도를 높일 수 있다.
미니배치 크기를 조절해서 모델의 학습 속도와 안정성을 조절할 수 있다.