아무것도 모르는 공대생의 지식 탐험기
모두의 딥러닝 2일차 (Ch04) 본문
1. 가장 훌륭한 예측선 (ch04)
선형회귀란, 독립 변수 x를 사용해 종속 변수 y의 움직임을 예측하고 설명하는 작업을 의미한다.
-> 하나의 x값만으로도 y의 값을 설명할 수 있다면 단순 선형 회귀
-> x값이 여러 개 필요하다면 다중 선형 회귀
-> 데이터에서 변수들 간의 관계를 모델링하여 독립 변수(입력 변수)를 기반으로 종속 변수(출력 변수)를 예측하는 통계적 방법이다.
->회귀 분석은 주로 연속적인 값을 예측하는 데 사용된다.
->회귀는 머신러닝의 기본적인 지도 학습 기법 중 하나로 널리 활용되고 있다.
회귀의 핵심 목적은 입력 변수와 출력 변수 사이의 수학적 관계를 파악하여, 새로운 데이터가 주어졌을 때 출력값을 정확히 예측하는 것이다. 이는 "특정 입력값이 주어졌을 때 결과값은 어떤 경향성을 보인다"는 패턴을 발견하는 과정이라 할 수 있다. 예컨대, 학습 시간과 시험 성적 간의 관계를 분석한다면, 특정 학습 시간을 투입했을 때 예상되는 성적을 추정할 수 있게 된다.
선형 회귀는 이러한 관계를 직선 형태로 표현하는 기법이다. 학습 시간이 증가함에 따라 성적이 비례하여 상승하는 상황을 생각해볼 수 있다. 데이터 포인트들 사이에 최적의 직선을 그어 주어진 입력값에 대응하는 출력값을 예측한다. 다중 회귀는 예측에 여러 변수가 관여할 때 활용된다. 부동산 가격을 예측하는 경우, 면적, 입지 조건, 방 개수 등 다양한 요소들이 고려되어야 한다. 이때는 단순 직선보다 복합적인 관계식을 통해 현상을 설명하게 된다.
2) 가장 훌률한 예측선
선형 회귀란 정확한 직선을 그려내는 것이다 = 최적의 a와 b 값을 찾는 것이다
3) 최소 제곱법
최소 제곱법은 딥러닝에서 회귀 문제를 해결하기 위한 주요 손실 함수 중 하나로 활용된다. 최소 제곱법의 핵심 원리는 모델이 예측한 값과 실제 정답 사이의 오차를 제곱한 후 이를 합산하여 최소화하는 것이며, 이는 예측의 정확도를 높이기 위한 기본적인 손실 함수로 널리 사용된다.
단순선형회귀와 같이 입력 변수 x가 단일 할 때는 최소 제곱법을 직접 적용할 수 있으나, 다중 변수가 관여하는 복잡한 모델에서는 경사 하강법 알고리즘을 통해 최적의 매개변수를 찾아나가는 방식을 취한다.
y절편을 구하는 방식은 아래와 같다.
최소 제곱법을 적용하면 주어진 데이터 포인트들의 특성을 가장 정확히 반영하, 오차가 최소화된 직선을 도출해낼 수 있다. 이렇게 산출된 직선이 바로 선형회귀 분석에서 필요로 하는 예측 모델이며, 이 모델에 새로운 데이터를 입력함으로써 해당 상황에 대한 예측값을 계산해낼 수 있다.
파이썬 코딩으로 확인하는 최소 제곱
최소 제곱법 공식에서 'x의 각 원소에서 x의 평균을 뺀 값을 제곱한 합'을 div로 정의하며, 이는 분모에 해당한다.
분자는 x와 x의 평균, y와 y의 평균의 차이를 활용하여 계산되며, 이 과정은 별도의 함수로 선언하여 수행하고, 반환값을 사용하여 계산을 진행한다.
#혼경 및 데이터 준비
# 넘파이 라이브러리 불러오기
import numpy as np
# 공부한 시간과 성적을 각각 x, y라는 이름의 넘파이 배열로 만듦
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])
#x와 y의 평균 구하기 ( mean() ) -> 모든 원소의 평균 구함, 넘파이에 존재함
#x의 평균값을 구함
mx = np.mean(x)
#y의 평균값을 구함
my = np.mean(y)
print("x의 평균값:", mx)
print("y의 평균값:", my)
#x의 평균값: 5.0
#y의 평균값: 90.5
# 기울기 공식의 분모
divisor = sum([(i - mx)**2 for i in x])
# 기울기 공식의 분자
def top(x, mx, y, my):
d = 0
for i in range(len(x)):
d += (x[i] - mx) * (y[i] - my)
return d
dividend = top(x, mx, y, my)
print("분모:", divisor)
print("분자:", dividend)
#분모: 20.0
#분자: 46.0
# 기울기 a를 구하는 공식
a = dividend / divisor
# y절편 b를 구하는 공식
b = my - (mx*a)
print("기울기 a =", a)
print("y절편 b =", b)
#기울기 a = 2.3
#y절편 b = 79.0
4) 평균 제곱 오차
최소제곱법은 데이터를 가장 잘 설명하는 최적의 직선을 찾는 선형 회귀 방법이다.
이 방법은 관측된 데이터와 모델이 예측한 값 사이의 차이를 최소화하는 방식으로 작동하며, 오차의 제곱합을 최소화하여 직선의 기울기와 절편을 결정한다. 주로 회귀 분석에서 사용되며, 간단하고 직관적인 장점이 있다.
그러나 최소제곱법에는 몇 가지 한계가 존재한다.
1. 이상치(Outlier)에 민감함
오차의 제곱합을 최소화하는 방식이기 때문에 이상치가 포함될 경우 모델이 크게 영향을 받을 수 있다. 단 몇 개의 이상치만으로도 최적의 직선이 왜곡될 위험이 있다.
2. 비선형 관계를 설명할 수 없음
최소제곱법은 선형 관계를 가정하기 때문에 독립 변수와 종속 변수 간의 비선형 관계를 효과적으로 설명하지 못한다. 따라서 비선형 데이터에는 적합하지 않다.
3. 잔차의 정규성과 등분산성 가정
최소제곱법은 잔차(Residual)가 정규분포를 따르고 분산이 일정하다는 가정을 전제로 한다. 이러한 가정이 깨질 경우 모델의 신뢰성이 낮아질 수 있다.
4. 고차원 데이터에서의 과적합(Overfitting) 문제
다중 회귀 분석에서 변수가 많아질수록 최소제곱법은 과적합 문제를 일으킬 가능성이 커진다. 과적합이 발생하면 모델이 학습 데이터에 지나치게 적응하여 테스트 데이터에 대한 일반화 성능이 저하될 수 있다.
평균제곱오차(MSE)의 개념
평균제곱오차(Mean Squared Error, MSE)는 예측 값과 실제 값 간의 차이를 제곱하여 평균을 구한 값으로, 모델의 성능을 평가하는 대표적인 지표이다. 공식은 다음과 같다.
여기서
- yiy_i : 실제 값
- y^i\hat{y}_i : 예측 값
- nn : 데이터 개수
MSE 값이 작을수록 모델의 예측 정확도가 높음을 의미한다.
파이썬 코딩으로 확인하는 평균 제곱 오차
#환경 및 데이터 준비
# 넘파이 라이브러리 불러오기
import numpy as np
# 가상의 기울기 a와 y절편 b를 정하기
fake_a=3
fake_b=76
# 공부 시간 x와 성적 y의 넘파이 배열을 만듦
x = np.array([2, 4, 6, 8])
y = np.array([81, 93, 91, 97])
#예측값 구하기
# y=ax + b에 가상의 a,b 값을 대입한 결과를 출력하는 함수 생성
def predict(x):
return fake_a * x + fake_b
# 예측 값이 들어갈 빈 리스트를 만듦
predict_result = []
# 모든 x값을 한 번씩 대입하여 predict_result 리스트를 완성
for i in range(len(x)):
predict_result.append(predict(x[i]))
print("공부시간=%.f, 실제점수=%.f, 예측점수=%.f" % (x[i], y[i], predict(x[i])))
#평균제곱오차 구하기
# 평균 제곱 오차 함수를 각 y값에 대입하여 최종 값을 구하는 함수
n=len(x)
def mse(y, y_pred):
return (1/n) * sum((y - y_pred)**2)
# 평균 제곱 오차 값을 출력
print("평균 제곱 오차: " + str(mse(y,predict_result)))