为什么为精度优化模型会引发错误:精度定义不明确,并且由于没有预测样本而被设置为0.0?

时间:2019-05-13 11:00:28

标签: python scikit-learn precision cross-validation grid-search

我正在尝试预测糖尿病,其中1 =糖尿病,0 =非糖尿病,我正在使用随机森林和决策树。我的数据严重失衡,导致我的分类器预测灵敏度为0,特异性为99。尝试了几种方法,包括使用SMOTE重新采样我的数据。现在,我想优化模型的精度以增加真实的阳性率,但是当我运行gridsearch时,它会引发以下错误:

UndefinedMetricWarning:精度定义不明确,由于没有预测样本,因此将其设置为0.0。

无论如何,我都试图进行预测,结果与我未使用精度优化的结果相同。

我的代码如下:

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 :(得分:0)

问题可能在于,由于估算器总是返回相同的值,因此y_train的某些标签从未被预测到。因此,无法预测准确性。您可以在此线程上找到类似的问题:

UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples

如果尝试这些行,则会收到错误消息:

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

摆脱此警告的解决方案将是使用您的估计器成功计算1s,因此赋予得分函数的预测y不为零。