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

Python 为什么为精度优化模型会引发错误:精度定义不清,并且由于没有预测样本而设置为0.0?,python,scikit-learn,precision,cross-validation,grid-search,Python,Scikit Learn,Precision,Cross Validation,Grid Search,我试图预测糖尿病,其中1=糖尿病患者,0=非糖尿病患者,我使用随机森林和决策树。我的数据明显不平衡,导致我的分类因子预测敏感性为0,特异性为99。我尝试了几种方法,包括用SMOTE重新采样我的数据。现在,我想优化模型的精度,以提高真实的阳性率,但当我运行gridsearch时,它会抛出以下错误: UndefinedMetricWarning:由于没有预测样本,精度定义不正确,并被设置为0.0 不管怎样,我试着预测,结果与我没有使用精度优化时的结果相同 我的代码如下所示: cl = RandomF

我试图预测糖尿病,其中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) 

有人能帮我理解该做什么以及问题出在哪里吗?

问题可能是,由于您的估计器总是返回相同的值,因此无法预测
y\u train
的某些标签。因此,精度无法预测。您可以在此线程上发现类似的问题:

如果您尝试以下行,则会收到错误消息:

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不是零。

问题可能是,由于估计器总是返回相同的值,因此,
y\u序列的一些标签从来没有被预测过。因此,精度无法预测。您可以在此线程上发现类似的问题:

如果您尝试以下行,则会收到错误消息:

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不是零。

我将数据集拆分为训练集,并以正确的方式进行测试,因此我真的不确定该怎么办。我当然不想让这个警告保持沉默,因为这对我的预测没有帮助。当我运行网格搜索@AntoningG时,此警告正在运行。我完成了之前的回答,为您提供了一个示例@LuisaKaThank you@我以正确的方式将数据集分为训练和测试,所以我真的不知道该怎么做。我当然不想让这个警告保持沉默,因为这对我的预测没有帮助。当我运行网格搜索@AntoningG时,此警告正在运行。我完成了之前的回答,为您提供了一个示例@LuisaKaThank you@安东宁。