如何在sklearn中使用自定义估计器与GridSearchCV?

我有一个应该与sklearn API兼容的估计器。我试图使用gridsearchcv来拟合这个估计器的一个参数,但我不知道如何操作。

这是我的代码:

import numpy as npimport sklearn as skfrom sklearn.linear_model import LinearRegression, LassoLarsCV, RidgeCVfrom sklearn.linear_model.base import LinearClassifierMixin, SparseCoefMixin, BaseEstimatorclass ELM(BaseEstimator):    def __init__(self, n_nodes, link='rbf', output_function='lasso', n_jobs=1, c=1):        self.n_jobs = n_jobs        self.n_nodes = n_nodes        self.c = c        if link == 'rbf':            self.link = lambda z: np.exp(-z*z)        elif link == 'sig':            self.link = lambda z: 1./(1 + np.exp(-z))         elif link == 'id':            self.link = lambda z: z        else:            self.link = link        if output_function == 'lasso':            self.output_function = LassoLarsCV(cv=10, n_jobs=self.n_jobs)        elif output_function == 'lr':            self.output_function = LinearRegression(n_jobs=self.n_jobs)        elif output_function == 'ridge':            self.output_function = RidgeCV(cv=10)        else:            self.output_function = output_function        return     def H(self, x):        n, p = x.shape        xw = np.dot(x, self.w.T)        xw = xw + np.ones((n, 1)).dot(self.b.T)        return self.link(xw)    def fit(self, x, y, w=None):        n, p = x.shape        self.mean_y = y.mean()        if w == None:            self.w = np.random.uniform(-self.c, self.c, (self.n_nodes, p))        else:            self.w = w        self.b = np.random.uniform(-self.c, self.c, (self.n_nodes, 1))        self.h_train = self.H(x)        self.output_function.fit(self.h_train, y)        return self    def predict(self, x):        self.h_predict = self.H(x)        return self.output_function.predict(self.h_predict)    def get_params(self, deep=True):        return {"n_nodes": self.n_nodes,                 "link": self.link,                "output_function": self.output_function,                "n_jobs": self.n_jobs,                 "c": self.c}    def set_params(self, **parameters):        for parameter, value in parameters.items():            setattr(self, parameter, value)### Fit the c parameter ### X = np.random.normal(0, 1, (100,5))y = X[:,1] * X[:,2] + np.random.normal(0, .1, 100) gs = sk.grid_search.GridSearchCV(ELM(n_nodes=20, output_function='lr'),                                  cv=5,                                  param_grid={"c":np.linspace(0.0001,1,10)},                                 fit_params={})#gs.fit(X, y) # Error

回答:

你的代码中有两个问题:

  1. 你没有为GridSearchCV指定scoring参数。你似乎在做回归,所以mean_squared_error是一个选项。

  2. 你的set_params方法没有返回对象本身的引用。你应该在for循环之后添加return self

    正如Andreas已经提到的,在scikit-learn中,你很少需要重新定义set_paramsget_params。只需继承自BaseEstimator就足够了。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注