Pandas 如何将两个不同的经过训练的ML模型组合为一个模型?

Pandas 如何将两个不同的经过训练的ML模型组合为一个模型?,pandas,machine-learning,model,conditional-statements,pickle,Pandas,Machine Learning,Model,Conditional Statements,Pickle,我已经基于两个不同的数据集训练了两个ml模型。然后我将它们保存为model1.pkl和model2.pkl。有两个用户输入(不是模型的输入数据),比如x=0和x=1,如果x=0,我必须使用model1.pkl进行预测,否则我必须使用model2.pkl进行预测。我可以使用if条件来执行这些操作,但我的问题是,我必须知道是否有可能将其保存为model.pkl,包括此条件语句。如果我将它们组合起来并另存为模型,则可以很容易地在其他IDE中加载。您可以创建一个类,该类具有一个最小的接口,如模型类,如下

我已经基于两个不同的数据集训练了两个ml模型。然后我将它们保存为model1.pkl和model2.pkl。有两个用户输入(不是模型的输入数据),比如x=0和x=1,如果x=0,我必须使用model1.pkl进行预测,否则我必须使用model2.pkl进行预测。我可以使用if条件来执行这些操作,但我的问题是,我必须知道是否有可能将其保存为model.pkl,包括此条件语句。如果我将它们组合起来并另存为模型,则可以很容易地在其他IDE中加载。

您可以创建一个类,该类具有一个最小的接口,如模型类,如下所示:

# 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管道中使用该类。

您可以创建一个类,该类有一个最小的接口,如下面的模型类:

# 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方法,它只调用两个模型。如果你实现了必要的方法,你甚至可以在SKPURE流水线中使用这个类。

< P>你可以使用集合投票分类器,它将考虑两个模型的输出并给出适当的输出。
Link -</P> < P>可以使用集合投票分类器来考虑两个模型的输出,并给出适当的输出。
链接-

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