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

Posted

技术标签:

【中文标题】为啥针对精度优化模型会引发错误:由于没有预测样本,精度定义不明确并设置为 0.0?【英文标题】:Why optimizing models for precision throws me error: Precision is ill-defined and being set to 0.0 due to no predicted samples?为什么针对精度优化模型会引发错误:由于没有预测样本,精度定义不明确并设置为 0.0? 【发布时间】:2019-09-30 08:02:13 【问题描述】:

我正在尝试预测糖尿病,其中 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】:

问题可能在于,由于您的估算器总是返回相同的值,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

消除此警告的解决方案是使用您的估算器成功计算 1,因此为 score 函数提供的预测 y 不为零。

【讨论】:

我以正确的方式将数据集拆分为训练和测试,所以我真的不知道该怎么办。我显然不想让警告静音,因为这对我的预测没有帮助。当我运行网格搜索@AntoningG 时,此警告正在运行。 我完成了我之前的回答给你一个例子@LuisaKa 非常感谢! @AntoninG。

以上是关于为啥针对精度优化模型会引发错误:由于没有预测样本,精度定义不明确并设置为 0.0?的主要内容,如果未能解决你的问题,请参考以下文章

模型评估与选择

第二章 模型评估与选择

为啥加载模型时需要加载优化器模型参数

怎么计算混淆矩阵的消费者精度

为啥scikit learn的平均精度分数返回nan?

西瓜书第二章--模型评估与选择