GridSearcCV 中自定义计分器的奇怪问题numpy.float64 __name__ 属性错误

问题描述

我遇到了一些复杂的问题。非常棘手的一个

上下文:

我将 gridsearchcv 与多个记分员一起使用(4 个记分员,包括一名自定义记分员)

scorers = {'f1_score': 'f1','precision': make_scorer(precision_score),'recall': make_scorer(recall_score),'pr_auc': make_scorer(pr_auc,greater_is_better=True,needs_proba=True)}

# where custom scorer use this function
def pr_auc(y,y_pred):
    precision,recall,thresholds = precision_recall_curve(y,y_pred)
    pr_auc = auc(recall,precision)
    return float(pr_auc)

当我通过 X_train (pd.DataFrame) 和 y_train (pd.Series) 拟合 gridsearch 时,我有时得到回溯:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-788-e522f0faead4> in <module>
----> 1 grid_search_cv.fit(X_train,y_train)

/mnt/disk01/data/dn.mushtakov/envs/envs/stan/lib/python3.7/site-packages/sklearn/utils/validation.py in inner_f(*args,**kwargs)
     70                           FutureWarning)
     71         kwargs.update({k: arg for k,arg in zip(sig.parameters,args)})
---> 72         return f(**kwargs)
     73     return inner_f
     74 

/mnt/disk01/data/dn.mushtakov/envs/envs/stan/lib/python3.7/site-packages/sklearn/model_selection/_search.py in fit(self,X,y,groups,**fit_params)
    653 
    654         scorers,self.multimetric_ = _check_multimetric_scoring(
--> 655             self.estimator,scoring=self.scoring)
    656 
    657         if self.multimetric_:

/mnt/disk01/data/dn.mushtakov/envs/envs/stan/lib/python3.7/site-packages/sklearn/metrics/_scorer.py in _check_multimetric_scoring(estimator,scoring)
    481                            "mapped to the callable for multiple metric "
    482                            "evaluation. Got %s of type %s"
--> 483                            % (repr(scoring),type(scoring)))
    484 
    485         if isinstance(scoring,(list,tuple,set)):

/mnt/disk01/data/dn.mushtakov/envs/envs/stan/lib/python3.7/site-packages/sklearn/metrics/_scorer.py in __repr__(self)
    136                                  for k,v in self._kwargs.items()])
    137         return ("make_scorer(%s%s%s%s)"
--> 138                 % (self._score_func.__name__,139                    "" if self._sign > 0 else ",greater_is_better=False",140                    self._factory_args(),kwargs_string))

AttributeError: 'numpy.float64' object has no attribute '__name__'

魔术错误

但是我在不同的情况下使用了类似的 ML“管道”(基本上,这些情况仅因数据集中的某些特征而异,因为我使用了不同的特征工程技术)。 代码在第一次完美运行。 但是当我为下一个案例运行学习管道时,代码失败了。

  1. 如果我从 scorers dict 中删除自定义 scorer,那么 gridsearch 拟合将运行良好
  2. 如果我从命名空间中删除 pr_auc 函数,然后再次定义该函数,gridsearch 拟合也将运行良好

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)