본문 바로가기
Study/ML

9. 회귀(Regression) - 선형회귀

by 까망우동 2023. 5. 31.
반응형

Index

    ● Linear Regression 개요

    • 회귀(Regression)모델의 가장 큰 구분은 ①독립변수의 개수에 따라 단일회귀/다중회귀  ② "회귀계수"의 종류에 따라 선형회귀/비선형회귀로 구분된다. (비선형 회귀와 다항회귀를 혼동하면 안된다). 
    • 선형회귀는 피쳐와 라벨간에 선형적인 관계가 있다고 가정하고 최적의 선형함수를 탐색한다. (실제는 선형적 관계가 아닐수 있음에도) 
    • 회귀모델은 오류(=Cost=Loss function ; residual, RSS, MAE, MSE 등으로 측정)를 최소화하는 회귀계수 혹은 회귀선을 찾는것을 목적으로 한다. 
    • 최적의 회귀계수를 찾는 대표적인 방법론 : Gradient Descent (경사하강법). Gradient는 Cost를 parameter(회귀계수)에 대해 편미분 한것이고. Cost 가 줄어드는 Negative Gradient 방향으로 Parameter를 지속 업데이트한다. OLS(일반선형회귀)는 최적 회귀선 찾는게 쉬워 굳이 Gradient Descent 를 사용하진 않는다. 
    • Gradient Descent 방식에도 여러가지가 있는데, 주로 Stochastic Gradient Descent (≒ mini batch gradient) 방식 : 전체 데이터셋을 batch 단위로 나누어 실행 (300,000 records of data = 100 batches of 3000 size = 1 epoch)
    • 선형회귀는 특정 독립변수의 회귀계수가 너무 크게되는 것을 방지하기위해 (overfitting 방지 목적으로) Regularization을 적용하는데, 적용방식에 따라 크게 OLS(기본), Lasso(L1), Ridge(L2), ElasticNet(L1+L2)로 구분한다. 
    • 다중 회귀모델은, multi-collinearity problem(다중공선성문제) 즉, 종속변수간의 높은 상관관계가 존재할때 생기는 문제 해결이 매우 중요하다. 이를위해 변수간에 ①PCA 등 차원축소 전처리가 진행되며, ②Regularization 도 어느정도 다중 공선성을 해결한다. 
    • 다중공선성의 문제점? y = 자동차 사고확률 , x1=혈중 알콜농도, x2=운전자 음주량 이라고 하면 x1/x2 의 상관계수가 1에 가깝기 때문에 메 학습마다 x1,x2의 회귀계수의 합만 일정하게 비율은 항상 크게 다를수 있다. 즉 계수에 대한 표준오차가 크다는것을 의미하고 통계적으로 회귀모델 유의성이 떨어지고 그만큼 해석력이 부족하고 과적합되기 쉽다 (모두 같은 의미) 

     

    ● 회귀 평가지표 

    회귀의 평가지표는 여러가지가 있겠지만,, 주로 많이 쓰이는것은 아래와 같다. MAE 는 보다 직관적인 장점이 있고 Root 를 씌우는 이유는 MSE에서 제곱하며 커진 크기를 맞춰주기 위함 

     

    ● 다항회귀 (Polynomial Regression) 

    • 회귀식의 하나이상의 독립변수가 다항식(2차이상)으로 표현되는 모델
    • 다항회귀도 선형회귀(Linear) 이다. (비선형은 회귀계수와 변수의 관계가 비선형인것 : 예를들어  x 가 e의 지수로 들어가거나 sin함수 안에 들어가있거나..) 
    • 다항회귀가 선형회귀의 연장인것은 다항 독립변수를 치환할 수 있기 때문이다. (ex. x1*x2 = z1 , x1*2 = z2)
    • 사이킷런은 다항회귀 클래스가 없어서 PolynomialFeature 클래스를 이용해 단항피처를 다항으로 변환해서 사용한다.

    X = np.arange(4).reshape(2,2)
    print('일차 단항식 계수 feature:\n',X )
    # 3 차 다항식 변환
    poly_ftr = PolynomialFeatures(degree=3).fit_transform(X)
    print('3차 다항식 계수 feature: \n',poly_ftr)

     

    • 사이킷런의 pipeline 객체를 이용해 피쳐 다항변환과 회귀모델 학습을 순차 결합하기
        from sklearn.preprocessing import PolynomialFeatures
        from sklearn.linear_model import LinearRegression
        from sklearn.pipeline import Pipeline

        def polynomial_func(X):
            y = 1 + 2*X[:,0] + 3*X[:,0]**2 + 4*X[:,1]**3
            return y

        # Pipeline 객체로 Streamline 하게 Polynomial Feature변환과 Linear Regression을 연결
        model = Pipeline([('poly', PolynomialFeatures(degree=3)),
                        ('linear', LinearRegression())])
        X = np.arange(100).reshape(50,2)
        y = polynomial_func(X)

        model = model.fit(X, y)
        print('Polynomial 회귀 계수\n', np.round(model.named_steps['linear'].coef_, 2))
            결과값 : Polynomial 회귀 계수 [ 0. 0.2 0.2 0.93 1.13 1.32 -0.59 0.34 1.46 2.79]

        # 정합성 확인
        y_pred = model.predict(X)
        mse = mean_squared_error(y, y_pred)
     
    • 다항회귀 문제에서 변수의 차수(degree)가 클수록 overfit 되는 경향이 있고, 작을수록 underfit 되는 경향이 있다. 트리 모델에서의 depth 와 비슷한 느낌이다. 

    ● 규제 선형모델 (Regularized Linear Models) - Ridge, Lasso, ElasticNet

    • 기존의 Cost Function 에서는 RSS의 최소화(Bias)만 고려하기 때문에 과적합(Variance)을 방지하기위한 장치로 Regularization 이 필요하다. (모든 예측모델은 Bias - Variance 균형이 필요하다) 
    • Regularization은 아래와 같이 비용함수에 W 크기에 대한 penalty를 부여함으로서 과적합을 방지한다. 
    • alpha 계수를 조정함으로서 Bias-Variance tradeoff 를 조정한다. 

    1. Ridge 릿지 회귀 (L2) 

    • Ridge 회귀모델은 Regularization term 에 W^ (제곱)을 사용하는 규제 회귀모델이다. 
    • alptha 계수를 바꿔가며 교차검증 수행하는 코드. 데이터 사이즈가 크다면 Ridge(solver='sag'와 같이 gradient 방식으로 해를 찾을 수도 있다. 
    from sklearn.linear_model import Ridge
    # 릿지에 사용될 alpha 파라미터의 값을 정의
    alphas = [0, 0.1, 1, 10, 100, 3000]

    # alphas list 값을 반복하면서 alpha에 따른 평균 rmse를 구함.
    for alpha in alphas :
        ridge = Ridge(alpha = alpha)  
       
        # cross_val_score를 이용해 5 폴드의 평균 RMSE를 계산
        # 사이킷런의 모델 학습은 score 가 높은걸 목표로 학습하기에 MSE 에 negative 적용
        neg_mse_scores = cross_val_score(ridge, X_data, y_target, scoring="neg_mean_squared_error", cv = 5)
        avg_rmse = np.mean(np.sqrt(-1 * neg_mse_scores))
        print('alpha {0} 일 때 5 folds 의 평균 RMSE : {1:.3f} '.format(alpha, avg_rmse))

     

    2. Lasso 라쏘 회귀 (L1) 

    • Lasso 회귀모델은 Regularization term 에 |W| (절대값)을 사용하는 규제 회귀모델이다. 
    • Ridge와의 비교: Ridge는 계수의 크기를 최대한 줄이는 방향인 반면, Lasso 는 불필요한 계수는 완전히 0 으로 만드는 Feature selection 에 가까운 모델이다. 

     

    3. ElasticNet 엘라스틱넷 회귀 (L1+L2) 

    • ElasticNet 회귀모델은 L1,L2 규제를 결합한 형식의 회귀모델이다. 
    • 상관관계가 높은 피쳐들중에 중요 피쳐만 선택하는 방식으로, 다중 공선성문제가 큰 데이터에 유리하다. 
    • 파라미터는 alpha(L1,L2 가중치의 합), l1_ratio (L1 alpha / L1 + L2 alpha) 
    반응형

    댓글