在没有范围技巧的情况下将额外参数传递给 GenericUnivariateSelect
passing an extra argument to GenericUnivariateSelect without scope tricks
编辑:
如果我应用答案中建议的 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
。
我需要根据 Custom_Score
执行单变量特征选择,必须 接收一个额外的参数,在此处称为 XX
def Custom_Score(X,Y,XX=_XX ):
# do stuff
return my_score
不幸的是,AFAIK 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)
编辑:
如果我应用答案中建议的 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
。
我需要根据 Custom_Score
执行单变量特征选择,必须 接收一个额外的参数,在此处称为 XX
def Custom_Score(X,Y,XX=_XX ):
# do stuff
return my_score
不幸的是,AFAIK 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)