如何将两个不同的训练有素的 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 模型组合为一个?的主要内容,如果未能解决你的问题,请参考以下文章