传递一个额外的参数来GenericUnivariateSelect没有范围的招数

问题描述:

编辑:传递一个额外的参数来GenericUnivariateSelect没有范围的招数

下面是完整的回溯,如果我申请了make_scorer解决办法的答案建议...

`File "________python/anaconda-2.7.11-64/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile 
    execfile(filename, namespace) 

    File ""________python/anaconda-2.7.11-64/lib/python2.7/site-packages/spyder/utils/site/sitecustomize.py", line 94, in execfile 
    builtins.execfile(filename, *where) 

    File ""________/main_"________.py", line 43, in <module> 
    "_________index.fit(X,Y ,g=g,L=L) 

    File ""________/Core.py", line 95, in fit 
    X_preprocessed=self.preprocessing.fit_transform(X,y) 

    File ""________python/anaconda-2.7.11-64/lib/python2.7/site-packages/sklearn/pipeline.py", line 303, in fit_transform 
    return last_step.fit_transform(Xt, y, **fit_params) 

    File ""________/python/anaconda-2.7.11-64/lib/python2.7/site-packages/sklearn/base.py", line 497, in fit_transform 
    return self.fit(X, y, **fit_params).transform(X) 

    File "Base/Base.py", "________ 
    score_func_ret = self.score_func(X, y) 

TypeError: __call__() takes at least 4 arguments (3 given)` 

我的工作sklearn管道。

custom_filter=GenericUnivariateSelect(Custom_Score,mode='MinScore',param=0.9) 
custom_filter._selection_modes.update({'MinScore': SelectMinScore}) 
MyProcessingPipeline=Pipeline(steps=[... 
          ('filter_step', None), 
          ....]) 
ProcessingParams.update({'filter_step':custom_filter}) 
MyProcessingPipeline.set_params(**ProcessingParams) 

其中SelectMinScore是自定义BaseFilter

我需要在这里

def Custom_Score(X,Y,XX=_XX): 
     # do stuff 
     return my_score 

不幸的是执行基于Custom_Score,这必须获得一个额外的参数,叫XX单变量特征选择,据我所知的sklearn API不允许额外的参数传递流水线的步骤的参数的参数。

我已经试过

MyProcessingPipeline({'filter_step':custom_filter(XX=_XX)})

但打破参数传递级联(我相信)。

到目前为止,我已经通过编写一个包装器来解决这个问题,其中_XX是我需要的数据,不幸需要在定义时间的函数范围内。 所以我最终定义了我的main函数中的函数,以便_XX存在并且可以通过。

def Custom_Score_Wrapped(X,Y): 
      return Custom_Score(X,Y,XX=_XX) 

我认为这是一个非常肮脏的解决方法。

这样做的正确方法是什么?

您可以在调用make_scorer()函数时简单地传递额外的参数。例如,你check this link。在这个例子中它使用了fbeta_score。 现在fbeta需要一个额外的参数,beta这是在调用这样的make_scorer()函数来设置:

ftwo_scorer = make_scorer(fbeta_score, beta=2) 
你的情况

所以,这应该工作:

def Custom_Score(X,Y,XX): 
    # do stuff 
    return my_score 

my_scorer = make_scorer(Custom_Score,XX=_XX) 
+0

我都试过了,它不行。我在basefilter类中得到以下错误: 文件“Base/base_dataframe.py”,行333,in fit score_func_ret = self.score_func(X,y) TypeError:__call __()至少需要4个参数给出) – ErroriSalvo

+0

所以它似乎过滤器类仍然需要访问score_func的所有参数才能工作 – ErroriSalvo

+1

@Sabor可以请你发布完整的堆栈跟踪 –