问题描述
我有一个自定义的估算器,我实现了自己,无法使用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
浏览以下文档并回溯错误以修复代码