데이터 한 그릇

회귀) 단순 선형 회귀를 통한 회귀 이해 본문

머신러닝/회귀

회귀) 단순 선형 회귀를 통한 회귀 이해

장사이언스 2021. 4. 16. 16:47
  • 회귀 소개
  • 단순 선형 회귀를 통한 회귀 이해
  • 비용 최소화하기 - 경사 하강법(Gradient Descent) 소개
  • 회귀 평가 지표

회귀 소개

 

 

  통계학 용어를 빌리면, 회귀는 여러 개의 독립변수와 한 개의 종속변수 간의 상관관계를 모델링하는 기법을 칭한다. 예를 들어서 아파트의 방의 수, 방의 크기, 주변 학군 등에 따라서 아파트의 가격이 결정이 되는 경우, 종속변수는 아파트의 가격이라고 할 수 있으며 방의 수 , 방의 크기, 주변 학군은 독립변수라고 할 수 있다.

 

  회귀 모델의 확정적 모델같은 경우에는 y= ax와 같은 식으로 표현이 가능하다. 앞선 아파트의 가격 예시를 통해 확정적 모델을 만들면 y=ax1(방의 크기) + bx2(방의 수) + cx3(주변 학군) + b 라고 할 수 있다. 하지만 현실 세계에서 이와 같은 모델로 아파트의 가격을 예측하기란 한계가 존재한다. 왜냐하면 이 모델을 통해서 아파트의 가격을 설명할 수 없는 부분이 존재하기 때문이다. 따라서 우리는 확정적 모델 이외의 다른 모델을 고안할 필요가 있다. 이떄 대체적인 모델을 확률적 모델이라고 부른다. 확률적 모델은 확정적 모델과 다르게 오차항을 포함하고 있다. 만일 오차항이 z라고 했을 때, 확률적 모델에 z항을 추가한다. 이렇게 만들어진 모델에서 각 독립변수의 계수를 회귀 계수(Regression coefficient) 라고 부른다. 이때 머신러닝 회귀 분석에서 가장 주목하는 점이 종속변수를 가장 잘 설명할 수 있는 독립변수의 회귀 계수를 구하는 것이다. (최적의 회귀 계수를 구하기)

 

  회귀의 종류는 회귀 계수의 선형성/비선형성 그리고 독립변수의 개수, 종속변수의 개수에 따라서 나뉜다. 밑의 표는 이를 나타낸다.

 

독립변수의 개수 회귀 계수의 결합
1개 : 단일 회귀 선형 : 선형 회귀
여러 개 : 다중 회귀 비선형 :  비선형 회귀

 

  또한 지도학습의 머신러닝에서 회귀는 분류와 다른 특징을 가지고 있다. 분류 머신러닝 같은 경우에는 종속변수가 범주형 데이터이며 회귀 머신러닝 같은 경우 종속변수가 구간데이터이다. 예를 들어서 코로나 바이러스의 양성, 음성 여부가 종속변수로 있을 경우, 그리고 양성인지 음성인지 예측을 하는 경우는 분류 머신러닝을 사용하며, 아파트의 가격을 종속변수로 두고 아파트의 가격을 예측하는 경우에는 회귀 분류머신러닝을 사용한다.

 

  회귀 분석의 종류 중에서 가장 많이 사용되는 회귀 분석은 선형 회귀이다. 선형 회귀는 실제값과 예측값의 오차를 최소화 하는 방향으로 직선형 회귀선을 최적화하는 방식이다. 즉, 아파트 가격에 대한 직선식을 예측했다면 실제 데이터 값들과 직선식간의 오차를 최소화하면서 예측한 직선식을 최적의 모델로 수정해가는 방식이다.

 

  회귀의 종류가 다양한 것처럼 선형 회귀의 종류 또한 선형 회귀의 규제 방식에 따라서 나뉜다. 밑은 선형 회귀의 규제에 따른 종류를 나열한 것이다.

 

  1. 일반 선형 회귀 : 예측값과 실제 값의 RSS를 최소화할 수 있도록 회귀 계수를 최적화하며 규제를 적용하지 않음
  2. 릿지 : 릿지 회귀는 선형 회귀에서 L2 규제를 추가한 모델, L2규제는 상대적으로 큰 회귀 계수 값의 예측 영향도를 감소시키기 위해서 회귀 계수값을 더 작게 만드는 규제 모델 (상대적으로 큰 회귀 계수를 줄이는 규제)
  3. 라쏘 : 라쏘 회귀는 선형 회귀에서 L1 규제를 추가한 모델, L2규제가 회귀 계수의 값을 줄이는 데 반해, L1규제는 예측 영향력이 적은 회귀 계수를 0으로 지정하여 회귀 예측 시 제외시키는 규제이다. (영향력이 적은 계수를 제외)
  4. 엘라스틱넷 : L2, L1 규제를 함께 결합한 모델, L1규제로 피처의 개수를 줄이고 L2규제로 계수 값의 크기를 조정
  5. 로지스틱 회귀 : 일반적으로 분류 방식으로 많이 사용

 

  선형 회귀의 종류의 가장 기초적인 기반은 일반 선형 회귀 모델이라고 할 수 있다. 일반 선형 회귀 모델은 예측식과 실제 값과의 RSS를 최소화 하는 방향으로 회귀 계수를 최적화하는 방식이라고 할 수 있으며, 일반 선형 회귀 모델에 L1을 추가하면 라쏘 선형 회귀 모델이 되고 L2를 추가하면 릿지 선형 회귀 모델이 되며 L1, L2를 결합하면 엘라스틱넷 회귀 모형이 된다.

 


단순 선형 회귀를 통한 회귀 이해

 

  단순 선형 회귀는 독립변수가 하나이며 그 독립변수의 계수가 선형인 회귀 모델을 말한다. 단순 선형 회귀 모델은 종속 변수 하나이며, 독립변수도 하나이다. 단순 선형 회귀 모델 같은 경우 그 구성은 종속변수 항과 독립변수 항 그리고 오차항을 포함한다. 이때 실제값과 예측값의 차이를 잔차(Residual) 라고 부른다. 최적의 회귀 모델을 만든다는 것은 오차항의 값이 작은 값이 나오도록 회귀 계수를 최적화 한다는 것을 의미한다.

 

  이때 오류값은 +가 나올 수도 있고 -가 나올 수도 있다. 따라서 실제 오차값에 대한 왜곡이 생기지 않게 절댓값을 취하거나 제곱을 시켜줘야만 한다. 이때 많이 사용되는 방식은 오류값에 제곱을 취해서 다 더하는 방식이며 이 값을 RSS라고 부른다. (RSS는 비용이라고도 부름) RSS를 구하는 식을 독립변수와 종속변수에 관한 함수가 아니라 회귀계수와 절편에 관한 식으로 만들 수 있다. 우리는 앞서 선형 회귀 모델이 RSS를 최소화 하는 모델임을 살펴봤다. 따라서 RSS를 최소화 할 수 있는 방법을 찾아야 한다. 


비용 최소화하기 - 경사 하강법(Gradient Descent) 소개

 

  앞서 RSS에 관한 식은 회귀계수와 절편으로 나타낼 수 있음을 살펴봤다. 그렇다면 어떻게 하면 RSS를 최소화 시키는 회귀계수를 결정지을 수 있을까? 이때 사용하는 방식이 경사 하강법이다. 경사 하강법은 '점진적으로' 반복적인 계산을 통해 W 파라미터 값을 업데이트하면서 오류 값이 최소가 되는 W 파라미터를 구하는 방식이다. 만일 최초의 RSS값이 나온다면 그 값을 줄이는 회귀 계수(W) 를 수정한다. 만일 회귀 계수를 수정하여 RSS값이 줄어들었다면 다시 한번 W값을 수정을 한다. 이때 만일 줄어들었다면 같은 작업을 계속 반복하는 것이고 줄어들지 않았다면 회귀 계수를 결정하여 반환한다. 즉, 최초 RSS 값에서 회귀 계수를 연속적으로 조작하여 최적의 모델을 만드는 과정을 경사 하강법이라고 할 수 있다.

 

  그렇다면 구체적으로 경사 하강법이 어떻게 진행되는지 살펴보도록 하자. 먼저 RSS가 회귀계수 (W1)과 절편(W0) 으로 이루어진 함수로 나타낼 수 있음을 살펴봤다. RSS가 최소가 되기 위해서는 이 함수를 미분해야만 한다. 하지만 변수가 두 개이기 때문에 편미분을 사용해야만 한다. 즉, W1과 W0 각각에 미분을 적용해야만 한다. W1과 W0에 미분을 적용하게 되면 각각 하나의 식이 나오게 된다. 이 나온 식 각각을 보정 계수를 곱한 식으로 수정한다. 이렇게 하여 도출된 식들을 이용하여 최적의 W1과 W0을 찾게 된다.

  먼저 W1,W0을 임의의 값으로 설정하고 첫 비용 함수의 값을 계산한다.(임의의 W1,W0과 그에 따른 최초의 RSS값) 그리고 앞서 구한 W1과 W0에 대한 각각의 식을 이용하여 W1과 W0을 업데이트한다. 이때 이전의 W1,W0에 대하여 편미분하여 나온 식을 빼기를 하여 업데이트 한다. 만일 W1과 W0을 업데이트 하여 RSS값이 줄어들게 되었다면 다시 이전 단계를 반복하게 되고 만일 줄어들지 않았다면 현재의 W1과 W0값으로 W1과 W0값을 결정한다.


회귀 평가 지표

 

  분류 머신러닝 같은 경우에도 평가 지표가 존재 했듯이(ACCURACY, RECALL, PRECISION, F1, AUC_SCORE) 회귀 머신러닝 같은 경우에도 평가 지표가 존재한다. 바로 MAE, MSE, RMSE, R^2 이다.

 

평가 지표 설명
MAE Mean Absolute Error이며 실제 값과 예측 값의 차이를 절대 값 취한 값을 전부 더하여 평균을 낸 것
MSE Mean Squared Error이며 실제 값과 예측 값의 차이를 제곱한 값을 모두 더하여 평균을 낸 것(오차제곱평균)
RMSE MSE가 제곱을 하여 크게 나와 모델의 성능을 왜곡할 수 있기 때문에 오차 값을 줄이기 위해서 루트를 씌운 것
R^2 분산 기반으로 예측 성능을 평가한 것, 예측값의 분산과 실제값의 분산을 나누어서 계산한다. 1이 가까울수록 예측 정확도가 높은 것

보스턴 주택 가격 예측 데이터를 통해서 단순 선형 회귀를 구축해 봤다.

 

boston = load_boston()
boston_df = pd.DataFrame(boston.data, columns = boston.feature_names)
boston_df['Price'] = boston.target

y_target = boston_df['Price']
x_data = boston_df.drop('Price', axis = 1, inplace=False)
x_train, x_test, y_train, y_test = train_test_split(x_data, y_target, test_size = 0.3, random_state = 11)

 

보스턴 데이터를 사이킷런에서 로딩하고 학습용 데이터와 테스트 데이터로 나누었다.

 

linear = LinearRegression()
linear.fit(x_train, y_train)
y_preds = linear.predict(x_test)

 

모델 객체를 생성하고 분할된 데이터를 통해서 학습을 시킨 후 결과 값을 도출했다.

 

mse = mean_squared_error(y_test, y_preds)
rmse = np.sqrt(mse)

print('mse : {:.3f}, RMSE : {:.3f}'.format(mse, rmse))
print('Variance score : {:.3f}'.format(r2_score(y_test,y_preds)))
print('절편값 : {:.3f}'.format(linear.intercept_))
print('회귀 계수값  : ', np.round(linear.coef_,1))

 

앞서 살펴봤던 회귀 분석의 평가 지표인 MSE와 RMSE 그리고 R2을 통해서 모델을 평가했다.

 

coeff = pd.Series(data = np.round(linear.coef_,1), index = x_data.columns)
coeff.sort_values(ascending = False)

 

선형회귀 객체에서 사용되는 coef_ 함수로 회귀계수를 살펴봤다.

 

from sklearn.model_selection import cross_val_score

y_target = boston_df['Price']
x_data = boston_df.drop('Price', axis = 1, inplace = False)
linear = LinearRegression()

neg_mse_scores = cross_val_score(linear, x_data, y_target, scoring="neg_mean_squared_error", cv=5)
mse_score = -1 * neg_mse_scores
rmse_scores = np.sqrt(-1 * neg_mse_scores)
avg_rmse = np.mean(rmse_scores)

 

교차 분석을 통해서 회귀 분석을 해봤다. 교차 분석을 하면서 평가를 할 지표는 mean_squared_error로 설정하였다. 하지만 코드에 neg_mean_squared_error로 지정한 이유는, cross_val_score같은 경우 평가 지표가 높게 나오면 좋은 모델이라는 뜻을 가지고 있는데, 회귀 모델 같은 경우에는 값이 클수록 예측력이 좋지 않은 모델을 뜻하기 때문이다. 따라서 -1을 붙여주어서 값을 계산한다. 나온 각각의 fold의 평가 값들에 -1을 다시 곱하여 양수로 만들어준다. 이렇게 계산하게 되면 cv=5의 개수에 맞게 5개의 올바른 평가 값이 나오게 된다. 이 값들의 평균을 구하여 모델을 평가할 수 있다.

 

Comments