programing

스크킷 학습으로 다중 클래스 사례의 정밀도, 리콜, 정확도 및 f1 점수를 계산하는 방법은 무엇입니까?

oldcodes 2023. 7. 23. 14:40
반응형

스크킷 학습으로 다중 클래스 사례의 정밀도, 리콜, 정확도 및 f1 점수를 계산하는 방법은 무엇입니까?

저는 감정 분석 문제를 연구하고 있습니다. 데이터는 다음과 같습니다.

label instances
    5    1190
    4     838
    3     239
    1     204
    2     127

1190부터 제 상태입니다.instances에는 " 이붙있습다니어라벨▁with다▁labeled니"라는 레이블이 붙어 있습니다.5분류를 위해 나는 skikit의 SVC를 사용합니다.문제는 다중 클래스 사례에 대한 정밀도, 리콜, 정확도 및 f1-점수를 정확하게 계산하기 위해 올바른 방식으로 데이터의 균형을 맞추는 방법을 모른다는 것입니다.그래서 저는 다음과 같은 접근법을 시도했습니다.

첫 번째:

    wclf = SVC(kernel='linear', C= 1, class_weight={1: 10})
    wclf.fit(X, y)
    weighted_prediction = wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, weighted_prediction)
print 'F1 score:', f1_score(y_test, weighted_prediction,average='weighted')
print 'Recall:', recall_score(y_test, weighted_prediction,
                              average='weighted')
print 'Precision:', precision_score(y_test, weighted_prediction,
                                    average='weighted')
print '\n clasification report:\n', classification_report(y_test, weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, weighted_prediction)

두 번째:

auto_wclf = SVC(kernel='linear', C= 1, class_weight='auto')
auto_wclf.fit(X, y)
auto_weighted_prediction = auto_wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, auto_weighted_prediction)

print 'F1 score:', f1_score(y_test, auto_weighted_prediction,
                            average='weighted')

print 'Recall:', recall_score(y_test, auto_weighted_prediction,
                              average='weighted')

print 'Precision:', precision_score(y_test, auto_weighted_prediction,
                                    average='weighted')

print '\n clasification report:\n', classification_report(y_test,auto_weighted_prediction)

print '\n confussion matrix:\n',confusion_matrix(y_test, auto_weighted_prediction)

세 번째:

clf = SVC(kernel='linear', C= 1)
clf.fit(X, y)
prediction = clf.predict(X_test)


from sklearn.metrics import precision_score, \
    recall_score, confusion_matrix, classification_report, \
    accuracy_score, f1_score

print 'Accuracy:', accuracy_score(y_test, prediction)
print 'F1 score:', f1_score(y_test, prediction)
print 'Recall:', recall_score(y_test, prediction)
print 'Precision:', precision_score(y_test, prediction)
print '\n clasification report:\n', classification_report(y_test,prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, prediction)


F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1082: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
 0.930416613529

그러나 다음과 같은 경고가 표시됩니다.

/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172:
DeprecationWarning: The default `weighted` averaging is deprecated,
and from version 0.18, use of precision, recall or F-score with 
multiclass or multilabel data or pos_label=None will result in an 
exception. Please set an explicit value for `average`, one of (None, 
'micro', 'macro', 'weighted', 'samples'). In cross validation use, for 
instance, scoring="f1_weighted" instead of scoring="f1"

분류기의 메트릭을 올바른 방식으로 계산하기 위해 불균형 데이터를 올바르게 처리하려면 어떻게 해야 합니까?

저는 어떤 무게가 무엇에 사용되는지에 대해 많은 혼란이 있다고 생각합니다.무엇이 당신을 괴롭히는지 정확히 알 수 없어서 다른 주제를 다루려고 합니다. 참고하세요;).

클래스 가중치

에서 무게.class_weight매개 변수는 분류자를 훈련시키는 데 사용됩니다.사용 중인 메트릭 계산에 사용되지 않습니다. 클래스 가중치가 다르면 분류자가 다르다는 이유만으로 숫자가 달라집니다.

기본적으로 모든 스크킷 학습 분류기에서 클래스 가중치는 클래스가 얼마나 중요한지 모델에 알려주는 데 사용됩니다.이것은 훈련 동안, 분류사가 가중치가 높은 클래스를 적절하게 분류하기 위해 추가적인 노력을 할 것이라는 것을 의미합니다.
그들이 어떻게 그렇게 하는지는 알고리즘마다 다릅니다.SVC에서 작동하는 방법에 대한 세부 정보를 원하지만 문서가 이해할 수 없는 경우 언제든지 언급하십시오.

측정지표

분류기가 있으면 해당 분류기의 성능이 어느 정도인지 알고자 합니다.당신이 언급한 할 수 있습니다.accuracy,recall_score,f1_score...

일반적으로 클래스 분포가 불균형적일 때 정확도는 가장 빈번한 클래스를 예측하는 모델에 높은 점수를 주기 때문에 잘못된 선택으로 간주됩니다.

기준을 이모측기자설는않지명만겠, 예으로적지외하세히를 는,accuracy됩니다: 이 그들은수수자서연적게럽용: 이에서수볼있듯이다것니됩스것준업에▁they이듯있▁level▁this:▁class수▁you▁as▁at▁are▁see▁in▁applied▁naturally▁can볼▁the서:그.print분류 보고서의 각 클래스에 대해 정의됩니다.그들은 다음과 같은 개념에 의존합니다.true positives또는false negative어떤 클래스가 긍정적인 클래스인지 정의해야 합니다.

             precision    recall  f1-score   support

          0       0.65      1.00      0.79        17
          1       0.57      0.75      0.65        16
          2       0.33      0.06      0.10        17
avg / total       0.52      0.60      0.51        50

그 경고는

F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The 
default `weighted` averaging is deprecated, and from version 0.18, 
use of precision, recall or F-score with multiclass or multilabel data  
or pos_label=None will result in an exception. Please set an explicit 
value for `average`, one of (None, 'micro', 'macro', 'weighted', 
'samples'). In cross validation use, for instance, 
scoring="f1_weighted" instead of scoring="f1".

계산 방법을 정의하지 않고 f1-점수, 호출 및 정밀도를 사용하기 때문에 이 경고가 표시됩니다!질문은 대체될 수 있습니다: 위의 분류 보고서에서 f1 점수에 대한 하나의 글로벌 번호를 어떻게 출력합니까?할 수 있는 일:

  1. 수업에 : 은 f1-점수입니다.avg / total이상의 결과매크로 평균화라고도 합니다.
  2. 참 양성/거짓 음성의 전역 카운트 등을 사용하여 f1-점수를 계산합니다(각 클래스에 대한 참 양성/거짓 음성의 수를 합함)마이크로 평균이라고도 합니다.
  3. f1-based의 합니다.용사를 합니다.'weighted'합니다. 더이더합니다. scikit-learn에서는 f1-점수를 계산합니다. 클래스가 더 많은 요소를 가질수록 계산에서 이 클래스에 대한 f1-점수가 더 중요합니다.

스크킷러닝의 세 가지 옵션이 있습니다. 하나를 선택해야 한다는 경고가 나옵니다.따라서 다음을 지정해야 합니다.average점수 방법에 대한 인수입니다.

예를 들어 매크로 평균화는 클래스 불균형을 고려하지 않으며 클래스 1의 f1-점수는 클래스 5의 f1-점수만큼 중요합니다.그러나 가중 평균을 사용하면 클래스 5에 대한 중요도가 더 높아집니다.

이 메트릭의 전체 인수 사양은 현재 skikit-learn에서 매우 명확하지 않습니다. 문서에 따르면 0.18 버전에서 더 나아질 것입니다.그들은 일부 명백하지 않은 표준 동작을 제거하고 개발자들이 그것을 알아차릴 수 있도록 경고를 보내고 있습니다.

계산 점수

마지막으로 언급하고 싶은 것은 점수는 분류자가 본 이 없는 데이터에 대해 계산된 경우에만 의미가 있다는 것입니다.분류기를 적합시키는 데 사용된 데이터에서 얻은 점수는 전혀 관련이 없기 때문에 이는 매우 중요합니다.

다음을 사용하여 수행하는 방법은 다음과 같습니다.StratifiedShuffleSplit이는 레이블 분포를 보존하는 데이터의 랜덤 분할을 제공합니다.

from sklearn.datasets import make_classification
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix

# We use a utility to generate artificial classification data.
X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
for train_idx, test_idx in sss:
    X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    print(f1_score(y_test, y_pred, average="macro"))
    print(precision_score(y_test, y_pred, average="macro"))
    print(recall_score(y_test, y_pred, average="macro"))

여기에는 매우 자세한 답변이 많지만 저는 당신이 올바른 질문에 답하고 있다고 생각하지 않습니다.질문을 이해한 바로는 두 가지 우려 사항이 있습니다.

  1. 다중 클래스 문제를 어떻게 채점합니까?
  2. 불균형 데이터를 처리하려면 어떻게 해야 합니까?

1.

scikit-learn의 대부분의 스코어링 함수는 단일 클래스 문제와 마찬가지로 다중 클래스 문제 모두에서 사용할 수 있습니다.예:

from sklearn.metrics import precision_recall_fscore_support as score

predicted = [1,2,3,4,5,1,2,1,1,4,5] 
y_test = [1,2,3,4,5,1,2,1,1,4,1]

precision, recall, fscore, support = score(y_test, predicted)

print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
print('support: {}'.format(support))

이렇게 하면 각 클래스에 대한 유형 및 해석 가능한 숫자를 얻을 수 있습니다.

| Label | Precision | Recall | FScore | Support |
|-------|-----------|--------|--------|---------|
| 1     | 94%       | 83%    | 0.88   | 204     |
| 2     | 71%       | 50%    | 0.54   | 127     |
| ...   | ...       | ...    | ...    | ...     |
| 4     | 80%       | 98%    | 0.89   | 838     |
| 5     | 93%       | 81%    | 0.91   | 1190    |

그러면...

2.

불균형 데이터가 문제인지 여부를 알 수 있습니다.덜 대표되는 클래스(클래스 1 및 2)의 점수가 교육 샘플이 많은 클래스(클래스 4 및 5)의 점수보다 낮으면 불균형 데이터가 실제로 문제가 된다는 것을 알고 있으며, 이 스레드의 다른 답변에 설명된 대로 이에 따라 작업을 수행할 수 있습니다.그러나 예측하려는 데이터에 동일한 클래스 분포가 있으면 불균형 훈련 데이터가 데이터를 잘 나타내므로 불균형은 좋은 것입니다.

제기된 질문

'불균형 데이터를 가진 다중 클래스 분류에 어떤 메트릭을 사용해야 하는가'라는 질문에 대한 답변: 매크로-F1-측정.매크로 정밀도 및 매크로 리콜도 사용할 수 있지만 이진 분류의 경우처럼 쉽게 해석할 수 없으며, 이미 F-measure에 통합되어 있으며, 초과 메트릭은 방법 비교, 매개 변수 조정 등을 복잡하게 만듭니다.

마이크로 평균화는 클래스 불균형에 민감합니다. 예를 들어, 사용자의 방법이 가장 일반적인 레이블에 잘 작동하고 다른 레이블에 완전히 혼란을 주는 경우 마이크로 평균화 메트릭은 좋은 결과를 보여줍니다.

가중 평균은 레이블 수에 따라 가중치를 부여하기 때문에 불균형 데이터에 적합하지 않습니다.게다가, 그것은 너무 해석하기 어렵고 인기가 없습니다. 예를 들어, 다음의 매우 상세한 설문 조사에서 그러한 평균에 대한 언급이 없습니다. 저는 검토할 것을 강력히 권장합니다.

소콜로바, 마리나, 가이 라팔미."분류업무 수행방안 체계적 분석"정보 처리 및 관리 45.4 (2009): 427-437.

응용 프로그램 관련 질문

하지만, 다시 업무로 돌아가서, 저는 두 가지 주제를 조사하겠습니다.

  1. 특정 작업에 일반적으로 사용되는 측정 기준 - (a) 다른 사람과 방법을 비교하고 잘못된 행동을 했을 경우 이해할 수 있으며, (b) 스스로 이를 탐구하고 다른 사람의 발견을 재사용하지 않을 수 있습니다.
  2. 예를 들어, 응용 프로그램의 유스케이스는 4성급 및 5성급 검토에만 의존할 수 있습니다. 이 경우 좋은 측정 기준은 이 두 레이블만 계산해야 합니다.

일반적으로 사용되는 메트릭입니다.문헌을 살펴본 후 추론할 수 있듯이, 크게 두 가지 평가 지표가 있습니다.

  1. 사용되는 정확도(예:

Yu, April, 그리고 Daryl Chang."Yelp Business를 이용한 다계층 정서 예측"

(link) - 저자들이 거의 동일한 등급 분포를 사용한다는 점에 유의하십시오(그림 5 참조).

팡, 보, 릴리안 리."별 보기: 등급 척도와 관련하여 감정 분류를 위한 계급 관계 활용"제43회 컴퓨터 언어학 협회 연례 회의의 의사록.컴퓨터 언어학 협회, 2005.

(링크)

  1. MSE(또는 더 자주는, 평균 절대 오차 - MAE) - 예를 들어,

이, 문태, R.Grafe "식당 후기로 다계층 정서분석"CSN 224(2010)의 최종 프로젝트.

(link) - 그들은 정확도와 MSE 모두를 탐구하며 후자가 더 낫다고 생각합니다.

파파스, 니콜라오스, 루 마르코니, 안드레이 포페스쿠 벨리스."별 설명: 측면 기반 정서 분석을 위한 가중 다중 인스턴스 학습"2014 자연어 처리의 경험적 방법에 관한 회의의 진행.No. EPFL-CONF-200899.2014.

(link) - 그들은 평가와 기준 접근법을 위해 scikit-learn을 사용하고 코드를 사용할 수 있다고 명시합니다. 하지만 나는 그것을 찾을 수 없으니, 만약 당신이 그것이 필요하다면, 저자들에게 편지를 쓰세요, 그 작품은 꽤 새롭고 파이썬으로 쓰여진 것 같습니다.

다양한 오류에 대한 비용입니다.만약 당신이 심각한 실수를 피하는 것에 더 신경을 쓴다면, 예를 들어, 1-스타 리뷰를 5-스타 리뷰로 부르거나 그런 것들을 하는 것과 같은 것들을 보면, MSE를 볼 수 있습니다. 차이가 중요하지는 않지만, 차이가 크지 않다면, MAE를 사용해 보십시오. 그렇지 않으면 정확성을 유지하십시오.

메트릭이 아닌 접근 방식에 대해

일반적으로 SVC 또는 OVA SVM과 같은 다중 클래스 분류기보다 성능이 우수하므로 회귀 분석 등의 방법을 사용해 보십시오.

우선 데이터가 불균형 상태인지 여부를 판단하기 위해 계수 분석만 사용하는 것이 조금 어렵습니다.예를 들어: 1000분의 1의 긍정적인 관찰은 단지 소음, 오류 또는 과학의 돌파구입니까?당신은 절대 모릅니다.
따라서 사용 가능한 모든 지식을 사용하고 현명하게 그 상태를 선택하는 것이 항상 더 좋습니다.

좋아요, 만약 정말 불균형하다면요?
다시 한 번 - 데이터를 확인합니다.때때로 한 두 개의 관측치가 100배로 곱해진 것을 발견할 수 있습니다.때로는 가짜 단일 클래스 관측치를 만드는 것이 유용합니다.
모든 데이터가 깨끗하면 다음 단계에서는 클래스 가중치를 예측 모형에 사용합니다.

그렇다면 다중 클래스 메트릭은 어떨까요?
제 경험에 따르면 귀사의 측정 기준은 일반적으로 사용되지 않습니다.크게 두 가지 이유가 있습니다.
첫 번째: 확실한 예측보다 항상 확률로 작업하는 것이 더 좋습니다(두 모델이 모두 동일한 클래스를 제공한다면 0.9 및 0.6 예측으로 모델을 분리할 수 있기 때문입니다).
둘째, 예측 모델을 비교하고 하나의 좋은 측정 기준에 따라 새로운 예측 모델을 구축하는 것이 훨씬 쉽습니다.
제 경험으로 볼 때 로그 손실 또는 MSE(또는 평균 제곱 오차)를 권장할 수 있습니다.

sklearn 경고를 수정하는 방법은 무엇입니까?
알아차린 처럼) 덮어씁니다.average값 중 변수:'micro'전 으로 확장), (메트릭스 사용)'macro'라벨에 을 제시함) (표시된 것과 동일)'weighted'(매크로와 동일하지만 자동 가중치 포함).

f1_score(y_test, prediction, average='weighted')

모든 경고는 메트릭 함수를 기본값으로 호출한 후에 발생했습니다.average'binary'다중 클래스 예측에는 적합하지 않습니다.
행운을 빌고 기계 학습을 즐기세요!


저는 제가 동의할 수 없는 회귀 접근법(예: SVR)으로 전환하기 위한 다른 답변자의 권고 사항을 발견했습니다.제가 기억하는 한, 다계층 회귀라는 것조차 없습니다., 아주 분석이 분석과 간에 도 있습니다. (식으로든 가 정렬된 ) 일입니다. ", " 훨다다중레네른이클블경는회우씬에분귀일분있회석부이귀으분며간과전석가류어에지이만환정능하경우된다우니입문우매경드렬든게떻가스래클▁yesabel네▁reg▁whichression다니문우ification입우경매드,▁there▁()정경우▁somehow▁is▁yes어▁is▁and▁multil▁between▁andressionif▁class된렬▁it▁different

제가 추천하고 싶은 은 (skikit-learn의 범위에서) 또 다른 매우 강력한 분류 도구인 그레이디언트 부스팅, 랜덤 포레스트(내가 가장 좋아하는), KNeighbors 등을 시도하는 것입니다.

그런 다음 예측 사이의 산술 평균 또는 기하 평균을 계산할 수 있으며 대부분의 경우 훨씬 더 나은 결과를 얻을 수 있습니다.

final_prediction = (KNNprediction * RFprediction) ** 0.5

언급URL : https://stackoverflow.com/questions/31421413/how-to-compute-precision-recall-accuracy-and-f1-score-for-the-multiclass-case

반응형