MLDL

선형 회귀 (Linear Regression)

DEVDAE828 2022. 2. 7. 15:39

출처:코드잇

위의 그림과 같이 집 크기가 주어졌을 때, 이걸 이용해서 집 값을 예측하는, 이 데이터에 가장 잘 맞는 가장 적절한 하나의 선을 찾아내는 것이 선형 회귀이다. 이 선은 통계학에서는 Line of best fit 이라고 한다. 

 

변수

선형 회귀를 이용해 맞추려고 하는 값을 '목표 변수' 영어로는 target variable 또는 output variable 하고 한다. 그리고 이 목표 변수를 맞추기 위해서 사용하는 값을 '입력 변수' input variable 라고 한다. 일반적으로는 feature라고 한다.

위의 그래프에서는 집 크기는 입력 변수, 집 값은 목표 변수가 된다. 

 

데이터 표현볍

프로그램을 학습시키기 위해 사용하는 데이터를 학습 데이터 라고 한다. 학습 데이터의 개수는 보통 m이라는 문자로 표현한다. 예를 들어 m이 40이면 40개의 집 데이터로 이 모델을 학습시키는 것이다. 

입력 변수는 x로 표현하고 목표 변수는 y로 표현한다. 

출처:코드잇

일반화 하면 i 번째 집 크기는 x^{(i)}, i 번째 집 값은 y^{(i)}

 

 

 

 

 

출처:코드잇

3가지의 가설 함수가 있다고 가정했을때 가장 적합한 가설 함수는 분홍색 가설 함수이다. 

가장 점으로 찍힌 그래프를 잘 표현하고 있다. 

 

평균 제곱 오차

가설 함수를 평가하기 위해서 가장 많이 쓰이는 방법은 평균 제곱 오차 영어로는 mean squared error이다.

이것은 데이터들과 가설 함수가 평균적으로 얼마나 덜어져 있는지 나타내기 위한 방식이다. 

출처:코드잇

집의 크기 47평을 가설 함수에 넣으면 집 값이 18.8억으로 예측된다. 하지만 이 집의 실제 가격은 22억이다. 오차는 예측 값에서 원래 값을 뺀 것으로. -3.2다.

집의 크기 39평을 가설 함수에 넣으면 가격이 15.6억으로 예측되는데, 실제 가격은 9억이다. 그러면 오차는 6.6이다.

이런 식으로 오차를 다 구할 수 있는데, 이 오차값들을 모두 제곱한 후  그리고 제곱한 값들을 더한다. 그리고 이것의 평균을 내기 위해서 총 데이터 개수 만큼 나누면 된다.

출처:코드잇

평균 제곱 오차가 크다는 건 가설 함수와 데이터들 간의 오차가 크다는 거고, 결국 그 가설 함수는 데이터들을 잘 표현해 내지 못한 것이다.

제곱을 하는이유는 음수일 경우 양수로 변환하기 위해서 그리고 오차가 커질수록 더 부각시키기 위해서이다. 

더 큰 오차에 대해서는 더 큰 페널티를 주기위해서 제곱을 해준다. 

 

손실 함수

손실 함수는 가설 함수를 평가하기 위한 함수이다. 이 함수의 아웃풋이 작을수록 가설 함수의 손실이 적기때문에 더 좋은 가설 함수라고 할수 있다. 반대로 아웃풋이 크면 가설 함수의 손실이 크기 때문에 안좋은 가설 함수라고 할 수 있다.

손실 함수는 J 라는 문자를 쓰고 선형 회귀의 경우 평균 제곱 오차가 손실 함수의 아웃풋이다. 

출처:코드잇

손실 함수 J의 인풋은 세타 이다. 

가설 함수에서 바꿀수 있는건 세타 값들이다. 이 값들을 잘 조율해서 가장 적합한 가설 함수를 찾아내는 것이다. 따라서 손실 함수의 아웃풋은 이 세타 값들을 어떻게 설정하느냐에 달려있다. 따라서 손실 함수의 인풋은 세타이다. 

 

선형 회귀 쉽게 표현하기

출처:코드잇
출처:코드잇
출처:코드잇

학습률 알파

학습률 알파는 경사를 내려갈 때마다 얼마나 많이 그 방향으로 갈건지를 결정하는 변수다.

알파가 너무 큰 경우에는 왼쪽 오른쪽으로 성큼성큼 왔다갔다 하면서 진행이 된다. 심지어는 너무 크면 경사 하강법을 진행할수록 손실 함수 J의 최소점에서 멀어질 수도 있다.

출처:코드잇

너무 작은 경우에는 최소 지점을 찾는게 오래 걸리게 된다. 

출처:코드잇

따라서 적당한 크기로 정하는것이 매우 중요하다. 

학습률이 크면 경사 하강법을 할수록 손실 그래프가 커지고 

출처:코드잇

작을때는 Iteration수가 많아진다. 

출처:코드잇

일반적으로는 1.0 ~ 0.0 사이의 숫자로 정하고, 여러개를 실행해 보면서 경사 하강을 제일 적게 하면서 손실이 잘 줄어드는 학습률을 선택한다.

출처:코드잇

모델 평가하기

모델을 학습시킨 후 모델이 얼마나 좋은지 평가해야한다. 

RMSE root mean square error은 이때 사용된다. MSE에 root 를 한건데 이유는 오차 제곱을 하면 단위가 변하기 때문에 다시 단위를 원래의 단위로 바꾸기 위해 root를 한다. 

training set으로 train 시킨 모델은 training set에서는 당연히 좋은 결과가 나온다. 따라서 우리는 데이터를 분리시켜 test set을 만들고 이 set으로 모델을 평가한다. 

 

범죄울로 집 값 예측하기

# 필요한 라이브러리 import
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

import pandas as pd  

# 보스턴 집 데이터 갖고 오기
boston_house_dataset = datasets.load_boston()

# 입력 변수를 사용하기 편하게 pandas dataframe으로 변환
X = pd.DataFrame(boston_house_dataset.data, columns=boston_house_dataset.feature_names)

# 목표 변수를 사용하기 편하게 pandas dataframe으로 변환
y = pd.DataFrame(boston_house_dataset.target, columns=['MEDV'])

crime = X[['CRIM']]
x_train, x_test, y_train, y_test = train_test_split(crime, y, test_size=0.2, random_state=5)

model = LinearRegression()

model.fit(x_train, y_train)

y_test_predict = model.predict(x_test)
# 테스트 코드 (평균 제곱근 오차로 모델 성능 평가)
mse = mean_squared_error(y_test, y_test_predict)
# RMSE
mse ** 0.5