cross_val_score无法深度复制自定义估算器

问题描述

我有一个自定义的估算器,我实现了自己,无法使用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,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",in <listcomp>
    for func,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,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,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不能深度复制带有变压器的估算器。但是,我的估算器必须运行LabelBinarizer来转换数据以获得预测。因此,我将问题标题更新为正确的问题。

解决方法

但是,您的问题陈述在此处不清楚,但是查看错误似乎您正在尝试进行多类分类。

这里的问题是您可能在代码中某些时候没有正确进行预处理,因为从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