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

问题描述 投票:1回答:1

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

定义我自己的benchmark_model(),它实现了自定义拟合方法。 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)

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

但是,当我使用我的自定义基准模型作为管道的一部分时,它不再起作用。

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

NotFittedError:此benchmark_model实例尚未安装。在使用此方法之前,使用适当的参数调用'fit'。

python scikit-learn linear-regression
1个回答
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的一个实例。

© www.soinside.com 2019 - 2024. All rights reserved.