Python 网格搜索&x27;未定义的度量学习';坏结果

Python 网格搜索&x27;未定义的度量学习';坏结果,python,scikit-learn,Python,Scikit Learn,我已经创建了一个简单的脚本,用于在随机森林分类器上应用网格搜索,虽然我在过去使用过它,但现在它似乎被破坏了,我找不到原因 from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV rfc = RandomForestClassifier(n_estimators=100, n_jobs=-1).fit(X, y) grid_values = {'c

我已经创建了一个简单的脚本,用于在随机森林分类器上应用网格搜索,虽然我在过去使用过它,但现在它似乎被破坏了,我找不到原因

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

rfc = RandomForestClassifier(n_estimators=100, n_jobs=-1).fit(X, y)


grid_values = {'criterion':['gini','entropy'], 'max_features':['log2', 5, 10, 15, 20, 25], 'max_depth':[None, 5, 10, 15, 20],
               'min_samples_split':[2, 3],'n_jobs':[-1], 'class_weight': [{0 : 1., 1: 30.}, {0 : 1., 1: 50.}, {0 : 1., 1: 100.}]}

for eval_metric in ('precision', 'accuracy'):
  rfc_custom = GridSearchCV(rfc, param_grid=grid_values, scoring=eval_metric)
  rfc_custom.fit(X_train, y_train)
  rfc_custom.best_params_
  print('Grid best parameter (max. {0}): {1}'
         .format(eval_metric, rfc_custom.best_params_))
  print('Grid best score ({0}): {1}'
         .format(eval_metric, rfc_custom.best_score_))
运行此操作时,我收到以下警告:UndefinedMetricWarning:Precision定义错误,由于没有预测样本,因此被设置为0.0。

在线搜索时,我添加了此代码,警告停止:

import warnings
import sklearn.exception

warnings.filterwarnings("ignore",category=sklearn.exceptions.UndefinedMetricWarning)
运行该算法后,我得到了0.0的精度


因为我收到警告,这正常吗?我可能遗漏了什么吗?

我认为在某些CV条件下没有TP和FP样本,所以GridSearchCV中发生了零分裂。如果验证数据没有标签的数据,或者所有样本都以某种方式未分类到其他样本中,就会发生这种情况


备注:精度的定义为(TP)/(TP+FP),其中TP为真阳性,FP为假阳性

下面的代码仅隐藏警告,但不会更改算法的行为。问题是,在预测值中,有一些类从未被算法预测过,因此精度未定义。哪一行发出了警告?它在“GridSearchCV(rfc,param_grid=grid_values,scoring=eval_metric)”行中发出。根据我的理解,每次交叉验证都会产生此错误,因为同一度量会产生多个错误。这是有意义的,因为我在一个不均匀的数据集中只使用了几行(1000行),只是为了检查我的算法是否有效。是否有方法确认所有交叉验证样本都是分层的?您需要手动将数据集按进行分离。然后,绘制一个并检查每个预测标签至少有一个样本。我不确定是否有好的方法从GridSearchCV对象提取此类信息。。。