ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [0328 복습] 머신러닝 성능 평가(회귀 모델, 분류 모델)_MSE, MAE, 혼동행렬, 결정계수, F1-Score, SST, SSR, SSE
    KT 에이블스쿨 복습 2024. 3. 28. 23:07

    **셀프 복습용으로 작성한 것이라 실수가 있을 수 있습니다!

    혹시 실수를 발견하시면 댓글로 알려주시면 감사드리겠습니다 :)

     

    CH1. 회귀 모델 성능 평가

    평가 방법

    • 분류 모델 평가: 0인지 1인지 예측하는 것 (이진분류), 예측값이 실젯값과 많이 같을수록 좋은 모델이라 할 수 있음
      • 정확히 예측한 비율로 모델 성능을 평가 (accuracy_score: 정확도)
    • 회귀 모델 평가: 정확한 값을 예측하기는 사실상 어려움, 예측값이 실젯값에 가까울수록 좋은 모델이라 할 수 있음
      • 예측한 값과 실젯값의 차이(=오차)로 모델 성능을 평가 (mean_absolute_error: 오차)

     

    오차 제곱의 합

    • 오차 제곱(SSE)의 합을 구한 후 평균을 구함 → MSE
    • 오차의 제곱이므로 루트를 사용해 일반적인 값으로 표현 → RMSE

     

    오차 절대값의 합

    • 오차 절대값의 합을 구한 후 평균을 구함 → MAE 
    • 오차 비율을 표시하고 싶은 경우 → MAPE

     

    **그냥 오차의 합을 구하면 0이 되는 경우도 있기 때문에 제곱, 절대값의 합을 구함!

    **MSE, RMSE, MAE, MAPE 네 값 모두 작을수록 모델 성능이 좋은 것!

     

     

    오차를 바라보는 다양한 관점

    • SST: 평균과 실제값의 전체 오차(최소한 평균보다는 성능이 좋아야 함!) → (실제값 - 평균값)^2의 합
    • SSR: 전체 오차 중 회귀식이 잡아낸 오차, 평균과 우리가 예측한 값 사이의 오차! → (예측값 - 평균값)^2의 합
    • SSE: 전체 오차 중 회귀식이 여전히 잡아내지 못한 오차! → (예측값 - 실제값)^2의 합

     

    결정 계수 R2(R-squared)

    • 전체 오차 중에서 회귀식이 잡아낸 오차 비율 (일반적으로 0~1 사이)
    • 오차의 비 또는 설명력이라고도 부름 → 클수록 좋음!
    • 결정 계수가 1이면 MSE = 0이고 모델이 데이터를 완벽하게 학습한 것 

     

     

     

    성능평가 실습_라이브러리 불러오기

    # MAE
    from sklearn.metrics import mean_absolute_error
    
    # MSE
    from sklearn.metrics import mean_squared_error
    
    # RMSE
    from sklearn.metrics import mean_squared_error
    print('RMSE:', mean_squared_error(y_test, y_pred) **0.5)
    # squared=False 옵션도 가능
    print('RMSE:', mean_squared_error(y_test, y_pred, squared=False))
    
    # MAPE
    from sklearn.metrics import mean_absolute_percentage_error
    
    # R2-Score
    from sklearn.metrics import r2_score
    print('R2:', r2_score(y_test, y_pred))  # model.score(x_test, y_test) 와도 같음

     

    • 학습 성능 확인
    # 학습 데이터에 대한 예측
    y_train_pred = model.predict(x_train)
    
    # 학습성능 확인
    print('R2:', r2_score(y_train, y_train_pred))
    
    # 학습성능과 평가성능 비교
    print('학습성능:', model.score(x_train, y_train))
    print('평가성능:', model.score(x_test, y_test))

     

    ** 학습 데이터에 대한 예측은 모델이 과적합되었는지 여부를 판단하는 데 도움

     

    ** 회귀 분석 성능평가는 LinearRegression, r2_score만 보면 됨!

     

    CH2. 분류 모델 성능 평가

    정확도, 정밀도, 재현율

    • 정확도(Accuracy): 1과 0을 정확히 예측한 비율 (0 → 0, 1 → 1 예측한 값) 
    • 정밀도(Precision): 1이라고 예측한 것 중에서 정말 1인 비율 (예측값을 기준)
    • 재현율(Recall): 실제 1인 것을 1이라고 예측한 비율 (실제값을 기준)

     

    혼동 행렬

    • Confusion Matrix(오분류표)

     

     

    • 정확도(Accuracy): 정분류율이라고도 부름! 가장 직관적으로 모델 성능을 확인할 수 있는 평가지표
    • 정밀도(Precision): Positive로 예측한 것 중에서 실제 Positive인 비율
      → 정밀도가 낮을 경우 발생하는 상황
           ex) 비 안 오는데 온다고 해서 우산 챙기는 수고 발생 / 암이 아닌 사람에게 암이라고 해서 치료비 듦
      → 예측한 게 맞아야 하는데, 정밀도가 높은 게 꼭 좋은 것은 아님
      (정밀도를 고려해서 100명 중 5명만 암이라고 했을 때, 정밀도는 높을 수 있지만, 확률이 적은 양성들은 알아낼 수 없음)
    • 재현율(Recall): 실제 Positive 중에서 Positive로 예측한 비율, 민감도라고도 부름→ 재현율이 낮을 경우 발생하는 상황
           ex) 비가 오는 날 안 올 거라해서 우산을 안 챙겨서 비를 맞음 / 암인 사람에게 암이 아니라고 함 (심각한 결과)
    • 특이도(Specificity): 실제 Negative 중에서 Negative로 예측한 비율

     

    민감도와 특이도 개념 정리

    • 코로나 19 검사의 민감도: 98% 이상, 특이도: 100% 인 상황 
    • 음성 → 100% 음성으로 판단됨 (특이도 때문에)
    • 양성 → 음성으로 판단됨 (민감도 98% 때문에, 2%는 양성임에도 음성으로 판단될 수 있음)
    • 양성 → 100% 양성으로 판단됨 (음성이면 100% 음성으로 나오기 때문에!! - 특이도)

    F1- Score

    • 정밀도와 재현율의 조화 평균
    • 분자가 같지만 분모가 다를 경우, 관점이 다른 경우 조화 평균이 큰 의미를 가짐
    • 정밀도와 재현율이 적절하게 요구될 때 사용

     

    분류 성능평가 실습_라이브러리 불러오기

    # Confusion Matrix
    from sklearn.metrics import confusion_matrix
    print(confusion_matrix(y_test, y_pred))
    
    # 혼동행렬 시각화
    sns.heatmap(confusion_matrix(y_test, y_pred),
               annot=True,
               cbar=False,
               cmap='Blues')
    plt.show()

     

    # Accuracy
    from sklearn.metrics import accuracy_score
    
    #Precision
    from sklearn.metrics import precision_score
    # 성능 평가 (기본적으로 0,1 중 1에 대한 Precision이 출력)
    print('Precision Score:', precision_score(y_test, y_pred))
    
    # 0,1에 대한 Precision 모두 출력
    print('Precision Score:', precision_score(y_test, y_pred, average=None)) #권고
    print('Precision Score:', precision_score(y_test, y_pred, average='binary')) #디폴트값
    print('Precision Score:', precision_score(y_test, y_pred, average='macro'))  #매크로 
    print('Precision Score:', precision_score(y_test, y_pred, average='weighted'))  #가중치 평균

     

     

    # Recall
    from sklearn.metrics import recall_score
    
    # F1-Score
    from sklearn.metrics import f1_score
    print('F1 Score:', f1_score(y_test, y_pred, average=None))
    
    # Classification Report
    from sklearn.metrics import classification_report

    macro avg(산술평균), weighted avg(가중치 평균)

    # 참고 -> 평가성능은 f1 스코어의 accuracy와 같게 나타남
    # 학습성능과 평가성능이 차이가 많이 나면 과적합임
    print('학습성능:', model.score(x_train, y_train))
    print('평가성능:', model.score(x_test, y_test))
Designed by Tistory.