인공지능 공부

[2021 NIPA AI 교육 - 응용 / 머신러닝] 03 지도 학습 - 회귀

koh1018 2021. 8. 21. 13:40
반응형

오늘은 회귀에 대해 배워보겠다.

 

먼저 회귀의 개념에 대해 먼저 알아보겠다.

 

우리 스스로를 아이스크림 가게를 운영하는 주인이라고 가정해보자.

판매용 아이스크림을 구입할 때 예상되는 실제 판매량 만큼만 주문할 수 있다면 더 좋을 것이다.

이 때 만약 평균 기온을 활용해 미래 판매량을 예측할 수 있을까?

 

 

그러면 문제를 정의하고 어떤 해결방안이 있는지 보도록 하겠다.

평균 기온과 판매량은 선형적인 관계를 가지고 있다고 가정하겠다.

한쪽이 늘면 한쪽도 늘고 한쪽이 줄면 한쪽이 줄어드는 것과 같이 같은 경향성을 보이는 것을 선형적인 관계라고 한다.

(한쪽이 늘 때 한쪽은 감소하고 한쪽이 줄 때 한쪽은 증가할 때도 선형적인 관계라고 할 수 있다.)

 

보면 Xfeature 데이터고 Ylabel 데이터이다.

따라서 이는 지도학습이다.

근데 보면 Y 데이터들의 값은 수치형 데이터로 되어있다.

 

이렇게 수치형 데이터로 되어있는 값은 회귀 분석이라는 알고리즘을 이용해서 풀 수 있다.

 

 

그렇다면 회귀 분석이란 무엇일까?

label 데이터가 수치형일 때 이를 예측하는 알고리즘이 회귀 분석이다.

 

평균 기온이 X, 아이스크림 판매량이 Y일 때 둘을 각각 x, y축에 놓고 점들을 찍으면 오른쪽 그래프와 같이 점들을 찍을 수 있다.

이 데이터를 가장 잘 설명할 수 있는 모델을 만든다는 것이다.

여기서는 빨간색 직선으로 이 데이터를 설명할 수 있도록 그었다.

 

이 빨간색 선을 수식적으로 표현하면

와 같이 표현할 수 있다.

B0, B1는 각각 직선을 구성하는 y절편과 기울기이다.

 

이 선을 이용해서 새로운 평균 기온이 들어온다면 그에 따른 아이스크림 판매량을 예측할 수 있다.

 

그렇다면 여기서 가장 중요한 것은 이 직선을 어떻게 그리느냐이다.

 

우리가 풀어야 할 문제는 적절한 B0, B1 값을 찾는 것이다.

 

그렇다면 이 적절한 B0, B1값을 어떻게 찾는지 알아보겠다.

직선이 데이터를 완벽하게 예측할 순 없다.

그래도 최대한 비슷하게 예측할 수 있어야한다.

 

단순 선형 회귀 모델을 학습하면 차이를 최소한으로 하는 선을 찾게 된다. (B0, B1 을 찾게 된다.)

 

위에서 왼쪽 직선과 같이 예측값과 실제 정답의 차이가 적을수록 좋다.

 

 

왼쪽 그래프를 가지고 오른쪽 표와 같이 실제값과 예측값의 차이를 구할 수 있다.

이 값이 적을수록 예측을 더 잘한다는 의미일 것이다.

 

이렇게 실제값 예측값의 값들을 구하고 나면 이 구한 차이들을 다 비교해야 할 것이다.

그래서 합계를 구했다.

 

이렇게 합계로 구한 것이 적당한 비교 기준이 될까?

생각해 볼 필요가 있다.

 

 

보면 왼쪽 선에 비해 오른쪽 선이 더 좋은 예측을 보여준다.

하지만 둘의 실제값 예측값의 합계 값은 똑같이 0 이다.

이 예시를 통해 실제값 예측값의 합계를 비교 기준으로 삼는 것은 좋지 못하다는 것을 알 수 있다.

 

 

그렇다면 실제값 예측값의 차이의 제곱의 합을 비교 기준으로 삼는 것은 어떨까?

그럼 아까와 같은 예외가 발생하지 않는다.

그래서 실제값 예측값의 차이의 제곱의 합을 비교 기준으로 삼는다.

 

이 값이 작으면 작을수록 좋은 모델이라고 할 수 있을 것이다. (0이 가장 좋은 모델)

 

 

 

이 실제값 예측값의 차이의 제곱의 합을 Loss 함수라고 정의한다.

이를 수식적으로 표현하면 위와 같다.

 

Loss 함수 식을 간략히 설명하자면, 실제값에서 예측값을 뺀 뒤 이를 제곱해서 나온 N개의 값들을 모두 더한 것을 N으로 나누어 평균 낸 것이다. (, Loss 함수가 작으면 작을수록 좋은 모델)

 

 

그러면 이제 Loss 함수를 어떻게 하면 줄일 수 있을지 생각해보겠다.

 

Loss 함수를 줄인다는건 B0, B1을 잘 조절한다는 것이다.

, 기울기와 y절편을 잘 조절하는 것이다.

 

 

argmin이란 앞의 Loss 함수의 값을 가장 작게 만드는 B0, B1을 구한다는 의미이다.

즉 위의 ‘Loss 함수의 크기를 작게 하는 B0, B1를 찾는 방법을 수식으로 표현한 것이다.

 

이것을 푸는 방식은 여러 가지 방식이 있다.

대표적으로 Gradient descent라는 경사 하강법이 있고 Normal equation이 있다.

 

이 방법중에서 우리는 경사 하강법에 대해 간단히 배울 것이다.

(경사 하강법은 딥러닝에서도 굉장히 연관이 많은 기법이다.)

 

 

경사 하강법은 초기 B0, B1값에서 계속 업데이트를 해 나가며 점진적으로 구해나가 Loss 함수 값을 가장 작게하는 B0, B1값을 구하는 방식이다.

 

 

Gradient 값은 어떻게 해야 Loss 값을 줄일 수 있게 하는지에 대해 힌트가 되는 값이다.

(B0, B1 각각에 대응되는 값이 나온다.)

 

Gradient 값을 어떻게 구하는지는 지금 당장 얘기하진 않을 것이다.

(간단히 말하면 Loss 값을 B0, B1에 대해서 편미분하면 나온다.)

 

위와 같이 Gradient 값을 사용해서 Loss 값을 줄인다. (예시)

 

2,3,4번 과정을 계속 반복하며 Loss 값을 줄인다.

 

 

 

앞서 살펴본 것을 좀더 시각화해서 보겠다.

위와 같이 Gradient 값을 통해 Loss값을 점점 줄여 나간다.

 

그래서 결국 맨 아래 근처의 Loss 값이 0과 가까운 위치에 도달하게 된다.

이렇게 밑으로 하강하기 때문에 경사 하강법이라고 부르는 것이다.

 

 

지금까지 한 과정들을 한눈에 살펴보겠다.

 

 

이제 마지막으로 단순 선형 회귀의 특징을 살펴보겠다.

입력값이 1개인 경우에만 적용이 가능하다는 아쉬운 점이 있다.

 

 


 

 

실습 예제 1 데이터 전 처리)

기계학습 라이브러리 scikit-learn을 사용하면 Loss 함수를 최솟값으로 만드는 B0, B1을 쉽게 구할 수 있다.

 

주어진 데이터를 sklearn에서 불러 올 선형 모델에 적용하기 위해서는 전 처리가 필요하다.

 

sklearn에서 제공하는 LinearRegression을 사용하기 위한 데이터 전 처리를 수행해보겠다.

 

LinearRegression 모델의 입력값으로는 PandasDataFramefeature (X) 데이터와 Series 형태의 label (Y) 데이터를 입력 받을 수 있다.

(X, Y의 샘플의 개수는 같아야 한다.)

 

1. X 데이터를 column 명이 XDataFrame으로 변환하고 train_X에 저장하라.

2. 리스트 YSeries 형식으로 변환하여 train_Y에 저장하라.

 

 

:

 

 

실행 결과 :

 

 

 

실습 예제 2 - 학습하기)

[실습1]에서 전 처리한 데이터를 LinearRegression 모델에 입력하여 학습을 수행하라.

 

LinearRegression을 사용하기 위해서는 우선 해당 모델 객체를 불러와 초기화해야한다.

lrmodel = LinearRegression()

 

모델 초기화를 수행했다면 전 처리된 데이터를 사용하여 학습을 수행할 수 있다. 아래코드와 같이 fit 함수에 학습에 필요한 데이터를 입력하여 학습을 수행한다.

lrmodel.fit(train_X, train_Y)

 

LinearRegression의 B0, B1값을 구하기 위해서는 아래 코드를 사용하여 구할 수 있다.

beta_0 = lrmodel.intercept_

beta_1 = lrmodel.coef_[0]

 

 

:

 

 

실행 결과 :

 

 

 

실습 예제 3 예측하기)

[실습2]의 학습한 모델을 바탕으로 예측 값을 구하라.

 

LinearRegression을 사용하여 예측을 해야한다면 아래와 같이 predict() 함수를 사용

pred_X = lrmodel.predict(X)

predict() 함수는 DataFrame 또는 numpy arrayX 데이터에 대한 예측값을 리스트로 출력한다.

 

 

:

 

 

실행 결과 :

 

 

 

 


 

 

 

 

이번에는 다중 선형 회귀에 대해 배워보겠다.

 

이번에도 문제를 하나 가정하고 시작하겠다.

단순 선형 회귀에서 입력값 X에 강수량이 추가된다면 어떡해야할까?

 

이렇게 여러개의 입력값으로 예측을 할 때는 다중 선형 회귀를 이용해야 한다.

 

 

다중 선형 회귀 모델의 경우 각 개별 X에 해당하는 최적의 계수를 찾아야한다.

 

이 다중 선형 회귀 모델도 단순 선형 회귀 모델과 마찬가지로 선형 관계를 가정한다.

 

다중 선형 회귀 모델의 Loss 함수도 단순 선형 회귀와 마찬가지이다.

 

 

예를 들어서 하나를 보겠다.

위에서 Loss 함수는 543.94에 데이터의 개수 4를 나눈 135.985가 된다.

 

 

다중 선형 회귀 모델도 단순 선형 회귀 모델과 마찬가지로 경사 하강법을 쓴다.

2~4 과정을 반복하며 Gradient 값을 활용해 Loss 값을 줄인다.

 

 

마지막으로 다중 선형 회귀의 특징을 살펴보겠다.

여러 개의 입력값으로 결과값을 예측할 수 있다는 것이 단순 선형 회귀와의 차이점이다.

또 입력값들의 계수의 크기를 비교하여 어떤 입력값이 예측값에 더 큰 영향력을 갖는지 알 수 있다.

 

그리고 여러 개의 입력값에 대해서 이들의 상관관계가 높을 경우 결과에 신뢰성이 낮아질 수 있다. , 입력값끼리는 서로 독립 사건이어야 좋다는 것이다.

 

 


 

 

실습 예제 1 데이터 전 처리)

다중 회귀 분석(Multiple Linear Regression)은 데이터의 여러 변수(features) X를 이용해 결과 Y를 예측하는 모델이다.

 

마케터들에게는 광고 비용에 따른 수익률을 머신러닝을 통해서 예측할 수 있다면 어떤 광고 플랫폼이 중요한 요소인지 판별할 수 있을 것이다.

 

아래와 같이 FB, TV, Newspaper 광고에 대한 비용 대비 Sales 데이터가 주어졌을 때, 이를 다중 회귀 분석으로 분석해보라.

 

우선 데이터를 전 처리 하기 위해서 3개의 변수를 갖는 feature 데이터와 Sales 변수를 label 데이터로 분리하고 학습용, 평가용 데이터로 나눠보라

 

 

1. DataFrame으로 읽어 온 df에서 Sales 변수는 label 데이터로 Y에 저장하고 나머진 X에 저장한다.

2. train_test_split를 사용하여 X, Y를 학습용 : 평가용 = 8:2학습용:평가용=8:2 비율로 분리한다. (random_state=42는 고정한다.)

 

 

:

 

 

실행 결과 :

 

 

 

 

실습 예제 2 학습하기)

[실습1]에서 전 처리한 데이터를 바탕으로 다중 선형 회귀 모델을 적용한다.

 

다중 선형 회귀 모델의 형태는 아래 수식과 같다.

여기서 X1은 페이스북, X2TV, X3은 신문 광고를 의미한다.

 

다중 선형 회귀 또한 선형 회귀 모델과 같은 방식으로 LinearRegression을 사용할 수 있다.

 

학습용 데이터를 다중 선형 회귀 모델을 사용하여 학습하고, 학습된 파라미터를 출력하라.

 

 

참고 :

LinearRegressionbeta와 같은 파라미터들은 아래 코드와 같이 구할 수 있다.

lrmodel = LinearRegression()

lrmodel.intercept_

lrmodel.coef_[i]

intercept_는 B0에 해당하는 값이고, coef_[i]i+1 번째 변수에 곱해지는 파라미터 값을 의미한다.

 

 

1. 다중 선형 회귀 모델 LinearRegression을 불러와 lrmodel에 초기화하고 fit을 사용하여 train_X, train_Y데이터를 학습하라.

2. 학습된 모델 lrmodel에서 beta_0, beta_1, beta_2, beta_3에 해당하는 파라미터를 불러와 저장하라.

 

 

:

 

 

실행 결과 :

 

 

 

 

실습 예제 3 예측하기)

[실습2]에서 학습한 다중 선형 회귀 모델을 바탕으로 이번엔 새로운 광고 비용에 따른 Sales 값을 예측하라.

 

LinearRegression을 사용하여 예측을 해야한다면 아래와 같이 predict() 함수를 사용

pred_X = lrmodel.predict(X)

 

1. lrmodel을 학습하고 test_X의 예측값을 구하여 pred_X에 저장하라.

2. lrmodel을 학습하고 주어진 데이터 df1의 예측값을 구하여 pred_df1에 저장하라.

 

 

:

 

 

 

 


 

 

 

 

 

지금까지 회귀 알고리즘을 배웠다.

이제 이 회귀 알고리즘을 어떻게 평가할 수 있는지 알아보도록 하겠다.

회귀 알고리즘 평가는 실제 값과 예측 값의 차이에 기반한 평가 방법을 사용한다.

(Loss 함수와 비슷한 형태라고 생각하면 된다.)

 

 

제일 기본적인 RSS부터 배워보도록 하겠다.

RSS는 단순 오차라고 하는데, 실제값 예측값의 제곱들의 합이다.

거의 Loss와 비슷하게 생겼다. Loss에서 1/N이 빠졌다고 생각하면 된다.

 

RSS는 가장 간단해서 직관적으로 해석이 가능하다.

근데 데이터의 값이 작으면 오차값도 작고 데이터의 값이 커지면 오차값도 커질 수 있다. 때문에 크기에 의존적이라는 단점이 있다. (데이터의 범위 자체가 작으면 거기서 계산되는 오차 값도 작을 수밖에 없다.)

그래서 객관적인 비교가 힘들 수 있다. 이 말이 절대적인 값과 비교가 불가능하다는 말이다.

 

, 이 수치가 작다고해서 마냥 좋은 모델이라고 말하기 어렵다는 것이다.

 

 

 

다음으로 MSE, MAE라는 두 가지 지표에 대해서 보도록 하겠다.

MSE는 그냥 Loss 이다. 식도 똑같다.

 

사실 Loss는 줄여야 되는 값이라는 형태적 의미만 있을 뿐 이 Loss는 다양한 표현이 가능하다.

회귀에서는 이 MSE를 대응해서 사용했지만 분류나 다른 형식에서는 새로운 방식에 대응이 될 수 있다.

(, MSE는 지표, Loss는 모델에서 줄여야 하는 값)

 

 

다음으로 MAE가 있다.

이것은 오차의 절댓값의 평균이다.

 

 

이제 이들의 특징을 살펴보겠다.

MSEMAE에 비해 이상치에 민감하다. (MSE는 제곱을 하기 때문에)

이것들도 RSS 와 마찬가지로 간단하고 직관적인 해석이 가능하다는 장점이 있지만 입력 값의 크기에 의존적이고 절대적인 값과 비교가 어렵다는 단점이 있다.

 

 

이러한 단점들을 해결해 줄 수 있는 것이 바로 R^2(결정 계수)이다.

1에 가까울수록 높은 성능의 모델이며 앞서 본 RSS, MSE, MAE와 달리 절대적인 비교가 가능하다.

 

TSS는 위와 같이 평균에서의 차이고 RSS는 예측값(일차 직선)과의 차이다.

당연히 TSSRSS보다 클 수밖에 없다.

 

만약 예측을 잘해서 RSS가 거의 0에 가깝게 나온다면 1-RSS/TSS의 값은 1에 가까워 질 것이다. 따라서 1에 가까울수록 높은 성능의 모델이라고 할 수 있다.

 

 

 

다음으로 R^2의 특징에 대해 살펴보겠다.

 

 


 

 

실습 예제 1 MSE, MAE)

앞에서 했던 실습 예제에 이어서 Sales 예측 모델의 성능을 평가하기 위해서 다양한 회귀 알고리즘 평가 지표를 사용하여 비교하라.

 

MSEMAE는 아래와 같이 정의할 수 있고 sklearn 라이브러리 함수를 통하여 쉽게 구할 수 있다.

(N은 전체 샘플의 개수)

 

 

MSE, MAE 평가 지표를 계산하기 위한 사이킷런 함수/라이브러리 :

MSE 값 계산하기 : mean_squared_error(y_true, y_pred)

MAE 값 계산하기 : mean_absolute_error(y_true, y_pred)

(첫 번째 인자는 실제값, 두 번째 인자는 예측값을 넣는다.)

 

 

1. train_X 데이터에 대한 MSE, MAE 값을 계산하여 MSE_train, MAE_train에 저장하라.

2. test_X 데이터에 대한 MSE, MAE 값을 계산하여 MSE_test, MAE_test에 저장하라.

 

 

:

 

 

실행 결과 :

 

 

 

실습 예제 2 R2)

[실습1] 에 이어서 Sales 예측 모델의 성능을 평가하기 위해서 다양한 회귀 알고리즘 평가 지표를 사용하여 비교해보라.

 

R2 score 는 아래와 같이 정의할 수 있고 sklearn 라이브러리 함수를 통하여 쉽게 구할 수 있다.

 

(N은 전체 샘플의 개수를 의미한다.)

 

 

R2 평가 지표를 계산하기 위한 사이킷런 함수/라이브러리 :

R2 score 값 계산하기 : r2_score(y_true, y_pred)

(첫 번째 인자는 실제값, 두 번째 인자는 예측값을 넣는다.)

 

1. train_X 데이터에 대한 R2 값을 계산하여 R2_train에 저장하라.

2. test_X 데이터에 대한 R2 값을 계산하여 R2_test에 저장하라.

 

 

:

 

 

 

실행 결과 :

 

반응형