代码之家  ›  专栏  ›  技术社区  ›  Fredz0r

在sklearn管道中实现模型的custom.fit()方法

  •  0
  • Fredz0r  · 技术社区  · 5 年前

    我在交叉验证中使用了许多管道进行比较。作为一个基准模型,我想包括一个简单的模型,它总是使用相同的固定系数,因此,不依赖于训练数据。为了得到我想要的模型,我决定继承sklearns线性模型的所有行为并实现我自己的.fit()方法,它实际上并不查看列车数据,而是始终使用存储的模型。

    当使用我的自定义实现作为模型时,它工作得很好,但是作为管道的一部分,我得到了 不适合箭头 .

    import numpy as np
    import pickle
    from sklearn.linear_model import LinearRegression
    from sklearn.pipeline import Pipeline
    
    X = np.array([[1],[2],[3]])
    y = [10,20,30]
    
    model = LinearRegression(fit_intercept=False).fit(X,y)
    pickle.dump(model, open('benchmark_model.txt', 'wb'))
    print (model.coef_)
    

    [10.]

    定义我自己的benchmark_model(),它实现了自定义的fit方法。fit方法打开存储的模型

    class benchmark_model(LinearRegression):
          def fit(self, X, y = None):
                self = pickle.load(open('benchmark_model.txt', 'rb')) 
                return self
    

    X=np.array([[1],[2],[3]])
    y=[5,10,15]
    
    model = benchmark_model()
    model = model.fit(X,y)
    
    print (model.coef_)
    print (model.predict(X))
    

    [10.] 〔10〕。20岁。30.]

    现在,我首先使用一个正常的线性回归作为管道的一部分,它看起来像预期的那样:

    pipe = Pipeline([('model',LinearRegression())])
    pipe.fit(X,y).predict(X)
    

    数组([5,10,15.])

    pipe = Pipeline([('model',benchmark_model())])
    pipe.fit(X,y).predict(X)
    

    notfittedror:此基准模型实例尚未安装。在使用此方法之前,请使用适当的参数调用“fit”。

    0 回复  |  直到 5 年前
        1
  •  1
  •   rvf    5 年前

    我想管道在 benchmark_model.fit() 返回类的实例 LinearRegression 而不是 benchmark_model . 如果我们只是从固定模型中复制学习到的参数,那么这似乎是可行的:

    class benchmark_model(LinearRegression):
        def fit(self, X, y = None):
            fixed_model = pickle.load(open('benchmark_model.txt', 'rb')) 
            self.coef_ = fixed_model.coef_
            self.intercept_ = fixed_model.intercept_
            return self
    

    fit 实际返回的实例 基准模型