【问题标题】:how to use GridSearchCV with custom estimator in sklearn?如何在 sklearn 中使用带有自定义估算器的 GridSearchCV?
【发布时间】:2015-06-06 06:34:37
【问题描述】:

我有一个应该与 sklearn api 兼容的估算器。我试图用gridsearchcv 拟合这个估计器的一个参数,但我不明白该怎么做。

这是我的代码:

import numpy as np
import sklearn as sk

from sklearn.linear_model import LinearRegression, LassoLarsCV, RidgeCV
from sklearn.linear_model.base import LinearClassifierMixin, SparseCoefMixin, BaseEstimator


class 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

【问题讨论】:

  • 您是否阅读了错误信息?您使用哪个指标?

标签: python machine-learning scikit-learn


【解决方案1】:

您的代码中有两个问题:

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

  2. 您的set_params 不会返回对对象本身的引用。您应该在for 循环之后添加return self。

    正如 Andreas 已经提到的,您很少需要在 scikit-learn 中重新定义 set_params 和 get_params。只需从BaseEstimator 继承就足够了。

【讨论】:

    【解决方案2】:

    您从 BaseEstimator 继承。它应该可以工作。见https://scikit-learn.org/dev/developers/develop.html

    仅供参考,您可能会感兴趣:https://github.com/scikit-learn/scikit-learn/pull/3306

    【讨论】:

    猜你喜欢
    • 2019-06-11
    • 1970-01-01
    • 2019-01-08
    • 2019-07-05
    • 2022-07-19
    • 2020-03-02
    • 2019-05-22
    • 2013-12-18
    • 1970-01-01
    相关资源
    最近更新 更多