https://velog.io/@shihyunlim/ML-Cross-Validation
https://velog.io/@shihyunlim/ML-PR-Curve-ROC-curve
성능 측정 방법에 대한 개념 정리를 찾으셨다면 위의 블로그를 봐주시고요, 이 블로그는 위 내용들을 다시 공부하며 궁금한 거 위주로 정리한 글입니다ㅎ
기억하려고 써두는 거긴 한데 PR Curve나 ROC Curve에 책에 나온 것처럼 그래프에 다양한 정보를 넣고 싶다면 이 분 깃허브 참고하면 됨 https://github.com/rickiepark/handson-ml3/tree/main
p.148에서 StratifiedKFold와 반복문을 이용하여 sklearn의 cross_val_score 함수와 같은 기능을 구현한다고 했는데, 코드 위에 설명으로 "가끔 사이킷런이 제공하는 기능보다 교차 검증 과정을 더 많이 제어해야 합니다."라는 말이 있기도 했고, StratifiedKFold가 KFold와 달리 각 fold가 원본 데이터의 클래스 분포를 유지하도록 하는 기능이 있다는 걸 알고 있었기에, 그러면 cross_val_score은 교차 검증을 수행할 때 원본 데이터의 클래스 분포를 유지하는 기능이 없나라는 의문을 가짐
-> sklearn 공식 문서에서 cross_val_score에 대해 찾아봤더니 매개변수 cv에 대해 이런 설명이 있었음
"For int/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used. These splitters are instantiated with shuffle=False so the splits will be the same across calls."
(출처: https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html)
-> cv를 따로 설정하지 않아서 default 값으로 None이거나 fold 숫자(=int)를 설정한 경우, 이와 동시에 estimator가 분류기고 타깃값이 binary거나 multiclass인 경우 데이터 분할 방식으로 StratifiedKFold를 사용하며, 이외의 경우에 대해서는 KFold를 사용한다는 것
-> 이렇다는 말은 책에서 StratifiedKFold로 구현한 메소드가 cross_val_score보다 성능이 좋다는 말이 아니라는 것
-> 근데 또 다시 책 읽어보니까 두 교차검증 점수가 같기도 하고, 처음에 둘이 같은 기능을 한다고 했으니 내가 괜히 저 한 문장 때문에 이상하게 생각한 것 같기도 함. 저 문장은 제어가 더 필요한 만일의 경우에 직접 교차 검증 코드를 작성해도 된다~의 의미로 읽으면 될듯
-> 여기서 알고 넘어가야 할 건 cross_val_score의 매개변수 cv에 int/None, estimator에 분류기, y에 binary나 multiclass가 담긴 경우 데이터 분할 방법으로 StratifiedKFold를 사용한다는 것과 그 외의 경우에 대해서는 KFold를 사용한다는 것임
p.149에서 DummyClassifier로 모델을 만들고, 매개변수로 cv=3, scoring="accuracy"를 지정한 cross_val_score로 모델 성능 측정을 함. 그리고 측정 결과로 모든 fold에 대해 90점 이상이 나왔는데 mnist 데이터 특성상 5가 차지하는 비율이 10%고 나머지가 90%기 때문에 정확도를 측정했을 때 항상 90점 이상이 나올 수밖에 없다고 함. 그래서 skewed dataset(한 클래스 비율이 월등히 높은 경우)으로 classification 평가를 할 때 정확도가 좋은 방법이 아니라고 하며 뒤에서 confusion matrix를 소개함
-> 이전에는 책의 말만 읽고 그런가보다~ 하고 넘겼는데 여기 이해를 제대로 안 하고 넘어간 게 늘 찜찜했음
-> DummyClassifier는 가장 많이 등장하는 클래스로 예측하는 분류기로, 5(10%)와 5가 아닌(90%) 데이터를 예측하는 경우 모두 5가 아님, 즉 모든 데이터를 False로 예측할 것임. 원래 데이터셋에서 5의 비율이 10%고 나머지가 90%기 때문에, 원본 데이터셋과 예측 데이터셋을 두고 정확도를 비교한다면 늘 90% 이상은 일치할 것이기 때문에 위처럼 말한 것이었음
-> 헷갈리면 안되는 게, 모든 데이터셋에 대해서 classifier의 성능을 accuracy로 판단해선 안된다는 게 아니라, 특정 클래스 비율이 월등히 높은 skewed dataset인 경우에 안된다는 것임
F1 score: 정밀도와 재현율의 harmonic mean
p.154-155에서 SGDClassifier는 decision_function을 이용해서 각 샘플의 점수를 계산한다고 함. 분류기에 직접 decision_function() 메소드를 사용하는 방법 말고도, cross_val_predict() 메소드의 매개변수 method="decision_function"로 설정하여 샘플의 점수를 계산할 수도 있음.(*cross_val_predict()는 default로 예측 결과를 찾으므로 매개변수를 지정해줘야 함)
그리고 p.161에 나오는 DecisionTreeClassifier의 샘플 점수(정확히는 확률을 점수처럼 사용하는 것이지만)를 구하기 위해선 predict_proba() 메소드를 사용함
-> 이를 통해 함수의 특징에 따라 샘플 점수(혹은 확률)를 구하는 메소드가 다를 수 있음을 알 수 있음
-> sklearn에서 cross_val_predict() 메소드의 method 매개변수에 대해 찾아보면 method로 쓰일 수 있는 메소드가 다양함을, 추정기에 따라 이런 메소드들이 결정됨음을 확인 할 수 있음
"method : {‘predict’, ‘predict_proba’, ‘predict_log_proba’, ‘decision_function’}, default=’predict’ The method to be invoked by estimator."
(출처: https://scikit-learn.org/dev/modules/generated/sklearn.model_selection.cross_val_predict.html)
그런데 decision_function()과 predict_proba()가 의미하는 바가 뭐지? 샘플의 점수는 뭐고.. 예측 확률은 정확히 뭔데..
-> sklearn에 찾으면 뭐라 나오기는 하는데 이해가 될랑 말랑함^-^
"decision_function(X) : Predict confidence scores for samples. The confidence score for a sample is proportional to the signed distance of that sample to the hyperplane."
"predict_proba(X, check_input=True) : Predict class probabilities of the input samples X. The predicted class probability is the fraction of samples of the same class in a leaf."
-> 다행히 텐서플로우 블로그에서 찾음ㅎ
sklearn 분류기에서 불확실성을 추정할 수 있는 함수가 두 개고, decision_function과 predict_proba임. 대부분의 분류기에 둘 중 하나는 제공됨. decision_function 각 샘플의 예측값이 하나의 실수고, 반환값의 크기는 (n_samples,)임. 예측값은 샘플이 양성 클래스 혹은 음성 클래스에 속할 정도를 의미함. 양수의 경우에는 양성 클래스(=1)를, 음수의 경우에는 음수 클래스(=0)를 의미. 절대값이 클수록 해당 클래스에 속할 확률이 높다고 봄. 위의 sklearn의 설명을 참고하면 이런 값들은 샘플과 hyperplane 사이의 signed(부호O) distance겠지? predict_proba의 출력은 (샘플마다) 각 클래스에 대한 확률임.
(출처: https://tensorflow.blog/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D/2-4-%EB%B6%84%EB%A5%98-%EC%98%88%EC%B8%A1%EC%9D%98-%EB%B6%88%ED%99%95%EC%8B%A4%EC%84%B1-%EC%B6%94%EC%A0%95/)
두 함수가 뭘 구하는 건지는 알겠는데, 그러면 추정기 별로 불확실성을 추정하는 함수가 다른 이유는 뭘까?(물론 둘다 포함하는 모델도 있을 수 있지만)
-> 얘는 지피티한테 물어봤는데.. 함수 역할, 특징, 사용되는 모델에 대해 너무 잘 알려주네.. 그래도 앞은 공부 제대로 한셈치자.. 아래 내용 길지만 여태까지 내용 한 번에 정리하기에는 굿
"decision_function과 predict_proba는 각각 모델의 불확실성을 추정하는 두 가지 방법으로, 모델의 특성에 따라 하나만 제공될 수 있습니다. decision_function은 주로 선형 분류기나 결정 경계 기반 모델에서 사용되며, 샘플이 분류 경계로부터 얼마나 멀리 있는지를 실수 값으로 나타냅니다. 양수 값은 양성 클래스, 음수 값은 음성 클래스를 의미하며, 값이 클수록 모델이 더 확신하는 것을 나타냅니다. 예를 들어, SGDClassifier와 SVM은 이 함수를 지원합니다. 반면, predict_proba는 확률 기반의 모델에서 사용되며, 각 클래스에 속할 확률을 0과 1 사이의 값으로 반환합니다. 확률 값이 높을수록 해당 클래스에 속할 가능성이 커집니다. DecisionTreeClassifier나 RandomForestClassifier 같은 모델이 이 함수를 제공하며, 다중 클래스 분류에서도 각 클래스에 대한 확률을 반환할 수 있습니다. 각 모델은 자신이 사용하는 알고리즘의 특성에 맞춰 이 두 함수 중 하나를 제공합니다."
출처: 핸즈온 머신러닝 3판