在sklearn管道中为模型实现自定义.fit()方法

时间:2019-04-19 08:22:11

标签: python scikit-learn linear-regression

我正在使用许多管道在交叉验证中进行比较。作为基准模型,我想包括一个简单的模型,该模型始终使用相同的固定系数,因此不依赖于训练数据。为了获得模型,我决定继承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:此基准测试模型实例尚未安装。使用此方法之前,请使用适当的参数调用“适合”。

1 个答案:

答案 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的实例。