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

Python 在sklearn管道中为模型实现custom.fit()方法,python,scikit-learn,linear-regression,Python,Scikit Learn,Linear Regression,我在交叉验证中使用了许多管道进行比较。作为基准模型,我想包括一个简单的模型,它总是使用相同的固定系数,因此不依赖于训练数据。为了得到我想要的模型,我决定继承线性模型的所有行为,并实现我自己的.fit()方法,它实际上不查看列车数据,而是始终使用存储的模型 当使用我的自定义实现作为模型时,它工作得很好,但是,作为管道的一部分,我得到一个NotFitteError 创建我的简单基准模型并存储它: import numpy as np import pickle from sklearn.linear

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

当使用我的自定义实现作为模型时,它工作得很好,但是,作为管道的一部分,我得到一个NotFitteError

创建我的简单基准模型并存储它:

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方法打开存储的模型

class benchmark_model(LinearRegression):
      def fit(self, X, y = None):
            self = pickle.load(open('benchmark_model.txt', 'rb')) 
            return self
在不同的数据上测试定制的fit实现作为模型似乎进展顺利

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)
NotFitteError:此基准测试模型实例尚未安装。使用此方法之前,请使用适当的参数调用“fit”


我假设当
benchmark\u model.fit()
返回类
LinearRegression
而不是
benchmark\u model
的实例时,管道会变得混乱。如果我们只是从固定模型复制学习到的参数,这似乎是可行的:

class benchmark\u模型(线性回归):
def配合(自身、X、y=无):
修复了模型=pickle.load(打开('benchmark_model.txt','rb'))
self.coef=固定模型.coef_
自截距=固定截距_
回归自我
现在
fit
实际上返回了
benchmark\u model
的一个实例