sklearn2pmml模型转化实践

sklearn2pmml模型转化实践,第1张

在实际的项目应用中,经常会有一些需求就是平台之间模型可以比较通用地进行调用计算,在Python里面,一般搭建机器学习模型的话大都是会选用sklearn来进行的,毕竟这个项目太过于优秀了,训练出来的模型持久化在本地一般可以有几种形式:.m、.model、.h5和.pkl,但是这几种数据格式在java里面都没有办法直接方便地进行使用,这时候就需要对python输出的模型进行格式的转化,以便于其他语言平台可以进行加载使用。

这两天进行了相应的项目开发,已经走通整个流程,这里把完整流程浓缩出来一个教程项目记录一下备忘,也方便需要的朋友。

我这里使用的是常规六因子的数据,数据来源于网络采集,这里就不贴出来,以免出现审核问题,有需要的可以自行获取,数据不重要,用别的数据也都可以,在最开始学习的时候网上一大片都是用的iris或者boston数据集,我是觉得这样的内置数据集太过于简化,没办法细化整个流程,所以这里选择使用自己构建的数据集。

数据集截图如下所示:

       首先是数据集加载:

def loadDataset(data="feature.json", target="pm25"):
    """
    加载数据集
    """
    try:
        with open(data) as f:
            feature = json.load(f)[target]
    except:
        feature = data[target]
    for one_list in feature[:5]:
        print("one_list: ", one_list)
    X, y = [], []
    for one_list in feature:
        X.append(one_list[:-1])
        y.append(one_list[-1])
    return X, y

        之后对原始数据集进行随机划分:

def dataSplit(dataset, label, ratio=0.3):
    """
    数据集划分
    """
    try:
        X_train, X_test, y_train, y_test = train_test_split(
            dataset, label, test_size=ratio
        )
    except:
        dataset, label = np.array(dataset), np.array(label)
        X_train, X_test, y_train, y_test = train_test_split(
            dataset, label, test_size=ratio
        )
    print(
        "--------------------------------split_data shape-----------------------------------"
    )
    print(len(X_train), len(y_train))
    print(len(X_test), len(y_test))
    return X_train, X_test, y_train, y_test

      得到训练集和测试集之后就可以进行模型的构建测试了。

      这里我使用的是线性回归模型,可以根据自己的需求进行替换:

def linearModelTrain(X, y, ratio=0.15, resDir="models/linear/"):
    """
    线性回归模型
    """
    if not os.path.exists(resDir):
        os.makedirs(resDir)
    X_train, X_test, y_train, y_test = dataSplit(X, y, ratio=ratio)
    model = LinearRegression()
    model.fit(X_train, y_train)
    joblib.dump(model,resDir+"model.pkl")
    pipeline = PMMLPipeline([("regressor", model)])
    pipeline.fit(X_train, y_train)
    sklearn2pmml(pipeline, resDir+"model.pmml", with_repr = True)


def mainModel(data="feature.json", ratio=0.3, modelDir="models/linear/"):
    """
    主函数
    """
    for i in range(len(FACTORS_LIST)):
        oneDir = modelDir + FACTORS_LIST[i] + "/"
        if not os.path.exists(oneDir):
            os.makedirs(oneDir)
        X, y = loadDataset(data=data, target=FACTORS_LIST[i])
        linearModelTrain(X, y, ratio=ratio, resDir=oneDir)

            训练完成后,模型存储结果如下:

        我同时存储了pkl格式的模型和pmml格式的模型,可以看到pmml文件会比pkl更大一些。

       接下来对模型进行预测分析,对于同一条样本输入,我会分别使用pkl模型和pmml模型进行预测,最后对比分析可视化:

def pklPredict(modelDir="models/linear/", X=[1, 2, 3]):
    """
    pkl模型预测
    """
    model = joblib.load(modelDir + "model.pkl")
    y_pred = model.predict(X)
    print("y_pred: ", y_pred)
    return y_pred


def pmmlPredict(modelDir="models/linear/", X=[1, 2, 3]):
    """
    pmml模型预测
    """
    model = Model.fromFile(modelDir + "model.pmml")
    y_pred = model.predict(X)
    print("y_pred: ", y_pred)
    return y_pred


def test4Predict(data="data.json"):
    """
    测试分析
    """
    plt.clf()
    plt.figure(figsize=(24, 16))
    for i in range(len(FACTORS_LIST)):
        try:
            with open(data) as f:
                feature = json.load(f)[FACTORS_LIST[i]]
        except:
            feature = data[FACTORS_LIST[i]]
        test = random.sample(feature, 100)
        X, y = [], []
        for one_list in test:
            X.append(one_list[:-1])
            y.append(one_list[-1])
        pkl_pred = pklPredict(modelDir="models/" + FACTORS_LIST[i] + "/", X=X)
        pmml_pred = pklPredict(modelDir="models/" + FACTORS_LIST[i] + "/", X=X)
        plt.subplot(2, 3, i + 1)
        plt.plot(y, label="TrueData", color="r")
        plt.plot(pkl_pred, label="pkl_pred", color="g")
        plt.plot(pmml_pred, label="pmml_pred", color="b")
        R2_1 = calPerformance(y, pkl_pred)[-1]
        R2_2 = calPerformance(pkl_pred, pmml_pred)[-1]
        plt.title(FACTORS_LIST[i] + "\n" + "R2: " + str(R2_1) + ", R2: " + str(R2_2))
    plt.savefig("compare.png")

        结果如下所示:

         这里也验证了我们的猜想,之所以只能够看到红色和蓝色两条曲线,是因为pkl模型和pmml模型的预测结果是完全一样的,后者将前者盖住了,通过标题上面的R2判定系数也可以得到同样的结论。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/759445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-01
下一篇 2022-05-01

发表评论

登录后才能评论

评论列表(0条)

保存