scikit-learn 的 BaggingClassifier 和自定义基础估计器的问题:操作数不能一起广播?

Posted

技术标签:

【中文标题】scikit-learn 的 BaggingClassifier 和自定义基础估计器的问题:操作数不能一起广播?【英文标题】:Issue with scikit-learn's BaggingClassifier and custom base estimator: operands can't be broadcast together? 【发布时间】:2020-03-26 15:06:10 【问题描述】:

我正在尝试将自定义分类器与 SciKit-Learn 的 BaggingClassifier 一起使用,但我遇到了一个无法确定来源的错误。我的分类器对象通过了check_estimator(),我对fit() 函数没有任何问题:

model = ensemble.BaggingClassifier(customEstimator, max_samples=1/n_estimators, n_estimators=n_estimators)
model.fit(trainfeat, trainlabels)
model.predict(testfeat)

这会产生以下错误跟踪。基本估计器本身通过 sigmoid 阈值进行二进制预测。我知道这些值必须对应测试数据,但是我不明白这三个运算符应该是什么?而且,这似乎是来自BaggingClassifier 的错误,但问题一定来自我,不是吗?

我试图避免粘贴整个估算器的代码,但它继承了BaseEstimator,我只编写/重载函数:fitpredictpredict_proba。我在这方面遗漏了什么吗?

我尝试重新塑造功能/标签无济于事,甚至没有改变错误。我还尝试让我的估算器继承 ClassifierMixin,但这最终给了我一系列新问题。

  File "Main_File.py", line 76, in <module>
    model.predict(testfeat)

  File "G:\Software\Anaconda\lib\site-packages\sklearn\multiclass.py", line 310, in predict
    indices.extend(np.where(_predict_binary(e, X) > thresh)[0])

  File "G:\Software\Anaconda\lib\site-packages\sklearn\multiclass.py", line 98, in _predict_binary
    score = estimator.predict_proba(X)[:, 1]

  File "G:\Software\Anaconda\lib\site-packages\sklearn\ensemble\bagging.py", line 698, in predict_proba
    for i in range(n_jobs))

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 1003, in __call__
    if self.dispatch_one_batch(iterator):

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 834, in dispatch_one_batch
    self._dispatch(tasks)

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 753, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)

  File "G:\Software\Anaconda\lib\site-packages\joblib\_parallel_backends.py", line 201, in apply_async
    result = ImmediateResult(func)

  File "G:\Software\Anaconda\lib\site-packages\joblib\_parallel_backends.py", line 582, in __init__
    self.results = batch()

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 256, in __call__
    for func, args, kwargs in self.items]

  File "G:\Software\Anaconda\lib\site-packages\joblib\parallel.py", line 256, in <listcomp>
    for func, args, kwargs in self.items]

  File "G:\Software\Anaconda\lib\site-packages\sklearn\ensemble\bagging.py", line 129, in _parallel_predict_proba
    proba += proba_estimator

ValueError: operands could not be broadcast together with shapes (100000,2) (100000,) (100000,2)

【问题讨论】:

【参考方案1】:

我猜问题出在你的customEstimatorpredict_proba 的输出上。

看起来您当前的实现返回的输出尺寸为 (n_samples, 1),这是不兼容的。对于二元分类问题,确保您的 predict_proba 输出的维度为 (n_samples, 2)

【讨论】:

以上是关于scikit-learn 的 BaggingClassifier 和自定义基础估计器的问题:操作数不能一起广播?的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习与scikit-learn-3]:scikit-learn模型地图与模型选择

scikit-learn:如何使用拟合概率模型?

scikit-learn学习基础知识四

sklearn (scikit-learn) 逻辑回归包——设置训练的分类系数。

Sklearn 速查

Scikit-Learn 逻辑回归严重过拟合数字分类训练数据