Post

[파이썬 라이브러리를 활용한 머신러닝] 모델 평가와 성능 향상(3)

파이썬 라이브러리를 활용한 머신러닝 책 내용 정리 포스트

[파이썬 라이브러리를 활용한 머신러닝] 모델 평가와 성능 향상(3)

5.3 평가 지표와 측정


5.3.3 다중 분류의 평가 지표

다중 분류를 위한 지표는 모두 이진 분류 평가 지표에서 유도되었으며, 다만 모든 클래스에 대해 평균을 낸 것이다.

  • 다중 분류의 정확도 = 분류된 샘플의 비율
  • 정확도 외에 오차 행렬, 분류 리포트도 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 오차 행렬 출력
# 각 행은 정답 레이블에 해당하며 열은 예측 레이블에 해당
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, random_state = 0)
lr = LogisticRegression(max_iter = 5000).fit(X_train, y_train)
pred = lr.predict(X_test)
print("Accuracy: {:.3f}".format(accuracy_score(y_test, pred)))
print("Confusion_matrix:\n", confusion_matrix(y_test, pred))

"""
Accuracy: 0.953
Confusion_matrix:
[[37  0  0  0  0  0  0  0  0  0]
 [ 0 40  0  0  0  0  0  0  2  1]
 [ 0  0 41  3  0  0  0  0  0  0]
 [ 0  0  0 44  0  0  0  0  1  0]
 [ 0  0  0  0 37  0  0  1  0  0]
 [ 0  0  0  0  0 46  0  0  0  2]
 [ 0  1  0  0  0  0 51  0  0  0]
 [ 0  0  0  1  1  0  0 46  0  0]
 [ 0  3  1  0  0  0  1  0 43  0]
 [ 0  0  0  0  0  1  0  0  2 44]]
"""
1
2
3
4
5
6
# 10개 숫자 분류 문제의 오차 행렬
scores_image = mglearn.tools.heatmap(confusion_matrix(y_test, pred), xlabel = 'predict label', 
                                     ylabel = 'True label', xticklabels = digits.target_names, 
                                     yticklabels = digits.target_names, cmap = plt.cm.gray_r, fmt = "%d")
plt.title("Confusion matrix")
plt.gca().invert_yaxis()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# classification_report 함수를 사용해서 정밀도, 재현율, f1-점수를 계산
print(classification_report(y_test, pred))

"""
precision    recall  f1-score   support
    
        0       1.00      1.00      1.00        37
        1       0.91      0.93      0.92        43
        2       0.98      0.93      0.95        44
        3       0.92      0.98      0.95        45
        4       0.97      0.97      0.97        38
        5       0.98      0.96      0.97        48
        6       0.98      0.98      0.98        52
        7       0.98      0.96      0.97        48
        8       0.90      0.90      0.90        48
        9       0.94      0.94      0.94        47
    
accuracy                            0.95       450
macro avg       0.95      0.95      0.95       450
weighted avg    0.95      0.95      0.95       450
"""

다중 분류에서 불균형 데이터셋을 위해 가장 널리 사용하는 평가 지표는 f1-점수의 다중 분류 버전이다

  • 다중 클래스용 f1-점수는 한 클래스를 양성 클래스로 두고 나머지 클래스들을 음성 클래스로 간주하여 클래스마다 f1-점수를 계산
  • 클래스별 f1-점수를 다음 전략 중 하나를 사용하여 평균을 냄
    • ‘macro’ 평균은 클래스별 f1-점수에 가중치를 주지 않습니다. 클래스 크기에 상관없이 모든 클래스를 같은 비중으로 다룸
    • ‘weighted’ 평균은 클래스별 샘플 수로 가중치를 두어 f1-점수의 평균을 계산
    • ‘micro’ 평균은 모든 클래스의 거짓 양성(FP), 거짓 음성(FN), 진짜 양성(TP)의 총 수를 헤아린 다음 정밀도, 재현율, f1-점수를 이 수치로 계산
1
2
3
4
5
6
7
print("micro 평균 f1 점수: {:.3f}".format(f1_score(y_test, pred, average = "micro")))
print("macro 평균 f1 점수: {:.3f}".format(f1_score(y_test, pred, average = "macro")))

"""
micro 평균 f1 점수: 0.953
macro 평균 f1 점수: 0.954
"""

5.3.4 회귀의 평가 지표

회귀 평가는 분류에서와 비슷하게 할 수 있다.

  • 타깃을 과대 예측한 것 대비 과소 예측한 것을 분석
  • 대부분은 score 메서드에서 이용하는 $R^2$만으로 충분함
  • 가끔 평균 제곱 에러나 평균 절댓값 에러를 사용하여 모델을 튜닝하여 비지니스 결정을 할 수 있음(일반적으로는 $R^2$가 더 나음)

5.3.5 모델 선택에서 평가 지표 사용하기

GridSearchCV나 cross_val_score를 사용하여 모델 선택하고 AUC 같은 평가 지표를 사용한다.

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 분류의 기본 평가 지표 -> 정확도
print("기본 평가 지표:", cross_val_score(SVC(), digits.data, digits.target == 9, cv=5))
# scoring="accuracy"의 결과와 동일
explicit_accuracy =  cross_val_score(SVC(), digits.data, digits.target == 9, scoring="accuracy", cv=5)
print("정확도 지표:", explicit_accuracy)
ap =  cross_val_score(SVC(), digits.data, digits.target == 9, scoring="average_precision", cv=5)
print("평균 정밀도 지표:", ap)

"""
기본 평가 지표: [0.975      0.99166667 1.         0.99442897 0.98050139]
정확도 지표: [0.975      0.99166667 1.         0.99442897 0.98050139]
평균 정밀도 지표: [0.97562403 0.9886322  1.         0.99853801 0.95015534]
"""

# cross_validate : 한번에 계산 가능
res = cross_validate(SVC(), digits.data, digits.target == 9, scoring=["accuracy", "average_precision", "recall_macro"], return_train_score=True, cv=5)
pd.DataFrame(res)

# GridSearchCV에서 최적의 매개변수를 선택하기 위한 평가 지표를 바꿀 수 있음
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target == 9, random_state = 0)

# 일부러 적절하지 않은 그리드르 형성
param_grid = {'gamma' : [0.0001, 0.01, 0.1, 1, 10]}
# 기본 정확도 측정 지표를 사용
grid = GridSearchCV(SVC(), param_grid = param_grid, cv = 3)
grid.fit(X_train, y_train)
print("정확도 지표를 사용한 그리드 서치")
print("최적의 파라미터:", grid.best_params_)
print("최상의 교차 검증 점수(정확도): {:.3f}".format(grid.best_score_))
print("테스트 세트 평균 정밀도: {:.3f}".format(average_precision_score(y_test, grid.decision_function(X_test))))
print("테스트 세트 정확도: {:.3f}".format(grid.score(X_test, y_test)))

"""
정확도 지표를 사용한 그리드 서치
최적의 파라미터: {'gamma': 0.0001}
최상의 교차 검증 점수(정확도)): 0.972
테스트 세트 평균 정밀도: 0.966
테스트 세트 정확도: 0.973
"""

# 평균 정밀도 지표 사용
grid = GridSearchCV(SVC(), param_grid = param_grid, scoring = "average_precision", cv = 3)
grid.fit(X_train, y_train)
print("평균 정밀도 지표를 사용한 그리드 서치")
print("최적의 파라미터:", grid.best_params_)
print("최상의 교차 검증 점수(평균 정밀도): {:.3f}".format(grid.best_score_))
print("테스트 세트 평균 정밀도: {:.3f}".format(average_precision_score(y_test, grid.decision_function(X_test))))
print("테스트 세트 정확도: {:.3f}".format(grid.score(X_test, y_test)))

"""
평균 정밀도 지표를 사용한 그리드 서치
최적의 파라미터: {'gamma': 0.01}
최상의 교차 검증 점수(평균 정밀도): 0.985
테스트 세트 평균 정밀도: 0.996
테스트 세트 정확도: 0.996
"""
  • 정확도를 사용할 때는 gamma = 0.001이 선택
  • 정확도를 최적화하기 위한 매개변수 사용
    • 테스트 세트의 정확도가 더 높음
  • 평균 정밀도를 사용할 떄는 gamma = 0.01이 선택
  • 평균 정밀도를 최적화하기 위한 매개변수 사용
    • 테스트 세트의 평균 정밀도가 더 높음

분류 문제

  • scoring 매개변수의 중요한 옵션
    • accuracy(정확도)
    • ROC 곡선의 아래 면적인 roc_auc
    • 정확도-재현율 곡선의 아래 면적인 average_precision
    • 이진 f1-점수인 f1과 가중치 방식에 따라 f1_macro, f1_micro, f1_weighted

회귀 문제

  • $R^2$ 점수를 나타내는 r2
  • 평균 제곱 오차인 meg_mean_squared_error
  • 평균 절댓값 오차인 neg_mean_absolute_error

5.4 요약 및 정리


교차 검증

테스트 세트나 교차 검능을 모델이나 모델의 매개변수 선택에 사용 (테스트 데이터를 모델을 만드는데 사용)

  • 테스트 데이터로 미래 성능을 평가했을 때 매우 낙관적인 예측치를 얻음

  • 모델 학습 : 훈련 데이터
  • 모델과 매개변수 선택 : 검증 데이터
  • 모델 평가 : 테스트 데이터

훈련 세트와 테스트 세트로 분할하고 모델과 모델 매개변수 선택을 위해 훈련 세트에 교차 검증을 적용

모델 선택과 평가에 사용하는 평가 지표와 방법

  • 모델을 평가하고 선택하기 위한 지표가 이 모델이 실제로 사용되는 상황을 잘 대변해야 한다.
    • 실전에서는 균형 잡힌 클래스를 가진 경우 X, 거짓 양성(FP)과 거짓 음성(FN)이 매우 큰 영향을 줌
This post is licensed under CC BY 4.0 by the author.