Scikit Learn Сообщение об ошибке "Точность и F-оценка не определены и устанавливаются на 0,0 в метках"
Я работаю над моделью бинарной классификации, классификатор наивный байесовский. У меня есть почти сбалансированный набор данных, однако я получаю следующее сообщение об ошибке при прогнозировании:
UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples.
'precision', 'predicted', average, warn_for)
Я использую gridsearch с CV k-fold 10. Набор тестов и прогнозы содержат оба класса, поэтому я не понимаю сообщения. Я работаю над тем же набором данных, разделением поезда / теста, cv и случайным начальным числом для 6 других моделей, и они работают отлично. Данные поступают извне в фрейм данных, рандомизируются, и начальное число фиксируется. Затем наивная байесовская классификационная модель классифицирует файл в начале перед этим фрагментом кода.
X_train, X_test, y_train, y_test, len_train, len_test = \
train_test_split(data['X'], data['y'], data['len'], test_size=0.4)
pipeline = Pipeline([
('classifier', MultinomialNB())
])
cv=StratifiedKFold(len_train, n_folds=10)
len_train = len_train.reshape(-1,1)
len_test = len_test.reshape(-1,1)
params = [
{'classifier__alpha': [0, 0.0001, 0.001, 0.01]}
]
grid = GridSearchCV(
pipeline,
param_grid=params,
refit=True,
n_jobs=-1,
scoring='accuracy',
cv=cv,
)
nb_fit = grid.fit(len_train, y_train)
preds = nb_fit.predict(len_test)
print(confusion_matrix(y_test, preds, labels=['1','0']))
print(classification_report(y_test, preds))
Python заставил меня "изменить" форму серии, может быть, это виновник?
2 ответа
Значение предупреждения
Как показывают другие ответы здесь, вы столкнулись с ситуацией, когда точность F-Score
не может быть вычислено из-за его определения (точность / отзыв равен 0). В этом случае оценка метрики оценивается в 0.
Тестовые данные содержат все метки, почему это все еще происходит?
Ну, вы используете K-Fold
(конкретно в вашем случае k=10
), что означает, что одно конкретное разбиение может содержать 0 выборок одного класса
По-прежнему происходит, даже при использовании стратифицированной K-Fold
Это немного сложно. Стратифицированная K-Fold обеспечивает одинаковую часть каждого класса в каждом разделении. Однако это зависит не только от реальных классов. Например, точность вычисляется следующим образом: TP/predicted yes
, Если по какой-либо причине вы прогнозируете все свои образцы с помощью " Нет", у вас будет predicted yes=0
, что приведет к неопределенной точности (что может привести к неопределенной F-Score
).
Это звучит как крайний случай, но примите во внимание тот факт, что при поиске по сетке вы, вероятно, ищете множество различных комбинаций, некоторые из которых могут быть полностью отключены, что приводит к такому сценарию.
Надеюсь, это ответит на ваш вопрос!
Как прокомментировал Аадель, когда никакие точки данных не классифицируются как положительные, точность делится на ноль, как это определено как TP / (TP + FP) (т. Е. Истинные положительные / истинные и ложные положительные результаты). Затем библиотека устанавливает точность в 0, но выдает предупреждение, поскольку на самом деле значение не определено. F1 зависит от точности и, следовательно, также не определен.
Как только вы узнаете об этом, вы можете отключить предупреждение с помощью:
import warnings
import sklearn.exceptions
warnings.filterwarnings("ignore", category=sklearn.exceptions.UndefinedMetricWarning)
Поскольку ваши занятия не сбалансированы, попробуйте использовать:
scoring = 'f1_weighted'
или же
scoring = 'precision_weighted'