KT 에이블스쿨 복습
[0328 복습] 머신러닝 성능 평가(회귀 모델, 분류 모델)_MSE, MAE, 혼동행렬, 결정계수, F1-Score, SST, SSR, SSE
리니끄적
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
# 참고 -> 평가성능은 f1 스코어의 accuracy와 같게 나타남
# 학습성능과 평가성능이 차이가 많이 나면 과적합임
print('학습성능:', model.score(x_train, y_train))
print('평가성능:', model.score(x_test, y_test))