2017-10-04 5 views
1

EDIT:ein zusätzliches Argument GenericUnivariateSelect ohne Rahmen Tricks vorbei

hier ist die komplette Rückverfolgung, wenn ich die make_scorer Abhilfe in den Antworten ...

`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)` 

Ich arbeite an vorgeschlagen gelten eine Sklearn-Pipeline.

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) 

wo SelectMinScore ist ein Brauch BaseFilter.

muss ich univariate Funktion Auswahl auszuführen basierend auf einem Custom_Score, die ein zusätzliches Argument erhalten müssen, genannt XX hier

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

Leider AFAIK die sklearn API erlaubt keine zusätzlichen Argumente übergeben werden ein Parameter eines Parameters eines Schritts einer Pipeline.

Ich habe

versucht

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

aber das bricht Argument Kaskade vorbei (glaube ich).

Bis jetzt habe ich das gelöst, indem ich einen Wrapper geschrieben habe, wo _XX die Daten sind, die ich brauche, die leider zum Definitionszeitpunkt im Bereich der Funktion sein müssen. Also habe ich am Ende die Funktion innerhalb meiner main Funktion definiert, so dass _XX existiert und es kann übergeben werden.

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

Ich denke, das ist ein wirklich dreckiger Workaround.

Was ist der richtige Weg?

Antwort

0

Sie können das zusätzliche Argument einfach übergeben, während Sie die Funktion make_scorer() aufrufen. Zum Beispiel Sie check this link. Im Beispiel verwendet es fbeta_score. Nun erfordert fbeta einen zusätzlichen Parameter, beta, die während gesetzt wird, um die make_scorer() Funktion wie folgt aufrufen:

ftwo_scorer = make_scorer(fbeta_score, beta=2) 

Also in Ihrem Fall sollte diese Arbeit:

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

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

ich versucht habe, es tut nicht arbeiten. Ich die folgenden Fehler in der basefilter Klasse: File "Basis/base_dataframe.py", Linie 333, in fit score_func_ret self.score_func = (x, y) Typeerror: __call __() nimmt mindestens 4 Argumente (3 gegeben) – ErroriSalvo

+0

so scheint es, die Filter-Klasse muss immer noch auf alle Argumente der score_func zugreifen, um zu arbeiten – ErroriSalvo

+1

@Sabor können Sie bitte die komplette Stapel-Trace –

Verwandte Themen