【问题标题】:Custom estimator can't be deepcopied by cross_val_score自定义估算器不能被 cross_val_score 深度复制
【发布时间】:2021-01-01 13:06:21
【问题描述】:

我有一个我自己实现的自定义估算器,但我无法使用cross_val_score(),我相信这与我的predict() 方法有关。这是完整的错误跟踪:

    Traceback (most recent call last):
  File "/Users/joann/Desktop/Implementações ML/Adaboost Classifier/test.py", line 30, in <module>
    ada2_score = cross_val_score(ada_2, X, y, cv=5)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 390, in cross_val_score
    error_score=error_score)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 236, in cross_validate
    for train, test in cv.split(X, y, groups))
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 1004, in __call__
    if self.dispatch_one_batch(iterator):
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 835, in dispatch_one_batch
    self._dispatch(tasks)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 754, in _dispatch
    job = self._backend.apply_async(batch, callback=cb)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/_parallel_backends.py", line 209, in apply_async
    result = ImmediateResult(func)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/_parallel_backends.py", line 590, in __init__
    self.results = batch()
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 256, in __call__
    for func, args, kwargs in self.items]
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/joblib/parallel.py", line 256, in <listcomp>
    for func, args, kwargs in self.items]
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 544, in _fit_and_score
    test_scores = _score(estimator, X_test, y_test, scorer)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_validation.py", line 591, in _score
    scores = scorer(estimator, X_test, y_test)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/metrics/_scorer.py", line 89, in __call__
    score = scorer(estimator, *args, **kwargs)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/metrics/_scorer.py", line 371, in _passthrough_scorer
    return estimator.score(*args, **kwargs)
  File "/Users/joann/Desktop/Implementações ML/Adaboost Classifier/Adaboost.py", line 92, in score
    scr_pred = self.predict(X)
  File "/Users/joann/Desktop/Implementações ML/Adaboost Classifier/Adaboost.py", line 73, in predict
    clf_pred = clf.predict(X)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn_extensions/extreme_learning_machines/elm.py", line 614, in predict
    class_predictions = self.binarizer.inverse_transform(raw_predictions)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/preprocessing/_label.py", line 528, in inverse_transform
    self.classes_, threshold)
  File "/Users/joann/opt/anaconda3/lib/python3.7/site-packages/sklearn/preprocessing/_label.py", line 750, in _inverse_binarize_thresholding
    format(y.shape))
ValueError: output_type='binary', but y.shape = (30, 3)

我的predict(self, X) 方法返回一个大小为n_samples 的向量,其中包含X 参数的预测值。我还做了一个score()函数如下:

def score(self, X, y):
    scr_pred = self.predict(X)
    return sum(scr_pred == y) / X.shape[0]

此方法仅计算给定样本的模型的准确性。如果我使用这个score() 方法或设置cross_val_score(... , scoring="accuracy"),它都不起作用。

注意:我知道this question/answer,但这不适用于我的情况,因为我可以确认构造函数的一致性:

def __init__(self, estimators=["MLP"], n_rounds=5, random_state=10):
    self.estimators = estimators
    self.n_rounds = n_rounds
    self.random_state = random_state

更新

进一步的研究使我找到了this topic,其中解释说sklearn 无法使用转换器对 Estimator 进行深度复制。但是,我的估算器必须运行 LabelBinarizer 来转换数据以获得预测。所以我将问题标题更新为正确的问题。`

【问题讨论】:

  • 这里的问题在于 y 的形状。似乎在代码中的某个地方你会做某种标签编码或其他东西。检查是否为测试数据完成了 fit_transform 和转换。
  • 你的意思是预测方法返回的y的形状?没有对数据进行任何转换。
  • 我认为我们至少需要更多您的代码,最好是 MRE。这可能是sklearn_extensions.extreme_learning_machines 的问题。

标签: python numpy machine-learning scikit-learn data-mining


【解决方案1】:

但是您的问题陈述在这里并不清楚,但是查看错误似乎您正在尝试多类分类。

这里的问题是您的代码中可能在某些时候没有正确完成预处理,因为错误是从 inverse_binarize_thresholding 记录的,这是由于 sklearn 预处理的以下功能而引发的:

def _inverse_binarize_thresholding(y, output_type, classes, threshold):
   
    if output_type == "binary" and y.ndim == 2 and y.shape[1] > 2:
        raise ValueError("output_type='binary', but y.shape = {0}".
                         format(y.shape))

您的代码中必须缺少一些转换或预处理,您必须正确使用 LabelBinarizer

浏览以下文档并回溯错误以修复您的代码

documentation

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 2011-08-23
    • 2017-02-19
    • 1970-01-01
    • 2012-05-02
    • 2019-04-20
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多