관리 메뉴

DeseoDeSeo

[Machine Learning] 선형 모델(회귀) 평가 지표 및 데이터 스케일링 본문

Python

[Machine Learning] 선형 모델(회귀) 평가 지표 및 데이터 스케일링

deseodeseo 2023. 9. 13. 18:06

⛧ 선형모델(회귀) 평가 지표

     : 여러 머신러닝 모델들을 사용했을 때 성능지표를 보고 모델을 비교하고 판단함.

( 정량적인 지표가 중요 )

 

MSE(Mean Squared Error) :  0 ~ 무한대

                                                 ➜ 예측 값과 실제 값의 차이에 대한 제곱을 평균한 값.

 

<  MSE를 기준으로 R2 score를 사용   score >

R2 score :  결정계수, 회귀 모델이 데이터에 얼마나  잘 맞는지 평가하는데 사용됨.

                                                 ➜ 모델의 독립변수에 의해 설명되는 종속변수의 분산 비율

                                                       ( 1에 가까울 수록 완벽하게 맞는 것. )

                                                         -1 : 모델이 설명을 잘 못하는 경우

                                                          1 : 모델이 잘 설명한 경우, 모델이 좋다고 판단됨.

 

규제(Regularization) 선형 모델

   : 선형모델의 과적합을 방지하기 위한 방법

                      과적합된 모델 ➜ 너무 복잡하게 적용되어 일어남. 따라서 현재 특성을 줄이거나 특성들의 영향력을

                                                   최소화하는 방법 필요. 

규제를 적용시킨 모델

○ LinearRegression 모델이 가지고 있는 단점 : 모델이 잘 못 되었을 경우 , 수정 안 됨 ➜ 규제를 가해서 단점해소

⛧ 규제 : 선형모델에서 가중치(w)에 영향을 주는 것 ( 모델에 개입을 한다. )

☑ 과적합된 모델 : 특성⬆  분산 편향 ↓ 
☑ 과소적합된 모델 : 분산 ↓  편향
 따라서,
분산 정도를 줄여주기 위해 특성치들은 규제하여 사용한다.
➤ 규제는 정규화 !
규제 선형모델에는 대표적으로 Ridge, Lasso가 있음.
Ridge :  L2를 규제. ( LinearRegression(손실함수) + L2 Norm )이 최소가 되도록 함.
            - L2 Norm값 앞에 alpha값을 부여해 조절하여 사용.  alpha값은 사람이 직접 조절.
            - 모든 원소에 골고루 규제를 적용해 0에 가깝도록 만듬.
Lasso :  L1을 규제. ( 손실함수 + L1 Norm) 이 최소가 되도록 함.
            -  L1Norm값 앞에 alpha 값을 부여해 조절하여 사용.    " "
            - 가중치의 모든 원소에 똑같은 힘으로 규제하기 때문에 특정 계수는 0이 될 수 있다. 
                ( ➜ 특성 선택이 이루어짐)
alpha:  alpha값이 너무 작으면 과대적합(복잡도가 너무 큼) 
           alpha값이 너무 크면과소적합( 복잡도가 너무 작음)

✔ L1 규제 : 벡터의 모든 성분의 절대값을 더한 것

✔ L1 규제 : 도착점까지의 직선거리 유클리드 계산법으로 계산.

 

from sklearn.linear_model import Lasso,Ridge
# 하이퍼파라미터(alpha) 튜닝

def ridge_alpha(alpha):
    # ridge 모델 생성
    ridge = Ridge(alpha=alpha)  # alpha 기본값: 1.0 -무한대(마이너스 무한대) ~ 무한대
                                # 일반적으로 사용하는 값의 범위: 0.001 ~ 1000
    # 학습
    ridge.fit(X_train, y_train)
 
    # 결과 확인 - 훈련용 데이터와 검증용 데이터
    print('train_score: ', ridge.score(X_train,y_train))
    print('test_score: ', ridge.score(x_test, y_test))
# alpha 값을 증가시키겠다➜ 규제를 늘리겠다. = > 모델이 복잡해지는 것을 막겠다.( 과대적합일 때 사용)
ridge_alpha(1)

# alpha 값을 감소 => 규제를 줄이겠다 = 모델이 단순해지는 것을 막겠다.( 과소적합일 때 사용)
ridge_alpha(0.1)

 ○ 규제를 줄이니까 ( alpha 값 감소)  test_score 상승 

 ○ 과대 적합보다는 과속적합 or 일반화에 가까운 상황

 ○ 모든 가중치(w)에 특정한 %(비율)만큼의 규제를 가함 ➜ 0에 가깝게는 되지만 0이 되지 않음. 

 ○ 규제를 많이 가하더라도 전체 가중치를 사용

 ○ 전체 데이터가 골고루 중요할 때 사용하는 주제.

 

Lasso 활용
import numpy as np
def lasso_alpha(alpha):
    # lasso 모델 생성
    lasso = Lasso(alpha=alpha)  # alpha 기본값: 1.0 -무한대(마이너스 무한대) ~ 무한대
                                # 일반적으로 사용하는 값의 범위: 0.001 ~ 1000
    # 학습
    lasso.fit(X_train, y_train)
 
    # 결과 확인 - 훈련용 데이터와 검증용 데이터
    print('train_score: ',lasso.score(X_train,y_train))
    print('test_score: ', lasso.score(x_test, y_test))
    # 사용한 특성의 수 확인
    print('사용한 특성의 수: ', np.sum(lasso.coef_ !=0))
lasso_alpha(0.001)

lasso_alpha(0.1)

lasso_alpha(0.01)

 ○ 현재 전체 특성의 수:  104

 ○  규제항을 변경할 때 마다 사용되는 특성의 수도 확인

○ 규제(증가)를 적용할 수록 test score값이 낮아짐.

○ 규제를 적용할 수록 사용하는 특성의 수도 감소.

○ 모든 w에 특정 값만큼의 규제를 가함(상수)

○ 가중치가 0이 되서 사용하지 않는 특성이 생김 ➜ 특성 선택에 활용됨.

      ➜ 가중치가 -(마이너스, 음수)가 되면 0으로 처리함.

○ 특정 데이터가 중요할 때 사용.

 

데이터 스케일링

   : 데이터전처리 마지막에 사용( 결측치가 없는 상태에서 사용! 이상치는 있어도 됨! )

 

 < 종류>

  • StandardScaler
    • 변수의 평균, 분산을 이용해 정규분포 형태로 변환(평균0, 분산1)
  • MinMaxScaler
    • 변수의 최대값 1로, 최소값을 0으로 하여 변환(0~1 사이 값으로 변환)
    • 데이터가 비정규분포인 경우에 사용
    • 이상치(outlier)에 크게 영향 -> 이상치가 있는 경우 사용 못함.
  • RobustScaler
    • 사분위 수를 활용 - 변수의 25%지점을 0으로 75%지점을 1로 하여 변환
    • 이상치가 있는 경우 사용
  • Normalizer
    • 특성 벡터의 유클리디안 길이가 1이 되도록 조정(지름이 1인 원에 투영)
    • 특성 벡터의 길이는 상관없고 데이터의 방향(각도)만 중요할 때 사용.
from sklearn.preprocessing import StandardScaler 
standard = StandardScaler() 
x.head() # 문제(x)가 가지고 있는 범위 확인
standard.fit(x)

# 문제(x)의 기준으로 변환
x_trans = standard.transform(x)
x_trans # 변환된 스케일링을 적용하여 훈련과 평가데이터 다시 분리하기.