Python 使用自定义回归函数传递参数的Pipeline和GridSearchCV?

Python 使用自定义回归函数传递参数的Pipeline和GridSearchCV?,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,我正在尝试将Pipeline和GridSearchCV与自定义回归函数一起使用 我已经找到了使用sklearn.svm.SVR的方法,通过设置它的类,然后在设置GridSearchCV时从字典中传递参数 当我使用自己的回归函数(RegFn)时,我似乎不能做同样的事情。特别是,我希望在设置时将参数字典中的值传递给RegFn 非常感谢你给我指点如何让它工作 from sklearn.preprocessing import StandardScaler from sklearn.model_sel

我正在尝试将Pipeline和GridSearchCV与自定义回归函数一起使用

我已经找到了使用sklearn.svm.SVR的方法,通过设置它的类,然后在设置GridSearchCV时从字典中传递参数

当我使用自己的回归函数(RegFn)时,我似乎不能做同样的事情。特别是,我希望在设置时将参数字典中的值传递给RegFn

非常感谢你给我指点如何让它工作

from sklearn.preprocessing import StandardScaler 
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline   
from sklearn.base import BaseEstimator,RegressorMixin                                                  


parameters = dict(regfn__i=i, regfn__j=j, regfn__k=k)  
regfn = RegFn(numInputs=noinputs, numOutputs=1, i = 100, j = 1, k =0.5)
scaler = StandardScaler()   

steps = [ ('scaler', scaler), ('regfn', regfn   ) ]  

grid = GridSearchCV(Pipeline(steps), param_grid=parameters, cv=splits, refit=True, verbose=3, n_jobs=1) 
更新了班级结构

class RBF(BaseEstimator,RegressorMixin):

    def __init__(self, i,j,k,numInputs=10,numOutputs=1):
        self.numInputs = numInputs
        self.numOutputs = numOutputs
        self.i = i
        self.j = j
        self.k = k
        .....

    def fit(self, x, y):
      ....

    def predict(self, x):
      ....

我仍然无法从字典中传递I,j,k值。我是否以正确的方式引用它们?

如果您想使用自定义估计器,它应该实现方法
fit()
predict()

如果您希望能够将参数传递给估计器,您还应该实现
\uuu init\uu()
方法

:


PS请注意,上面的示例显示了如何创建自定义分类器,因此它可能包含一个不太适合回归器的代码

您是否从
BaseEstimator
继承了
RegFn
?您需要将参数从
RegFn\uu i
更改为
RegFn\uu i
。它们应该与传递到管道的名称相同。在这种情况下,最好将ClassifierMixin替换为RegressionOrMixin:)对于回归案例,使用
self.classes\uu=unique\u标签(y)
也没有任何意义。但我想OP会明白的。谢谢。我已经试过了,但无法正确地传递值。我不知道该怎么称呼他们。我已更新消息。@tmn103,您是否收到任何错误消息或警告?在
dict(regfn\uuu i=i,regfn\uu j=j,regfn\uu k=k)中,作为
i
j
k
传递的是什么?@tmn103,我认为最简单的方法是在
初始化方法中指定默认值。示例:
def\uuuu init\uuuu(self,i=0,j=0,k=0,numinput=10,numoutput=1):
>>> import numpy as np
>>> from sklearn.base import BaseEstimator, RegressorMixin
>>> from sklearn.utils.validation import check_X_y, check_array, check_is_fitted
>>> from sklearn.utils.multiclass import unique_labels
>>> from sklearn.metrics import euclidean_distances
>>> class TemplateClassifier(BaseEstimator, RegressorMixin):
...
...     def __init__(self, demo_param='demo'):
...         self.demo_param = demo_param
...
...     def fit(self, X, y):
...
...         # Check that X and y have correct shape
...         X, y = check_X_y(X, y)
...         # Store the classes seen during fit
...         self.classes_ = unique_labels(y)
...
...         self.X_ = X
...         self.y_ = y
...         # Return the classifier
...         return self
...
...     def predict(self, X):
...
...         # Check is fit had been called
...         check_is_fitted(self, ['X_', 'y_'])
...
...         # Input validation
...         X = check_array(X)
...
...         closest = np.argmin(euclidean_distances(X, self.X_), axis=1)
...         return self.y_[closest]