정의되지 않은 메트릭 경고: 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)
이 오류는 두 가지 상황에서 발생합니다.
- 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)
- 예측된 '참 긍정'이 정밀도, 호출 및 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
)
tpsum
TP(True Positives)에 해당합니다.pred_sum
TP + FP(False Positives)에 해당합니다.true_sum
TP + FN(False Negatives)에 해당합니다.- 의 첫 번째 매개 변수
_prf_divide
나눗셈의 분자입니다. - 의 두 번째 매개 변수
_prf_divide
나눗셈의 분모
pred_sum 또는 true_sum이 0과 동일하면 0으로 나눗셈할 수 없으므로 경고가 트리거됩니다.
이러한 서로 다른 값을 가져오려면 sklearn.metrics.multilabel_confusion_matrix를 사용합니다.결과는 3차원 배열입니다.각 행렬이 각 레이블에 대한 참 음(TN), 거짓 양(FP), 거짓 음(FP) 및 참 양(TP)을 나타내는 2x2 행렬 목록으로 볼 수 있습니다.
제 생각에, 문제는 훈련 불량이나 샘플 부족으로 인해 일부 라벨을 예측할 수 없는 모델에서 발생해야 합니다.
이 명령은 내게 적합합니다.
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
'programing' 카테고리의 다른 글
예외 없이 트랜잭션 롤백을 수행하시겠습니까? (0) | 2023.07.26 |
---|---|
Python 개체에 대한 복사/딥 복사 작업을 재정의하는 방법은 무엇입니까? (0) | 2023.07.26 |
활성화 가능 여부구성 요소가 없는 경로로 자식을 활성화할 수 있음 (0) | 2023.07.26 |
jquery를 사용하여 입력 유형을 가져오는 방법은 무엇입니까? (0) | 2023.07.26 |
@MockBeans 예제 사용 (0) | 2023.07.26 |