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

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

【问题讨论】:

    标签: pandas machine-learning model conditional-statements pickle


    【解决方案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/

      【讨论】:

      • 有可能,但这意味着在任何情况下都使用这两种模型,因此可能导致错误的预测。
      • 但是问题要求将两个模型结合起来进行预测,这不能解决问题吗?
      • 如果您专注于问题的这一方面,是的,但它也指出,模​​型是根据特征的值选择的。这部分不属于投票分类器。
      • 对,得到了部分。谢谢
      猜你喜欢
      • 2018-12-20
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2018-09-02
      • 2018-08-26
      • 1970-01-01
      • 2017-12-31
      • 2021-02-20
      相关资源
      最近更新 更多