如何合并两个不同输入的sklearn模型为单个可部署Azure ML模型
完全可以实现,最优方案是自定义符合Sklearn API规范的复合路由模型,既可以实现你需要的内部分组判断逻辑,又能直接导出为单个.pkl/.joblib文件,完全适配Azure ML的部署要求,无需依赖集成类方法。
实现步骤
- 定义自定义估算器类,继承Sklearn的基础类以兼容原生API:
from sklearn.base import BaseEstimator, RegressorMixin import joblib import pandas as pd class GroupRoutingRegressor(BaseEstimator, RegressorMixin): def __init__(self, group_col: str, a_model, a_feature_names: list, b_model, b_feature_names: list): # 参数说明: # group_col: 你的二分类变量的列名 # a_model: 提前训练好的A类对应的回归模型 # a_feature_names: A类模型需要用到的4个数值特征的列名列表 # b_model: 提前训练好的B类对应的回归模型 # b_feature_names: B类模型需要用到的5个数值特征的列名列表 self.group_col = group_col self.a_model = a_model self.a_feature_names = a_feature_names self.b_model = b_model self.b_feature_names = b_feature_names def fit(self, X, y=None): # 两个子模型已提前完成训练,fit方法无需额外逻辑,直接返回实例即可 # 如需在该类中统一训练两个子模型,可在此处添加分组训练逻辑 return self def predict(self, X): # 高性能批量预测实现:先拆分分组再批量预测,避免逐行遍历开销 a_mask = X[self.group_col] == 'A' X_a = X.loc[a_mask, self.a_feature_names] X_b = X.loc[~a_mask, self.b_feature_names] # 生成预测结果 pred_series = pd.Series(dtype='float64', index=X.index) if len(X_a) > 0: pred_series[a_mask] = self.a_model.predict(X_a) if len(X_b) > 0: pred_series[~a_mask] = self.b_model.predict(X_b) return pred_series.values
- 实例化合并模型并导出
假设你已经完成两个子模型的训练,A类特征列表为['f1','f2','f3','f4'],B类特征列表为['f5','f6','f7','f8','f9'],二分类列名为category,按如下方式生成合并模型:
# 传入已训练好的model_a、model_b和对应配置 combined_model = GroupRoutingRegressor( group_col="category", a_model=model_a, a_feature_names=["f1","f2","f3","f4"], b_model=model_b, b_feature_names=["f5","f6","f7","f8","f9"] ) # 导出为单个joblib文件,和普通Sklearn模型导出方式完全一致 joblib.dump(combined_model, "cost_predict_model.joblib")
- Azure ML部署说明
导出的合并模型和普通Sklearn模型的部署流程完全相同,推理脚本中直接加载模型,传入全部10个输入特征(9个数值变量+1个二分类变量),调用predict方法即可直接得到成本预测结果,无需额外调整逻辑。
内容的提问来源于stack exchange,提问作者bportela
相关产品推荐
相关产品推荐

