我在交叉验证中使用了许多管道进行比较。作为一个基准模型,我想包括一个简单的模型,它总是使用相同的固定系数,因此,不依赖于训练数据。为了得到我想要的模型,我决定继承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”。