데이터분석 study/ML_ 심화

TIL_24.08.20_ 회귀 알고리즘 복습

justdata 2024. 8. 20. 16:44

 ●  단순선형회귀

   - 하나의 독립변수와 하나의 종속변수 사이의 관계를 모델링 

 

 ●  다중선형회귀

   - 여러 개의 독립 변수와 하나의 종속 변수 사이의 관계를 모델링

 

* 위에 이미지 결과 해석공부

  1. 회귀 방정식 : y= 2.94x + 2.56
       - 기울기(coeficient)가 2.94로, x가 1단위 증가할 때 y는 평균적으로
         2.94 단위 증가
       - y 절편(intercept)은 2.56으로 x가 0일 때 y의 예측값

  2. R-squared 값 :  0.87
      - 이 모델이 데이터의 변동성을 87% 설명한다는 뜻
      - 상당히 좋은 적합도를 보여줌.

  3. 평균 제곱 오차(Mean Squared Error) : 0.07
      - 예측값과 실제값 간의 차이가 작아 모델의 예측 정확도가 높음
  
   4. 그래프 해석 : 
       - 파란 점들은 실제 데이터,빨간 선은 예측 모델을 나타냄
       - 대부분의 점들이 예측선 주변에 밀집해 있어 모델이 데이터를 
         잘 설명하고 있음을 보여줌

결론 :  모델은 x와 y 사이의 강한 양의 선형 관계를 잘 포착하고 있으며, 
            예측 성능도 우수한 것으로 보임

 

R-squared

 

     1. 설명력 :

         - 통계적으로 '설명력'은 독립변수가 종속변수의 변동을 

           얼마나 잘 설명하는지를 나타낸다.

         - 이는 총 변동 (SST) 중 회귀 모델로 설명되는 변동(SSR)의 

           비율을 의미

 

      2. R-squared (r^2) :

           - 공식 : SSR/SST = 1 - (SSE / SST)

           - SSE : 오차 제곱합 (Sum of Squared Errors)

           - SST : 총 제곱합(Total Sum of Squares)

           - SSR : 회귀 제곱합 (Regression Sum of Squares)

               R² = 1 - Σ(y_i - ŷ_i)² / Σ(y_i - ȳ)²

              여기서 y_i는 실제값, ŷ_i는 예측값, ȳ는 y의 평균

 

       3. R-squared 해석 : 

           - R² = 1 : 모델이 데이터의 모든 변동을 완벽하게 설명 (이상적인 경우)

           - R² = 0 : 모델이 데이터의 변동을 전혀 설명하지 못함(평균으로 예측하는 것과 동일)

           - 0 < R² < 1 : 모델이 데이터의 일부 변동을 설명함. 클수록 설명력이 높음

 

       4. 주의 사항 : 

           1) R-squared는 독립변수가 추가될 때마다 증가하는 경향이 있어,

               불필요한 변수 추가를 억제하지 못함

           2) 이를 보완하기 위해 Adjusted R-squared를 사용하기도 함

           3) R-squared가 높다고 해서 반드시 좋은 모델은 아님. 

               다른 평가 지표와 함께 고려해야 함

 

              * R-squared는 모델의 전반적인 적합도를 평가하는데 유용하지만

                다른 평가 지표 (예 : MSE, RMSE, MAE 등)와 함께 사용하여 모델의 성능을 

                종합적으로 평가하는 것이 좋음

 

 

MSE(Mean Squared Error)

     

    1. 정의 :

        - 회귀 모델의 예측 오차를 측정하는 지표

        - 실제 값과 예측 값 차이의 제곱을 평균한 값

 

    2. 공식 :

        MSE = (1/n) * Σ(y_i - ŷ_i)²

        여기서 n은 데이터 포인트의 수

 

    3. 구성 요소 : 

        - 오차(Error) : y_i  -  ŷ_i (실제값 - 예측값)

        - 제곱오차 (Squared Error) : (y_i - ŷ_i)²

        - 평균 (Mean) : 모든 제곱 오차의 합을 데이터 포인트 수로 나눔

 

    4. MSE 해석 : 

        - MSE = 0 : 모델이 데이터를 완벽하게 예측 (이상적인 경우)

        - MSE > 0 : 값이 작을수록 모델의 예측이 정확함 

        - 단위는 종속변수의 제곱 단위

 

    5. 특징:

        - 항상 비음수 값을 가짐

        - 이상치에 민감함 (제곱 때문에 큰 오차가 강조됨)

        - 모델 간 비교 시 유용하지만 , 절대적인 기준은 아님

 

    6. 관련 지표 : 

        - RMSE (Root Mean Squared Error) : MSE의 제곱근 

        - MAE(Mean Absolute Error) : 절대 오차의 평균

 

    7. 주의 사항 : 

         1) 단위가 제곱되어 있어 직관적인 해석이 어려울 수 있음

         2) 이상치에 민감하므로 데이터 전처리가 중요함

         3) 다른 데이터 셋이나 다른 단위의 모델과 직접 비교하기 어려움

 

   8. 사용 : 

       - 모델 훈련 과정에서 최소화해야 할 손실 함수로 자주 사용됨

       - 모델의 예측 정확도를 평가하는 데 사용 됨

       - 다른 평가 지표 (R-squared, MAE 등)와 함께 사용하여 종합적인 평가 필요

 

     * MSE는 모델의 예측 오차를 직접적으로 측정하는 유용한 지표이지만

        단독으로 사용하기 보다는 다른 평가 지표와 함께 사용하여

         모델의 성능을 종합적으로 평가하는 것이 좋음

 

 

선형회귀를 위한 이상적인 EDA

     1. 데이터 품질 확인

     2. 변수 간 관계 탐색

     3. 데이터 분포 확인

     4. 다중 공선성 검토

 

      1. 데이터 품질확인

         - info() : 데이터 타입 확인

         - isnull().sum() : NAN 값 체크

         

       2. 변수 간 관계 탐색

         - df.corr()로 변수 간 상관관계 행렬을 계산

         - seaborn의 heatmap으로 상관관계를 시각화

         -  변수들 간의 상관관계를 색상으로 표현한 히트맵을 보여줌

 

       3. 데이터 분포 확인 > 변환 시키기

           -  모든 변수에 대해 히스토그램과 KDE(커널 밀도 추정) 플롯을 그림

           -  4x4 그리드에 각 변수의 분포를 시각화

           - 각 변수의 분포 형태를 확인할 수 있음

             (KDE : 확률 밀도 함수를 추정하는 비모수적 방법)

 

       예시코드)

plt.figure(figsize=(12, 10))
for i, column in enumerate(df.columns):
    plt.subplot(4, 4, i+1)
    sns.histplot(df[column], kde=True)
    plt.title(column)
plt.tight_layout()
plt.show()

 

         

         ● 대표적인 변환 방법 (standardscaler, minmaxscaler 제외)

             1. 로그 변환

                 - 왼쪽이나 오른쪽으로 치우친 분포에 효과적

 

          예시 코드)

df['CRIM_log'] = np.log1p(df['CRIM'])
df['ZN_log'] = np.log1p(df['ZN'])

 

              2. RobustScaler : 

                  - 중앙값과 IQR을 사용하여 아웃라이어에 덜 민감한 스케일링을 수행

 

              예시 코드)

from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
df['AGE_robust'] = scaler.fit_transform(df[['AGE']])

             

 

              3.  제곱근 변환(Square Root Transformation) : 

                   - 로그 변환보다 약한 효과를 준다.

 

              예시 코드)

df['RAD_sqrt'] = np.sqrt(df['RAD'])

 

 

              * 이외에도 변환 방법이 다양하니 찾아보면서 데이터에 맞게 적용하기

 

 

         4. 다중공선성 검토

            - VIF(Variance Inflation Factor)를 계산하여 다중공선성을 평가

            -  y값을 제외한 모든 변수에 대해 VIF를 계산

            - 각 독립변수의 VIF 값을 출력, 높은 VIF 값은 다중공선성을 나타냄

 

VIF : 다중 공선성 측정하는 통계적 방법

1. VIF의 정의 : 
    VIF = 1 / (1 - R²)
    여기서 R²은 해당 변수를 다른 모든 독립변수로 회귀분석했을 때의 결정계수

2. 계산 과정 : 
     1) 한 독립변수를 선택하여 종속변수로 설정
     2) 나머지 독립변수들을 사용하여 회귀분석을 수행
     3) 이 회귀 분석의 R²을 구한다
     4) VIF =1 / (1 - R²) 공식을 적용
     5) 모든 독립변수에 대해 이 과정을 반복

3. 해석:
    - VIF = 1 : 다중공선성 없음
    - VIF > 1 : 변수들 간 상관관계 존재
      * 일반적인 기준
        - VIF < 5 : 문제 없음
        - 5 < VIF < 10 : 약간의 다중공선성 우려
        - VIF > 10 : 심각한 다중공선성 문제

4. 의미 : 
    - VIF는 다른 변수들과의 상관관계로 인해 해당 변수의 분산이
      얼마나 팽창되었는지 나타냄
   - 높은 VIF는 해당 변수가 다른 변수들과 강한 선형관계를 가짐을 의미

5. 해결 방안 :
    - 변수제거 : VIF가 가장 높은 변수부터 순차적으로 제거해보기
    - 주성분 분석(PCA) : 고차원의 데이터를 저차원으로 축소
    - 정규화/표준화 : 변수들의 스케일 조정
    - 변수 변환 :  로그 변환 등을 통해 선형성 개선
 
6. 추가 고려사항 : 
     - 모든 변수가 중요하다면, 릿지 회귀나 라쏘 회귀 같은 정규화 기법을 고려해볼 수 있다.
     - 도메인 지식을 활용하여 중요 변수 선별이 필요할 수 있다.

 

 

* 그 다음에는 종속변수와 독립변수들의 산점도를 이용하여 관계를 시각화

 

▶ 선형회귀 모델링

     1) 기본적으로 데이터 로드 및 전처리 

     2) 데이터 분할

     3) 스케일링 

         - y_train, y_test는 스케일링 하지 않기, x_train, x_test 데이터만 진행 

      4) 기본 선형회귀 모델 적용하고 성능 평가

      5)  계수확인

      6)  특성 제거, 선택, 추가:

 

           ● RFE (Recursive Feature Elimination)방식 : 

              - 방법 :  RFE는 반복적으로 특성의 중요도를 평가하고 가장 중요하지 않은 

                           특성을 제거하는 과정을 거침

              - 성능향상 이유 :  

                 * 불필요한 특성을 제거하여 모델의 복잡성을 줄임

                 * 가장 중요한 특성만을 선택하여 노이즈를 줄이고 

                    모델의 일반화 능력을 향상 

                 * 오버피팅 위험을 감소

 

           

           ● Lasso를 사용한 특성 선택 : 

              - 방법 :  Lasso회귀는 L1 정규화를 사용하여 덜 중요한 특성의 계수를 0으로 만듦

              - 성능향상 이유 :  

                 * 자동으로 특성 선택을 수행하여 중요한 특성만 남김

                 * 모델의 복잡성을 줄이고 해석 가능성을 높임

                 * 다중공선성 문제를 해결하는데 도움이 됨

 

         

            ● 다항 특성 추가 : 

              - 방법 :  기존 특성들의 2차항과 상호작용항을 추가

              - 성능향상 이유 :  

                 * 비선형 관계를 포착할 수 있어 모델의 표현력이 증가

                 * 특성 간의 상호작용을 고려 

                 * 복잡한 패턴을 학습할 수 있어 더 정확한 예측 가능 

     

                 

 

       7) 모델 바꿔서 성능 측정

            ex) RandomForest 사용 

                 

              - 방법 :  여러 개의 결정 트리를 생성, 그 결과를 평균내는 앙상블 기법

              - 성능향상 이유 :  

                 * 비선형 관계를 잘 포착할 수 있음

                 * 특성 간의 상호작용을 자동으로 고려함

                 * 앙상블 효과로 인해 과적합을 줄이고 일반화 성능이 향상

                 * 이상치에 강건

 

       8) 교차검증 

         

            - 방법 :  데이터를 여러 부분으로 나누어 반복적으로 학습과 검증을 수행

              - 성능향상 이유 :  

                 * 모델의 일반화 성능을 더 정확하게 추정

                 * 과적합 여부를 판단하는 데 도움이 됨

                 * 데이터 분할에 따른 편향을 줄일 수 있다.

             

 # 단계마다 데이터 특성과 도메인에 따른 다양한 방법들이 있으니

     그것에 맞는 방법 적용해보면서 성능 측정해보기