我正在使用许多管道在交叉验证中进行比较。作为基准模型,我想包括一个简单的模型,该模型始终使用相同的固定系数,因此不依赖于训练数据。为了获得模型,我决定继承sklearns线性模型的所有行为,并实现自己的.fit()方法,该方法实际上不查看火车数据,但始终使用存储的模型。
将自定义实现用作模型时,它可以很好地工作,但是,作为管道的一部分,我会收到一个 NotFittedError 。
创建我的简单基准模型并将其存储:
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。]
定义我自己的beta_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。]
现在,我首先将普通的LinearRegression用作管道的一部分,该管道似乎按预期运行:
pipe = Pipeline([('model',LinearRegression())])
pipe.fit(X,y).predict(X)
array([5.,10.,15。])
但是,当我将自定义基准模型用作管道的一部分时,它将不再起作用。
pipe = Pipeline([('model',benchmark_model())])
pipe.fit(X,y).predict(X)
NotFittedError:此基准测试模型实例尚未安装。使用此方法之前,请使用适当的参数调用“适合”。
答案 0 :(得分:1)
我认为,当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
实际上返回benchmark_model
的实例。