将 sklearn 的 BaggingClassifier 与 GridSearchCV 一起使用时出现 ZeroDivisionError

Posted

技术标签:

【中文标题】将 sklearn 的 BaggingClassifier 与 GridSearchCV 一起使用时出现 ZeroDivisionError【英文标题】:ZeroDivisionError when using sklearn's BaggingClassifier with GridSearchCV 【发布时间】:2019-09-22 16:15:00 【问题描述】:

我正在尝试使用 bagging 改进完美运行的 Bernoulli Naive Bayes 模型。

但是当我尝试交叉验证BaggingClassifier 时,我得到了一个来自parallel.py 的非常意外的ZeroDivisionError

我尝试更改所有我知道的参数,重新启动 python 但没有任何效果。

这是一个可重现的示例,其中包含经过二进制修改的 iris 数据集:

#%% run
import numpy as np

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import BaggingClassifier
from sklearn.naive_bayes import BernoulliNB
from sklearn.datasets import load_iris


data = load_iris()
data.targetbin = (data.target!=0).astype("int")




param_grid2='max_samples' : np.linspace(0.5,1.0,3),
            'base_estimator__alpha':np.linspace(0.1,1,3),
            'base_estimator__binarize':[*np.linspace(0.0,1,3)],
            'base_estimator__fit_prior':[True,False]


param_grid2='max_samples' :[0.7]


clf = GridSearchCV(
        BaggingClassifier(
                BernoulliNB(),
                n_estimators = 10, max_features = 0.5),
        param_grid2,
        scoring = "accuracy",
        verbose=-1)


clf.fit(data.data, data.targetbin)

这是我的错误的堆栈跟踪:

[Parallel(n_jobs=1)]: 使用带有 1 的后端 SequentialBackend 并发工人。 Traceback(最近一次调用最后一次):

文件“”,第 33 行,在 clf.fit(data.data, data.targetbin)

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​", 第 722 行,合适 self._run_search(evaluate_candidates)

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​", 第 1191 行,在 _run_search evaluate_candidates(ParameterGrid(self.param_grid))

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\model_selection_search.py​​", 第 711 行,在 evaluate_candidates cv.split(X, y, groups)))

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", 第 917 行,在 调用 if self.dispatch_one_batch(iterator):

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", 第 759 行,在 dispatch_one_batch 中 self._dispatch(任务)

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", 第 716 行,在 _dispatch 中 job = self._backend.apply_async(batch, callback=cb)

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib_parallel_backends.py", 第 184 行,在 apply_async 回调(结果)

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", 第 306 行,在 调用 self.parallel.print_progress()

文件 "C:\Users\Dan\Anaconda3\lib\site-packages\sklearn\externals\joblib\parallel.py", 第 806 行,在 print_progress if (is_last_item 或光标 % 频率):

ZeroDivisionError: 整数除以零或取模

我做错了什么?

【问题讨论】:

我认为这是一个错误。它在 print_progress 线上提出。在这种情况下,最好在 GitHub sklearn repo 上打开一个问题。 好的,我会的,谢谢! 【参考方案1】:

我尝试调试该库并发现self.verbose for sklearn/externals/joblib/parallel.py-1,但默认情况下它应该至少是0。所以我认为这是一个错误。

【讨论】:

你是对的,将详细设置为 0 或 1 解决了问题,谢谢。我已经在github 上发布了这个错误,他们说他们会先检查一下详细信息不是负面的,并使文档更清晰(现在它只是说信息越高)。

以上是关于将 sklearn 的 BaggingClassifier 与 GridSearchCV 一起使用时出现 ZeroDivisionError的主要内容,如果未能解决你的问题,请参考以下文章

如何将 sklearn 管道转换为普通代码?

将 Keras 集成到 SKLearn 管道?

如何将 sklearn 管道转换为 pyspark 管道?

Sklearn:将 lemmatizer 添加到 CountVectorizer

使用 sklearn 线性回归,如何将计算出的回归系数约束为大于 0?

如何将不同的输入拟合到 sklearn 管道中?