如何将两个不同的训练有素的 ML 模型组合为一个?

Posted

技术标签:

【中文标题】如何将两个不同的训练有素的 ML 模型组合为一个?【英文标题】:How to combine two different trained ML models as one? 【发布时间】:2021-02-24 07:32:31 【问题描述】:

我已经根据两个不同的数据集训练了两个机器学习模型。然后我将它们保存为 model1.pkl 和 model2.pkl 。有两个用户输入(不是模型的输入数据),例如 x=0 和 x=1,如果 x=0,我必须使用 model1.pkl 进行预测,否则我必须使用 model2.pkl 进行预测。我可以使用 if 条件来完成它们,但我的问题是我必须知道是否有可能将其保存为 model.pkl,包括这个条件语句。如果我将它们组合并保存为模型,它将很容易加载到其他 IDE 中。

【问题讨论】:

【参考方案1】:

您可以创建一个具有最小接口的类,例如这样的模型类:

# create the test setup
import lightgbm as lgb
import pickle as pkl
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import LabelEncoder
#from sklearn
df['x1']= LabelEncoder().fit_transform(df['x1'])

data= 
 'x': [1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0],
 'q': [0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0],
 'b': [1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0],
 'target': [0.0, 2.0, 1.5, 0.0, 5.1, 4.0, 0.0, 1.0, 2.0, 0.0, 2.1, 1.5]

df= pd.DataFrame(data) 
X, y=df.iloc[:, :-1], df.iloc[:, -1]
X= X.astype('float32')

# create two models                 
model1= LinearRegression()
model2 = lgb.LGBMRegressor(n_estimators=5, num_leaves=10, min_child_samples=1) 
ser_model1= X['x']==0.0
model1.fit(X[ser_model1], y[ser_model1])
model2.fit(X[~ser_model1], y[~ser_model1])

# define a class that mocks the model interface
class CombinedModel:
    def __init__(self, model1, model2):
        self.model1= model1
        self.model2= model2
        
    def predict(self, X, **kwargs):
        ser_model1= X['x']==0.0
        return pd.concat([
                pd.Series(self.model1.predict(X[ser_model1]), index=X.index[ser_model1]),
                pd.Series(self.model2.predict(X[~ser_model1]), index=X.index[~ser_model1])
            ]
        ).sort_index()

# create a model with the two trained sum models
# and pickle it
model= CombinedModel(model1, model2)
model.predict(X)
with open('model.pkl', 'wb') as fp:
    pkl.dump(model, fp)
model= model1= model2= None

# test load it
with open('model.pkl', 'rb') as fp:
    model= pkl.load(fp)
model.predict(X)

如果你愿意,当然你也可以在上面的类中实现一个fit方法,它只调用两个模型。如果你实现了必要的方法,你甚至可以在 sklearn 管道中使用这个类。

【讨论】:

【参考方案2】:

您可以使用集成投票分类器,它会考虑两个模型的输出并给出适当的输出。 链接-https://machinelearningmastery.com/voting-ensembles-with-python/

【讨论】:

有可能,但这意味着在任何情况下都使用这两种模型,因此可能导致错误的预测。 但是问题要求将两个模型结合起来进行预测,这不能解决问题吗? 如果您专注于问题的这一方面,是的,但它也指出,模​​型是根据特征的值选择的。这部分不属于投票分类器。 对,得到了部分。谢谢

以上是关于如何将两个不同的训练有素的 ML 模型组合为一个?的主要内容,如果未能解决你的问题,请参考以下文章

按组迭代回归 ML 模型

不确定如何训练 ML 模型来识别静态图像

交叉验证

交叉验证

交叉验证

将两个 SQL 查询的结果组合为单独的列