ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 회귀 ( Regression ) - 1
    Python Machine Learning/회귀 2020. 8. 15. 19:24

    회귀란?

    - 지도학습의 대표적 유형이 분류와 회귀입니다. 이 둘의 차이는 분류는 예측값이 카테고리와 같은 이산형 클래스이며

      회귀는 연속형 숫자 값입니다.

    - 여러 개의 독립변수와 한 개의 종속변수 간의 상관관계를 모델링하는 기법을 통칭하며 예를 들어 아파트의 방 개수,

      방의 크기, 주변 학군등 여러 개의 독립변수에 따라 아파트 가격이라는 종속변수가 어떤 관계를 나타내는지를 모델링

      하고 예측하는 것입니다. ( 독립변수에 영향을 미치는 회귀계수라는 것이 존재합니다. )

    - 머신러닝 관점에서 보면 독립변수는 피처에 해당되며 종속변수는 결정 값입니다. 즉 머신러닝 회귀 예측의 핵심은

      주어진 피처와 결정 값 데이터 기반에서 학습을 통해 최적의 회귀 계수를 찾아내는 것입니다.

    - 회귀 계수의 선형/비선형 여부, 독립변수의 개수, 종속변수의 개수에 따라 여러 가지 유형으로 나눌 수 있으며 

      회귀 계수에 따라 선형 회귀와 비선형 회귀로 나눌 수 있으며, 독립변수가 한 개인지 아닌지에 따라 단일, 다중 회귀로

      나눌 수 있습니다.

     

    선형 회귀

    1. 일반 선형 회귀 : 예측값과 실제값의 RSS( Residual Sum of Squares )를 최소화할 수 있도록 회귀 계수를 최적화하며

                             , 규제를 적용하지 않은 모델.

    2. 릿지( Ridge )   : 선형 회귀에 L2규제를 추가한 회귀 모델. L2규제는 상대적으로 큰 회귀 계수 값의 예측 영향도를 감

                             소시키기 위해서 회귀 계수값을 더 작게 만드는 규제 모델.

    3. 라쏘( Lasso )   : 선형 회귀에 L1규제를 적용한 회귀 모델. L1규제는 예측 영향력이 작은 피처의 회귀 계수를 0으로 

                             만들어 회귀 예측 시 피처가 선택되지 않게 하는 것.

    4. 엘라스틱넷( ElasticNet )  : L2, L1 규제를 함께 결합한 모델로 주로 피처가 많은 데이터 세트에 적용되며, L1규제로 

                                         피처의 개수를 줄임과 동시에 L2규제로 계수 값의 크기를 조정합니다.

    5. 로지스틱 회귀( Logistic Regression ) : 분류에 사용되는 선형 모델로 매우 강력한 분류 알고리즘입니다.

     

    1. 단순 선형 회귀

    - 독립변수도 하나, 종속변수도 하나인 선형 회귀를 단순 선형 회귀라고 합니다. 예를 들면 주택의 크기가 크면 가격이

      높아지는 경향을 말합니다.

    - 실제 값과 회귀 모델의 차이( 예측값 )에 따른 오류 값을 남은 오류, 즉 잔차라고 부르는데 최적의 회귀모델을 만든다는

      것은 바로 전체 데이터의 잔차( 오류 값 ) 합이 최소가 되는 모델을 만든다는 것으로 동시에 오류 값 합이 최소가 될 수

      있는 최적의 회귀 계수를 찾는다는 의미가 있습니다.

    - 오류 합을 계산할 때는 절대값을 취해서 더하거나 ( mean absolute error ), 오류 값의 제곱을 구해서 더하는 방식

      RSS( residual sum of square )을 취하며 주로 RSS방식으로 오류 합을 구합니다 ( Error^2 = RSS )

    - RSS는 독립변수 X, 종속변수 Y가 중심 변수가 아니라 W변수가 중심 변수이며 즉 회귀 계수를 학습을 통해서 찾는

      것이 머신러닝 기반 회귀의 핵심 사항입니다.

    - 회귀에서 RSS는 비용이며 W변수( 회귀 계수 )로 구성되는 RSS를 비용 함수라고 합니다. 머신러닝 회귀 알고리즘은 이 

      비용함수가 반환하는 값 ( 오류값 )을 더 이상 감소하지 않는 최소의 오류 값을 구하는 것입니다.

     

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

    - w변수가 많으면 고차원 방정식을 동원하더라도 해결하기가 어렵기 때문에 경사하강법은 고차원 방정식에 대한 문제를

      해결해 주면서 비용 함수 RSS를 최소화하는 방법을 제공하는 방식입니다 즉 경사하강법은 반복적인 계싼을 통해 W변

      수 값을 업데이트하면서 오류 값이 최소가 되는 W변수를 구하는 방식입니다.

    - 회귀식 Y=4X+6을 근사하기 위한 100개의 데이터 세트, 여기에 경사 하강법을 이용해 회귀계수 W0을 6에 가까운 값,

      W1을 4에 가까운 값으로 도출하는 파이썬 코드를 구현해 보겠습니다.

     y = 4X + 6 식을 근사(w1=4, w0=6). random 값은 Noise를 위해 만들고 X, y 데이터 셋 scatter plot으로 시각화

    --> 데이터는 회귀식을 중심으로 무작위로 퍼져있으며 이제 경가 하강법을 이용해 Y=W1X+W0에 해당하는 W1과 W0을

         구해보겠습니다. 경사 하강법을 이용한 단순 선형 회귀는 W1과W0을 모두 0으로 초기화한 뒤 특정 횟수만큼 반복하

         면서 W1과W0을 업데이트하는 것입니다.

     

    w0과 w1의 값을 최소화 할 수 있도록 업데이트 수행하는 함수 생성

    --> 업데이트할 값을 구하는 함수인 get_weight_update( )를 생성하며 w1_update, w0_update를 각각 w1, w0의

         shape와 동일한 크기를 가진 0 값으로 초기화합니다.

    --> X값에 대한 예측 배열 y_pred는 np.dot( X, W1.T ) + W0으로 구하는데 100개의 데이터가 있다면 예측값은

         W0+X(1)*W1 + ~ + X(100)*W1이며, 이는 입력 배열X와 W1배열의 내적과 동일합니다. 따라서 np.dot( X, w1.T ) 

         + W0로 예측 배열값을 계산하고 예측과 실제 값의 차이를 계산합니다. ( np.dot( X, w1.T )+ W0는 새로운 W1식을

         나타내는 식 )

    --> w1과 w0을 업데이트할 w1_update와 w0_update 계산하고 w0_update를 dot 행렬 연산으로 구하기 위해 

         모두 1값을 가진 행렬을 생성합니다.

     

    반복적으로 경사 하강법을 이용하여 get_weigth_updates()를 호출하여 w1과 w0를 업데이트 하는 gradient_descent_steps( ) 함수 생성.

    --> 입력 인자 iters로 주어진 횟수만큼 반복적으로 w1과 w0을 업데이트 적용하려고 w0,w1을 모두 0으로 초기화하고

         입력한 인자만큼 get_weight_updates( ) 함수를 호출해 w1,w0 업데이트를 수행하는 gradient_descent_steps( ) 함수

         를 생성합니다.

     

    예측 오차 비용을 계산을 수행하는 함수 생성 및 경사 하강법 수행

    --> gradient_descent_steps( ) 함수를 호출해 최종적으로 예측값과 실제값의 RSS차이를 계산하는 get_cost( ) 함수를

         생성하고 경사 하강법의 예측 오류도 계산해본 결과 실제 선형식인 y= 4X+6과 유사하게

         w1은 4.022, w0은 6.162가 도출되었고 예측 오류 비용은 약 0.9935입니다.

     

    y_pred에 기반한 회귀선 시각화

    ==> 회귀선이 잘 만들어졌지만 일반적으로 경사 하강법은 모든 학습 데이터에 대해 반복적으로 비용함 수 최소화를

           위한 값을 업데이트하기 때문에 수행 시간이 매우 오래 걸린다는 단점이 항상 존재합니다.

           그러기 때문에 확률적 경사 하강법( Stochastic Gradient Descent )를 이용하며, 이 방식은 전체 입력 데이터가 

           아닌 일부 데이터만 이용해 w가 업데이트되는 값을 계산하므로 비교적 빠른 속도를 보장하기때문에 대용량의 

           데이터의 경우 확률적 경사 하강법이나 미니 배치 확률적 경사 하강법을 이용해 최적 비용함수를 도출합니다.

     

    ( 미니 배치 ) 확률적 경사 하강법

    - stochastic_gradient_descent_steps( ) 함수로 구현하며 전체 X,y 데이터에서 랜덤하게 batch_size만큼 데이터를 추출해

      이를 기반으로 w1_update, w0_update를 계산하는 부분에서 경사 하강법과 차이가 존재합니다.

    stochastic_gradient_descent_steps( )함수 구현

    --> 전체 X, y 데이터에서 랜덤하게 batch_size만큼 데이터 추출하여 sample_X, sample_y로 저장하고 랜덤하게

         batch_size만큼 추출된 데이터 기반으로 w1_update, w0_update 계산 후 업데이트를 수행합니다.

     

    stochastic_gradient_descent_steps( )를 이용해 w1,w0 및 예측 오류 비용을 계산

    ==> 확률적 경사 하강법으로 구한 w0,w1 결과는 경사 하강법으로 구한 w1,w0dhk 큰 차이가 없으며 예측 오류 비용

           또한 0.9937로 경사 하강법으로 구한 예측 오류 비용과 거의 유사한 것으로 보아 큰 예측 성능상의 차이가 없음을

           알 수 있습니다. 따라서 큰 데이터를 처리할 경우에는 시간이 적게 걸리는 확률적 경사 하강법을 이용합니다.

     

Designed by Tistory.