Почему оптимизация моделей для точности приводит к ошибке: точность не определена и устанавливается на 0,0 из-за отсутствия прогнозируемых выборок? - PullRequest
1 голос
/ 13 мая 2019

Я пытаюсь предсказать диабет, где 1 = диабетик и 0 = не диабетик, и я использую случайный лес и дерево решений.Мои данные значительно несбалансированы, поэтому мои классификаторы предсказывают 0 по чувствительности и 99 по специфичности.Пробовал несколько методов, включая пересчет моих данных с помощью SMOTE.Теперь я хочу оптимизировать модель для точности, чтобы увеличить истинную положительную скорость, но когда я запускаю gridsearch, она выдает мне следующую ошибку:

UndefinedMetricWarning: Точность не определена и устанавливается равной 0,0 из-за отсутствия прогнозаsamples.

Я все равно пытался предсказать, и результаты те же, что и в тех случаях, когда я не использовал оптимизацию точности.

Мой код выглядит так:

cl = RandomForestClassifier() 
params = {  
    'n_estimators': [100, 300, 500, 800, 1000],
    'criterion': ['gini', 'entropy'],
    'bootstrap': [True, False],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [4,5,6,7,8],
}

scorers = {
    'precision_score': make_scorer(precision_score),
    'recall_score': make_scorer(recall_score),
    'accuracy_score': make_scorer(accuracy_score)
}

clff = GridSearchCV(estimator=cl, scoring= scorers, param_grid=params, refit='precision_score', cv=5, verbose=0)

forestscore= clff.fit(X_train, y_train) 

Может ли кто-нибудь помочь мне понять, что делать и в чем проблема?

1 Ответ

0 голосов
/ 13 мая 2019

Проблема может заключаться в том, что, поскольку ваш оценщик всегда возвращает одно и то же значение, некоторые из меток y_train никогда не прогнозируются. Таким образом, точность не может быть предсказана. Вы можете найти похожую проблему в этой теме:

UndefinedMetricWarning: F-оценка неправильно определена и установлена ​​на 0,0 в метках без прогнозируемых выборок

Если вы попробуете эти строки, вы получите сообщение об ошибке:

from sklearn.metrics import precision_score
y_true = [0, 1, 1, 0, 1, 1]
y_pred = [0, 0, 0, 0, 0, 0]
precision_score(y_true, y_pred)

UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 due to no predicted samples.
  'precision', 'predicted', average, warn_for)
0.0

Точному баллу, по-видимому, нужны двоичные значения для правильного вычисления балла. Так как один из ваших векторов (предсказанный в вашем случае) состоит только из 0, он не может вычислить оценку, а затем он устанавливается на 0,0

.

Решение избавиться от этого предупреждения будет состоять в том, чтобы успешно вычислить 1 с вашим оценщиком, поэтому предсказанный y, данный функции оценки, не равен нулю.

...