Performance metrics 통해 정확도, 재현율, 정밀도, F1 score 등을 구해서 모델의 성능을 평가할 수 있다.
Performance metrics은 밑의 표이다.
모델이 예측한 결과가 양성(positive)인지, 음성(negative)인지 / 실제 값(label)이 참(Ture)인지, 거짓(False)인지에 따라서 Performance metrics 에서 속한 값이 달라진다.
예를 들어 모델이 음성이라고 예측했는데 실제로 값이 음성이어서 예측한 결과가 참이라면 그것을 TN(True Negative)라고 부른다.
즉 양성으로 예측했는데 맞았다면 - TP
음성으로 예측했는데 맞았다면 - TN
양성으로 예측했는데 틀렸다면 - FP
음성으로 예측했는데 틀렸다면 - FN
이 Performance metrics를 통해 여러가지 성능평가 지표를 얻을 수 있다.
F1 score는 정밀도와 재현율을 모두 고려한 지표이다.
이 지표들은 각각 다른 상황에서 사용된다.
예를 들어 은행거래에서 옳은 거래를 0(음성)이라고 가정할 때, 은행 거래 시스템에서 옳은 거래로 판단하고 송금했지만 그것이 잘못된 거래였을때 중요한 것은 음성으로 예측했는데 틀린 상황(FN)이다.
따라서 이러한 상황에서는 FN이 반영되는 재현율을 중요하게 생각하고 시스템을 짜야하는 것이다.
### Performance metrics를 보기 위해 훈련한 모델 ###
사이킷런의 암 데이터셋 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_breast_cancer # 암 데이터 셋
from sklearn.linear_model import LogisticRegression
cancer = load_breast_cancer()
x=pd.DataFrame(cancer.data)
y=pd.Series(cancer.target)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x.values,
y.values,
test_size=0.3,
random_state=1234)
# 훈련데이터 분리
from sklearn.linear_model import LogisticRegression
final_model = LogisticRegression(penalty='l1', # L1 규제 사용
C=100,
solver='liblinear', # 알고리즘 종류
max_iter=5000).fit(x_train, y_train)
pred_train = final_model.predict(x_train)
pred_test = final_model.predict(x_test)
pred_test
|
cs |
### Performance metrics 보기 ###
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score
# Performance metrics를 사용하기 위한 라이브러리
confusion = confusion_matrix(y_test, pred_test) # Performance metrics
acc = accuracy_score(y_test, pred_test) # 정확도
prc = precision_score(y_test, pred_test) # 정밀도
rec = recall_score(y_test, pred_test) # 재현율
f1s = f1_score(y_test, pred_test) # F1 score
print('<Confusion matrix>')
print(confusion)
'''
<Confusion matrix>
[[ 60 6]
[ 2 103]]
'''
print(f'Accuracy:{acc:.2f}, Precision: {prc:.2f}, Recall: {rec:.2f}, F1-score: {f1s:.2f}')
'''
Accuracy:0.95, Precision: 0.94, Recall: 0.98, F1-score: 0.96
'''
|
cs |
### Performance metrics를 사용한 지표를 보여주는 보고서 ###
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from sklearn.metrics import classification_report
# Performance metrics를 사용한 지표를 모두 보여주는 보고서 라이브러리
report = classification_report(y_test, pred_test)
print(report)
'''
precision recall f1-score support
0 0.97 0.91 0.94 66
1 0.94 0.98 0.96 105
accuracy 0.95 171
macro avg 0.96 0.95 0.95 171
weighted avg 0.95 0.95 0.95 171
'''
|
cs |
### thresholds를 이용해서 정밀도와 재현율 비교 ###
thresholds : 임계값, 분류기준
임계값을 기준으로 class가 양성인지 음성인지를 구분한다. 디폴드 값은 0.5이다.
예를 들어 임계값이 0.7일 때 0.6이었던 데이터는 임계값이 디폴트였을 때는 양성으로 구분되었다가 임계값이 높아지면서 음성으로 구분되었다. 즉 임계값이 높아질수록 더 깐깐하게 분류한다.
이러한 thresholds를 바꿔가면서 그래프를 그려보면(x축에 놓고) 정밀도와 재현율 사이의 관계를 알 수 있는 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from sklearn.metrics import precision_recall_curve
# 정밀도와 재현율을 비교하기 위한 그래프 그리기 라이브러리
precisions, recalls, thresholds = precision_recall_curve( y_test,
final_model.predict_proba
(x_test)[:, 1])
# thresholds : 임계점, 분류기준
plt.figure()
plt.plot(thresholds, precisions[:-1], label = 'precision')
plt.plot(thresholds, recalls[:-1], label = 'recall')
plt.xlabel('threshold')
plt.ylim([0.92,1])
plt.legend(loc = 'upper right')
plt.show()
|
cs |
그래프에서 알 수 있듯이 정밀도와 재현율은 서로 반비례하는 관계를 가진다.
'ML 실습' 카테고리의 다른 글
과대적합을 방지하기 위해 Ridge regression 사용하기 (0) | 2023.01.20 |
---|---|
선형 회귀를 이용해서 특성이 두 개 이상인 데이터 예측하기 (0) | 2023.01.14 |