programing

정의되지 않은 메트릭 경고: F-점수가 잘못 정의되었으며 예측된 샘플이 없는 레이블에서 0.0으로 설정되었습니다.

instargram 2023. 7. 26. 21:35
반응형

정의되지 않은 메트릭 경고: F-점수가 잘못 정의되었으며 예측된 샘플이 없는 레이블에서 0.0으로 설정되었습니다.

다음과 같은 이상한 오류가 발생:

classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)`

처음 실행할 때도 F-점수가 출력됩니다.

metrics.f1_score(y_test, y_pred, average='weighted')

제가 두 번째로 달릴 때, 그것은 오류 없이 점수를 제공합니다.왜 그런 것일까요?

>>> y_pred = test.predict(X_test)
>>> y_test
array([ 1, 10, 35,  9,  7, 29, 26,  3,  8, 23, 39, 11, 20,  2,  5, 23, 28,
       30, 32, 18,  5, 34,  4, 25, 12, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 12, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12, 34, 25, 26, 29, 14, 37, 23,
       12, 19, 19,  3,  2, 31, 30, 11,  2, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 34, 33,  2, 37, 17, 30, 24,  2, 36,  9, 36, 19, 33, 35,  0,  4,
        1])
>>> y_pred
array([ 1, 10, 35,  7,  7, 29, 26,  3,  8, 23, 39, 11, 20,  4,  5, 23, 28,
       30, 32, 18,  5, 39,  4, 25,  0, 24, 13, 21, 38, 19, 33, 33, 16, 20,
       18, 27, 39, 20, 37, 17, 31, 29, 36,  7,  6, 24, 37, 22, 30,  0, 22,
       11, 35, 30, 31, 14, 32, 21, 34, 38,  5, 11, 10,  6,  1, 14, 30, 36,
       25,  8, 30,  3, 12,  7,  4, 10, 15, 12,  4, 22, 26, 29, 14, 37, 23,
       12, 19, 19,  3, 25, 31, 30, 11, 25, 24, 19, 27, 22, 13,  6, 18, 20,
        6, 39, 33,  9, 37, 17, 30, 24,  9, 36, 39, 36, 19, 33, 35,  0,  4,
        1])
>>> metrics.f1_score(y_test, y_pred, average='weighted')
C:\Users\Michael\Miniconda3\envs\snowflakes\lib\site-packages\sklearn\metrics\classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.
  'precision', 'predicted', average, warn_for)
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276
>>> metrics.f1_score(y_test, y_pred, average='weighted')
0.87282051282051276

또한, 왜 뒤를 쫓는 것입니까?'precision', 'predicted', average, warn_for)오류 메시지?열려 있는 괄호가 없는데 닫는 괄호로 끝나는 이유는 무엇입니까?윈도우 10의 콘다 환경에서 파이썬 3.6.0을 사용하여 sklearn 0.18.1을 실행하고 있습니다.

저도 여기 봤는데 같은 벌레인지 모르겠어요.이 SO 게시물도 해결책이 없습니다.

처럼, 댓에언급것처럼라일, ▁in의 일부 .y_test에 않음y_pred특히 이 경우 라벨 '2'는 예측되지 않습니다.

>>> set(y_test) - set(y_pred)
{2}

즉, 이 레이블에 대해 계산할 F-점수가 없으므로 이 경우의 F-점수는 0.0으로 간주됩니다.평균 점수를 요청했으므로 계산에 0점이 포함된 점을 고려해야 하며, 이 때문에 scikit-learn에서 경고가 표시됩니다.

그러면 오류가 두 번 다시 나타나지 않습니다.앞서 언급했듯이, 이것은 python의 오류와 다르게 처리되는 경고입니다.대부분의 환경에서 기본 동작은 특정 경고를 한 번만 표시하는 것입니다.이 동작은 변경할 수 있습니다.

import warnings
warnings.filterwarnings('always')  # "error", "ignore", "always", "default", "module" or "once"

다른 모듈을 가져오기 전에 이 값을 설정하면 코드를 실행할 때마다 경고가 표시됩니다.

설정을 제외하고 이 경고가 처음 표시되는 것을 피할 수 있는 방법은 없습니다.warnings.filterwarnings('ignore')예측되지 않은 레이블의 점수에 관심이 없다고 판단한 다음 관심 있는 레이블(한 번 이상 예측된 레이블)을 명시적으로 지정할 수 있습니다.

>>> metrics.f1_score(y_test, y_pred, average='weighted', labels=np.unique(y_pred))
0.91076923076923078

경고가 사라질 것입니다.

제가 분류 모델을 훈련시킬 때도 같은 문제가 저에게 발생했습니다.이 문제가 발생한 이유는 경고 메시지에 "사전 샘플이 없는 레이블에서는" f1-score를 계산할 때 0-division이 발생하기 때문입니다.sklearn.metrics를 읽었을 때 다른 해결책을 찾았습니다.f1_score doc, 다음과 같은 참고 사항이 있습니다.

true positive + false positive == 0인 경우 정밀도가 정의되지 않으며, true positive + false negative == 0인 경우 호출이 정의되지 않습니다.이러한 경우 기본적으로 메트릭은 f-score와 마찬가지로 0으로 설정되고 정의되지 않은 메트릭 경고가 발생합니다.이 동작은 0_division으로 수정할 수 있습니다.

그자리의 zero_division은 기값은 입다니입니다."warn"로 설 할 수 있 니 습 다 정 니 다 있 ▁it 습 ▁set으로 설정할 수 있습니다.0또는1해서를 UndefinedMetricWarning그것은 나에게 효과가 있습니다;) 오 잠깐, 내가 사용할 때 다른 문제가 있습니다.zero_division 0. scikit-learn 0.21을 하십시오.3을 사용하여 키워드 인수가 없다는 my sklearn 보고서를 실행하여 sklearn을 최신 버전으로 업데이트합니다.pip install scikit-learn -U

저는 같은 오류로 여기에 왔지만, @Shovalt의 대답을 읽고 나서, 저는 제가 시험/열차 분할에서 상당히 낮다는 것을 깨달았습니다.저는 처음에는 큰 데이터 세트를 가지고 있었지만, 그것을 분할했고, 한 그룹은 꽤 작았습니다.샘플 사이즈를 크게 해서 이 경고는 사라졌고 저는 f1 점수를 받았습니다.이로부터

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)

여기까지

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

이 오류는 두 가지 상황에서 발생합니다.

  1. train_test_split()을 사용하여 데이터를 분할한 경우 데이터의 인덱스(특히 Pandas 영상 시리즈 개체를 사용하여 촬영한 경우)를 재설정해야 합니다. y_train, y_test 인덱스를 재설정해야 합니다.문제는 sklearn.metrics의 점수(예: precision_score) 중 하나를 사용하려고 하면 train_test_split()에서 얻은 y_test의 혼합된 인덱스와 일치합니다.

그래서, 둘 중 하나를 사용합니다.np.array(y_test) for y_true in scores또는y_test.reset_index(drop=True)

  1. 예측된 '참 긍정'이 정밀도, 호출 및 f1_점수에 사용되는 0인 경우에도 이 오류가 발생할 수 있습니다.discusion_matrix를 사용하여 이를 시각화할 수 있습니다.분류가 다중 레이블이고 매개변수를 설정하면 행렬의 대각선이 0이 아닌 한 답이 나옵니다.

이게 도움이 되길 바랍니다.

승인된 답변은 경고가 발생하는 이유를 이미 잘 설명합니다.단순히 경고를 제어하려는 경우 를 사용할 수 있습니다.그것은 (반관반관반관반관반관반관반관반관반관반관반)warn_for경고를 음소거하는 데 사용할 수 있습니다.

(_, _, f1, _) = metrics.precision_recall_fscore_support(y_test, y_pred,
                                                        average='weighted', 
                                                        warn_for=tuple())

일부 의견에서 이미 언급했듯이, 이것을 주의해서 사용하십시오.

오류 메시지에 나와 있듯이, F 점수를 얻는 데 사용되는 방법은 sklearn의 "분류" 부분에서 나온 것입니다. 즉, "라벨"에 대해 이야기하는 것입니다.

당신은 회귀 문제가 있습니까?Sklearn은 "기능 선택" 그룹 아래에 회귀 분석을 위한 "F 점수" 방법을 제공합니다. http://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html

분류 문제가 있는 경우, @Shovalt의 대답이 맞는 것 같습니다.

Shovalt가 제안한 것처럼 다중 레이블 사례에서 진실 값 집합과 예측 간의 차이를 확인했지만 문제 해결에 도움이 되지 않았습니다.

그래서 sklearn.metrics.precision_recall_fscore_support 소스 코드(f1_score로 호출됨)를 검색하여 작동 방식을 확인했습니다.

경고를 트리거하는 코드는 다음과 같습니다.

precision = _prf_divide(
    tp_sum, pred_sum, "precision", "predicted", average, warn_for, zero_division
)
recall = _prf_divide(
    tp_sum, true_sum, "recall", "true", average, warn_for, zero_division
)
  • tpsumTP(True Positives)에 해당합니다.
  • pred_sumTP + FP(False Positives)에 해당합니다.
  • true_sumTP + FN(False Negatives)에 해당합니다.
  • 의 첫 번째 매개 변수_prf_divide나눗셈의 분자입니다.
  • 의 두 번째 매개 변수_prf_divide나눗셈의 분모

pred_sum 또는 true_sum이 0과 동일하면 0으로 나눗셈할 수 없으므로 경고가 트리거됩니다.

이러한 서로 다른 값을 가져오려면 sklearn.metrics.multilabel_confusion_matrix를 사용합니다.결과는 3차원 배열입니다.각 행렬이 각 레이블에 대한 참 음(TN), 거짓 양(FP), 거짓 음(FP) 및 참 양(TP)을 나타내는 2x2 행렬 목록으로 볼 수 있습니다.

multilabel_confusion_matrix output

제 생각에, 문제는 훈련 불량이나 샘플 부족으로 인해 일부 라벨을 예측할 수 없는 모델에서 발생해야 합니다.

이 명령은 내게 적합합니다.

sklearn.metrics.f1_score(y_true, y_pred,average='weighted',zero_division=0)

언급URL : https://stackoverflow.com/questions/43162506/undefinedmetricwarning-f-score-is-ill-defined-and-being-set-to-0-0-in-labels-wi

반응형