精华内容
下载资源
问答
  • 正好最近写了一篇专栏文章讲模型上线,就同时回答一下这个问题,回答中补充了一些同学分享的模型上线经验。王喆:如何解决推荐系统工程难题——深度学习推荐模型线上serving?...但机器学习模型终究是要在线...

    正好最近写了一篇专栏文章讲模型上线,就同时回答一下这个问题,回答中补充了一些同学分享的模型上线经验。王喆:如何解决推荐系统工程难题——深度学习推荐模型线上serving?​zhuanlan.zhihu.com

    对于机器学习模型的离线训练,很多同学已经非常熟悉,无论是TensorFlow,PyTorch,还是传统一点的Spark MLlib都提供了比较成熟的离线并行训练环境。但机器学习模型终究是要在线上环境进行inference的,如何将离线训练好的模型部署于线上的生产环境,进行线上实时的inference,其实一直是业界的一个难点。这里跟大家讨论一下几种可行的机器学习模型线上serving的方法。

    一、自研平台

    无论是在五六年前深度学习刚兴起的时代,还是TensorFlow,PyTorch已经大行其道的今天,自研机器学习训练与上线的平台仍然是很多大中型公司的重要选项。

    为什么放着灵活且成熟的TensorFlow不用,而要从头到尾进行模型和平台自研呢?重要的原因是由于TensorFlow等通用平台为了灵活性和通用性支持大量冗余的功能,导致平台过重,难以修改和定制。而自研平台的好处是可以根据公司业务和需求进行定制化的实现,并兼顾模型serving的效率。笔者在之前的工作中就曾经参与过FTRL和DNN的实现和线上serving平台的开发。由于不依赖于任何第三方工具,线上serving过程可以根据生产环境进行实现,比如采用Java Server作为线上服务器,那么上线FTRL的过程就是从参数服务器或内存数据库中得到模型参数,然后用Java实现模型inference的逻辑。

    但自研平台的弊端也是显而易见的,由于实现模型的时间成本较高,自研一到两种模型是可行的,但往往无法做到数十种模型的实现、比较、和调优。而在模型结构层出不穷的今天,自研模型的迭代周期过长。因此自研平台和模型往往只在大公司采用,或者在已经确定模型结构的前提下,手动实现inference过程的时候采用。

    二、预训练embedding+轻量级模型

    完全采用自研模型存在工作量大和灵活性差的问题,在各类复杂模型演化迅速的今天,自研模型的弊端更加明显,那么有没有能够结合通用平台的灵活性、功能的多样性,和自研模型线上inference高效性的方法呢?答案是肯定的。

    现在业界的很多公司其实采用了“复杂网络离线训练,生成embedding存入内存数据库,线上实现LR或浅层NN等轻量级模型拟合优化目标”的上线方式。百度曾经成功应用的“双塔”模型是非常典型的例子(如图1)。图1 百度的“双塔”模型

    百度的双塔模型分别用复杂网络对“用户特征”和“广告特征”进行了embedding化,在最后的交叉层之前,用户特征和广告特征之间没有任何交互,这就形成了两个独立的“塔”,因此称为双塔模型。

    在完成双塔模型的训练后,可以把最终的用户embedding和广告embedding存入内存数据库。而在线上inference时,也不用复现复杂网络,只需要实现最后一层的逻辑,在从内存数据库中取出用户embedding和广告embedding之后,通过简单计算即可得到最终的预估结果。

    同样,在graph embedding技术已经非常强大的今天,利用embedding离线训练的方法已经可以融入大量user和item信息。那么利用预训练的embedding就可以大大降低线上预估模型的复杂度,从而使得手动实现深度学习网络的inference逻辑成为可能。

    三、PMML

    Embedding+线上简单模型的方法是实用却高效的。但无论如何还是把模型进行了割裂。不完全是End2End训练+End2End部署这种最“完美”的形式。有没有能够在离线训练完模型之后,直接部署模型的方式呢?本小节介绍一种脱离于平台的通用的模型部署方式PMML。

    PMML的全称是“预测模型标记语言”(Predictive Model Markup Language, PMML)。是一种通用的以XML的形式表示不同模型结构参数的标记语言。在模型上线的过程中,PMML经常作为中间媒介连接离线训练平台和线上预测平台。

    这里以Spark mllib模型的训练和上线过程为例解释PMML在整个机器学习模型训练及上线流程中扮演的角色(如图2)。图2 Spark模型利用PMML的上线过程

    图2中的例子使用了JPMML作为序列化和解析PMML文件的library。JPMML项目分为Spark和Java Server两部分。Spark部分的library完成Spark MLlib模型的序列化,生成PMML文件并保存到线上服务器能够触达的数据库或文件系统中;Java Server部分则完成PMML模型的解析,并生成预估模型,完成和业务逻辑的整合。

    由于JPMML在Java Server部分只进行inference,不用考虑模型训练、分布式部署等一系列问题,因此library比较轻,能够高效的完成预估过程。与JPMML相似的开源项目还有Mleap,同样采用了PMML作为模型转换和上线的媒介。

    事实上,JPMML和MLeap也具备sk-learn,TensorFlow简单模型的转换和上线能力。但针对TensorFlow的复杂模型,PMML语言的表达能力是不够的,因此上线TensorFlow模型就需要TensorFlow的原生支持——TensorFlow Serving。

    四、TensorFlow Serving等原生serving平台

    TensorFlow Serving 是TensorFlow推出的原生的模型serving服务器。本质上讲TensorFlow Serving的工作流程和PMML类的工具的流程是一致的。不同之处在于TensorFlow定义了自己的模型序列化标准。利用TensorFlow自带的模型序列化函数可将训练好的模型参数和结构保存至某文件路径。

    TensorFlow Serving最普遍也是最便捷的serving方式是使用Docker建立模型Serving API。在准备好Docker环境后,仅需要pull image即可完成TensorFlow Serving环境的安装和准备:

    docker pull tensorflow/serving

    在启动该docker container后,也仅需一行命令就可启动模型的serving api:

    tensorflow_model_server --port=8500 --rest_api_port=8501 \

    --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}

    这里仅需注意之前保存模型的路径即可。

    当然,要搭建一套完整的TensorFlow Serving服务并不是一件容易的事情,因为其中涉及到模型更新,整个docker container集群的维护和按需扩展等一系例工程问题;此外,TensorFlow Serving的性能问题也仍被业界诟病。但Tensorflow Serving的易用性和对复杂模型的支持仍使其是上线TensorFlow模型的第一选择。

    除了TensorFlow Serving之外,Amazon的Sagemaker,H2O.ai的H2O平台都是类似的专业用于模型serving的服务。平台的易用性和效率都有保证,但都需要与离线训练平台进行绑定,无法做到跨平台的模型迁移部署。

    五、TensorFlow Serving的二次开发

    TensorFlow Serving的效率问题其实一直是被业界诟病的主要问题。因此很多团队为了提高线上inference效率,采取了剥离TensorFlow Serving主要逻辑,去除冗余功能和步骤等方法,对TensorFlow Serving进行二次开发,与自己的server环境做融合。

    @Stark Einstein 同学在专栏的留言中也提到,他们组的模型上线过程就是把TensorFlow Serving的主要逻辑拆出来,融合到其原有的C++服务中去,成功提高了整体服务的效率。

    总结

    机器学习模型的线上serving问题是非常复杂的工程问题,因为其与公司的线上服务器环境、硬件环境、离线训练环境、数据库/存储系统都有非常紧密的联系。正因为这样,各家采取的方式也都各不相同。可以说在这个问题上,即使本文已经列出了5种主要的上线方法,但也无法囊括所有业界的推荐模型上线方式。甚至于在一个公司内部,针对不同的业务场景,模型的上线方式也都不尽相同。

    因此,作为一名算法工程师,除了应对主流的模型部署方式有所了解之外,还应该针对公司客观的工程环境进行综合权衡后,给出最适合的解决方案。

    最后欢迎大家关注我的微信公众号:王喆的机器学习笔记(wangzhenotes),跟踪计算广告、推荐系统等机器学习领域前沿。

    想进一步交流的同学也可以通过公众号加我的微信一同探讨技术问题,谢谢。

    展开全文
  • 机器学习模型部署,常因开发语言或环境的不同,导致系统或应用无法直接使用离线模型,如在模型训练使用Python,而应用使用Java等其他语言开发。而在此状况下,模型部署上线,通常采用Falsk API服务、PMML、MLflow和...

    机器学习模型部署,常因开发语言或环境的不同,导致系统或应用无法直接使用离线模型,如在模型训练使用Python,而应用使用Java等其他语言开发。而在此状况下,模型部署上线,通常采用Falsk API服务、PMML、MLflow和Mleap等方法。以下将分别介绍Flask API 和PMML模型上线的方法。

    1 Flask API服务

    Flask 安装:pip install flask

    Flask

    是一个使用 Python 编写的轻量级 Web 应用框架,通过Flask将

    Sklearn

    机器学习模型上线,是将Sklarn的模型保存为pkl文件,并在Flask 服务中加载,从而以接口的形式接收数据预测结果。以iris鸢尾花数据集训练模型,并上线部署为例:

    (1)Sklearn模型训练并生成pkl文件,脚本如下:

    from sklearn.datasets import load_iris

    from sklearn.linear_model import LogisticRegression

    from sklearn.preprocessing import MinMaxScaler

    from sklearn.externals import joblib

    #加载iris数据

    iris = load_iris()

    x = iris.data

    y = iris.target

    scaler = MinMaxScaler()

    x_sc = scaler.fit_transform(x)

    clf = LogisticRegression()

    clf.fit(x_sc,y)

    # 模型保存

    joblib.dump(scaler,'MinMaxScalerModel.pkl')

    joblib.dump(clf, 'LogisticRegressionModel.pkl')

    (2)在Flask中加载pkl文件,脚本如下:

    from flask import Flask,request,jsonify

    from sklearn.externals import joblib

    app = Flask(__name__)

    # /invocation是路由地址,methods是支持http方法,可以分为POST和GET

    @app.route('/invocation',methods=["POST"])

    def invocation():

    # 获得post传过来的数据

    data = request.get_json(force=True)

    # 加载MinMaxScalerModel和LogisticRegressionModel

    scaler = joblib.load('MinMaxScalerModel.pkl')

    model = joblib.load('LogisticRegressionModel.pkl')

    #数据归一化及预测

    sc_data = scaler.transform(data)

    pro = model.predict_proba(sc_data)

    info = {'result': str(pro)}

    return jsonify(info)#返回结果

    if __name__ == '__main__':

    # host='0.0.0.0'是为了接口能被局域网中其他机器访问,port为端口号

    app.run(host='0.0.0.0', port=8080)

    根据上述代码,在Flask中加载pkl运行后,http://本机IP:8080/invocation接口即可接收数据并返回预测结果。至此,即可通过该接口,由其他应用或系统调用。测试如下图所示。

    服务测试:curl http://本机IP:8080/invocation -X post -d [[1,2,3,4]]

    结果:{“result”:"[[0.01766997 0.3667034 0.61562663]]"}

    2 PMML

    PMML4.4地址:

    http://dmg.org/pmml/v4-4/GeneralStructure.html

    Sklearn2PMML:

    https://github.com/jpmml/sklearn2pmml

    Sklearn2PMML安装:pip install sklearn2pmml

    PMML(Predictive Model Markup Language)预测模型标记语言,是一种基于XML来描述和存储机器学习模型的方法。通过XML将机器学习模型的描述,导出为PMML文件。从而在不同系统或应用中应用,起到模型跨平台部署的功能。在Python中Sklearn、Xgboost、LightGBM和Kears等库生成的模型,可通过

    sklearn2pmml

    Nyoka

    库进行转换。需注意的是,PMML的预测结果与原模型存在较小偏差。

    表 iris特征缺失填补和特征编码方法

    特征名

    类型

    缺失填补

    特征编码

    sepal length (cm)

    连续型

    1

    StandardScaler

    sepal width (cm)

    连续型

    0.5

    MinMaxScaler

    petal length (cm)

    连续型

    0.6

    None

    petal width (cm)

    连续型

    None

    None

    以iris鸢尾花数据集为例,按上表对特征处理的基础上,使用sklearn2pmml生成PMML文件,脚本如下:

    import pandas as pd

    from sklearn.datasets import load_iris

    from sklearn.decomposition import PCA

    from sklearn.linear_model import LogisticRegression

    from sklearn.preprocessing import MinMaxScaler,StandardScaler

    from sklearn2pmml import sklearn2pmml

    from sklearn_pandas import DataFrameMapper

    from sklearn2pmml.decoration import ContinuousDomain

    from sklearn2pmml.pipeline import PMMLPipeline

    # 加载iris数据

    iris = load_iris()

    x = pd.DataFrame(iris.data, columns=iris.feature_names)

    y = iris.target

    # 特征缺失填补和编码

    # 离散型特征,('特征名',[CategoricalDomain(……),编码方法])

    # 连续型特征,([特征名],[ContinuousDomain(……),编码方法])

    mapper = DataFrameMapper([(['sepal length (cm)'], [ContinuousDomain(missing_value_replacement=1, with_data=False),StandardScaler()]),

    (['sepal width (cm)'], [ContinuousDomain(missing_value_replacement=0.5, with_data=False),MinMaxScaler()]),

    (['petal length (cm)'], [ContinuousDomain(missing_value_replacement=0.6, with_data=False)]),

    (['petal width (cm)'], None)])

    model = LogisticRegression()

    pipeline = PMMLPipeline([("mapper", mapper),("pca", PCA(n_components = 3)), ("classifier", model)])

    pipeline.fit(x, y)

    sklearn2pmml(pipeline, "LogisticRegressionIris.pmml", with_repr=True)

    在PMML生成后,Java可使用开源库

    jpmml-evaluator

    对PMML加载使用。

    展开全文
  • 之前阐述了逻辑回归、孤立森林等建模方法,本文介绍如何把建好的模型保存为标准...训练模型用的Python(里面有很多现成的库,构建机器学习模型较方便),生产调用用的Java(写机器学习模型非常麻烦)。这时需要在Pyth...
    之前阐述了逻辑回归孤立森林等建模方法,本文介绍如何把建好的模型保存为标准格式(PMML文件)。那么,什么情况下需要把模型保存为PMML文件?当模型需要跨平台部署反复调用时,可以把模型保存为PMML文件。比如最近要上线一个反欺诈模型(用的GBDT)。训练模型用的Python(里面有很多现成的库,构建机器学习模型较方便),生产调用用的Java(写机器学习模型非常麻烦)。

    这时需要在Python中把训练好的模型保存为PMML文件,到Java中直接调用预测。

    本文目录
    1. 什么是PMML?

    2. Python中把模型保存为PMML的标准格式

    3. 实例一:把GBDT模型保存为PMML文件

      3.1 导入数据

      3.2 取出建模所需的变量

      3.3 训练模型并保存为PMML文件

    4. 实例二:把随机森林模型保存为PMML文件

      4.1 导入包

      4.2 按标准流程建模并导出PMML文件

    5. PMML的优缺点

      5.1 优点

      5.2 缺点

    一、什么是PMML862928b8fdecf9cbf273cca8be922756.png

    PMML(Predictive Model Markup Language):预测模型标记语言,它用XML格式来描述生成的机器学习模型,是目前表示机器学习模型的实际标准

    若要将在Python中训练好的模型部署到生产上时,可以使用目标环境解析PMML文件的库来加载模型,并做预测。

    二、Python中模型保存为PMML的标准格式862928b8fdecf9cbf273cca8be922756.png

    Python中把模型导出为PMML文件的一般流程如下:

    • step1:特征处理(DataFrameMapper函数)。

    • step2:训练模型(pipeline函数)。

    • step3:导出模型(sklearn2pmml函数)。

    其中step1不是必须步骤。

    接下来看两个具体实例。

    三、实例一:把GBDT模型保存为PMML文件

    862928b8fdecf9cbf273cca8be922756.png

     1  导入数据

    首先导入建模所需数据

    # coding: utf-8import osimport pandas as pd  #导入数据处理的库import numpy as np   #导入数据处理的os.chdir(r'F:\微信公众号\Python\40_机器学习模型导出为PMML文件')data = pd.read_csv('testtdmodel.csv',sep=',',encoding='gb18030')

    注:如需本文数据实现所有代码,可到公众号中回复“PMML”,即可免费获取。

     2  取出建模所需的变量

    本文选取了8个自变量,1个因变量进行建模。

    columns_model = ['1个月内借款人身份证申请借款平台数','3个月内关联P2P网贷平台数','3个月内申请人关联融资租赁平台数','3个月手机号关联身份证数','7天内关联P2P网贷平台数','二度风险名单个数','是否命中身份证风险关注名单','一度风险名单个数']X_model = data[columns_model]y = data['y']

    X_model具体格式如下:

    96c6a7980aad99153b93e44c094e2e2e.png

     3  训练模型并保存为PMML文件

    在实例一中没有进行特征处理(step1),直接训练模型并导出PMML文件。

    from sklearn import treefrom sklearn.model_selection import train_test_splitfrom sklearn2pmml import PMMLPipeline, sklearn2pmmlfrom sklearn.ensemble import GradientBoostingClassifiertrain, test, train_labels, test_labels = train_test_split(X_model, y, test_size=0.2, random_state=0)GBDT = GradientBoostingClassifier(random_state=9,max_depth=5,min_samples_split=10)pipeline = PMMLPipeline([    ("classifier", GBDT)])pipeline.fit(train, train_labels)sklearn2pmml(pipeline, 'GBDT1.pmml', with_repr=True, debug=True)

    参数详解:

    train_test_split:把模型数据按test_size的比例生成训练集和测试集。GBDT:建模所用方法,里面的参数可自行调整random_state:随机种子。max_depth:树的最大深度。min_samples_split限制子树继续划分的条件,如果某节点的样本数目小于此值,则不会再继续划分。pipeline.fit:训练模型,train代表自变量,train_labels代表因变量。sklearn2pmml:把模型保存为PMML文件。

    得到部分结果如下:

    294cf910adf5b1710014b026789ab39b.png

    四、实例二:把随机森林模型保存为PMML862928b8fdecf9cbf273cca8be922756.png

    本例数据和实例一相同,就不赘述了。

    本例按Python中把模型导出为PMML文件的一般流程进行。

     1  加载包

    首先导入数据预处理和建模所需的包

    import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.datasets import load_irisfrom sklearn.ensemble import GradientBoostingClassifierfrom sklearn2pmml import sklearn2pmml, PMMLPipelinefrom sklearn2pmml.decoration import ContinuousDomainfrom sklearn.feature_selection import SelectKBest# frameworks for MLfrom sklearn_pandas import DataFrameMapperfrom sklearn.pipeline import make_pipeline# transformers for category variablesfrom sklearn.preprocessing import LabelBinarizerfrom sklearn.preprocessing import MultiLabelBinarizerfrom sklearn.preprocessing import LabelEncoderfrom sklearn.preprocessing import OneHotEncoder#from sklearn.preprocessing import Imputerfrom sklearn.impute import SimpleImputer# transformers for numerical variablesfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.preprocessing import StandardScalerfrom sklearn.preprocessing import Normalizer# transformers for combined variablesfrom sklearn.decomposition import PCAfrom sklearn.preprocessing import PolynomialFeatures# user-defined transformersfrom sklearn.preprocessing import FunctionTransformer
     2  按标准流程建模并导出PMML文件

    本文选取了8个自变量和一个因变量进行建模,并对其中4个变量进行数据处理。

    #step1:特征工程mapper = DataFrameMapper([          (['1个月内借款人身份证申请借款平台数'],FunctionTransformer(np.abs)),          (['3个月内关联P2P网贷平台数'],OneHotEncoder()),        (['7天内关联P2P网贷平台数', '二度风险名单个数'], [MinMaxScaler(),StandardScaler()])])iris_pipeline = PMMLPipeline([    ("mapper", mapper),    ("pca", PCA(n_components=3)),    ("selector", SelectKBest(k=2)), #返回k个最佳特征    ("classifier", RandomForestClassifier())]) #step2:训练模型iris_pipeline.fit(X_model,y) #step3:导出模型到 RandomForestClassifier_Iris.pmml 文件sklearn2pmml(iris_pipeline, "RandomForestClassifier_Iris.pmml")

    参数详解:

    DataFrameMapper进行数据预处理。

    np.abs:对该列进行绝对值处理。

    OneHotEncoder:对该列进行one-hot编码。

    MinMaxScaler:对该列进行标准化处理(min max 归一化)。

    PCA:主成分分析。

    RandomForestClassifier:随机森林建模。

    iris_pipeline.fit:用通道中设定的方法训练模型。

    sklearn2pmml:把通道中训练好的模型保存为PMML文件。

    生成的PMML文件内容如下:

    98daebb2a2528184b07eea0bd9921a33.png

    如果模型训练和预测用同一种语言,我认为没必要使用PMML。因为R、Python等语言都有标准的输出格式可以直接加载。

    比如在Python中训练了GBDT模型,模型还没有上线,需每天手工打样验证。可以用pickle函数把模型打包,之后要使用直接加载就可以了。

    1d75b6a8ebb8364db1e6afee858de223.png

    如果训练环境和预测环境不一样,在生产上安装(R、Python、Spark等)不方便,可以使用PMML文件的方式,在生成环境直接读取PMML获得训练后的模型。

    五、PMML的优缺点862928b8fdecf9cbf273cca8be922756.png 1  优点
    • 1. 平台无关性。PMML采用标准的XML格式保存模型,可以实现跨平台部署。
    • 2. 广泛的支持性。很多常用的开源模型都可以转换成PMML文件。
    • 3. 易读性。PMML模型文件是一个基于XML的文本文件,任意文本编辑器都可以打开查阅。
     2  缺点
    • 1.对数据预处理的支持有限。虽然已经支持了几乎所有的标准数据处理方式,但是对于自拓展的方法,还缺乏有效支持。

    • 2. 模型类型支持有限。缺乏对深度学习模型的支持。

    • 3. 预测会有一点偏差。因为PMML格式的通用性,会损失特殊模型的特殊优化。

      比如一个样本,用sklearn的决策树模型预测为类别2,但是我们把这个决策树保存为PMML文件,并用JAVA加载后,继续预测刚才这个样本,有较小的概率出现预测的结果不为类别2。

    参考文献:

    https://www.jianshu.com/p/386fa2eb218ahttps://blog.csdn.net/wshzd/article/details/96165636https://blog.csdn.net/hshuihui/article/details/53260922https://blog.csdn.net/yueguanghaidao/article/details/91892549https://www.cnblogs.com/pinard/p/9220199.html
    展开全文
  • 机器学习模型上线主要分为两种方式,一种是基于HTTP服务方式,这种方式需要在生产环境上部署相应的python环境以及相应的python机器学习包,这种方式好处在于将数据预处理部分和模型部分(保存成pkl文件)都能一起...

    一、机器学习模型上线两种方式

    机器学习模型上线主要分为两种方式,一种是基于HTTP服务方式,这种方式需要在生产环境上部署相应的python环境以及相应的python机器学习包,这种方式好处在于将数据预处理部分和模型部分(保存成pkl文件)都能一起部署在HTTP服务中,缺点则是需要在生产上部署相应的python环境;而另一种方式则是通过PMML方式将机器学习模型打包给java环境使用,这种方法好处在于能使生产环境脱离python环境,只需要有java环境即可,但是最大的缺点就是不能将数据预处理部分自己编写的数据处理函数打包成PMML文件,因为PMML文件是用sklearn2pmml导出的,因此它只认识sklearn家族中的函数和模型算法。

    二、HTTP服务上线脚本

    #
    #!coding=UTF-8    
    from http.server import HTTPServer,BaseHTTPRequestHandler    
    import io,shutil,urllib    
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    
    def companyinformationinput(companyname,entType,termDuration,startDuration,numberEmployers,numberEmployees,numberBranches,ratioProvident):
        import numpy as np
        import pandas as pd
        try:
            predData=pd.DataFrame()
            predData['企业名称(entName)']=[companyname]
            predData['企业类型(entType)']=[entType]
            predData['营业时长']=[int(termDuration)]
            predData['成立时长']=[int(startDuration)]
            predData['所有股东人数(employees)']=[int(numberEmployers)]
            predData['主要人员数(employees)']=[int(numberEmployees)]
            predData['分支机构数(branches)']=[int(numberBranches)]
            predData['单位比例']=[float(ratioProvident)]
            #读取自定义词典
            f = open('word2index.txt','r')
            word2index = f.read()
            word2index = eval(word2index)
            f.close()
            word2index
            #对企业类型编码,若企业类型从未出现过,则编码为0
            predData['企业类型(entType)']=[word2index[predData['企业类型(entType)'][i]] if predData['企业类型(entType)'][i] in word2index.keys() else 0 for i in range(len(predData['企业类型(entType)']))]
            predData1=pd.DataFrame(predData,columns=['企业类型(entType)', '营业时长', '成立时长', '所有股东人数(employees)','主要人员数(employees)', '分支机构数(branches)', '单位比例'])
            #导入保存好的模型
            from sklearn.externals import joblib
            classifier_RandomForest=joblib.load('classifier_RandomForestModelwordsvectornotin.pkl')
            #预测结果
            dictionnary={1:'A',2:'B',3:'C',4:'D'}
            y_pred=pd.Series(classifier_RandomForest.predict(predData1)).map(dictionnary)
            y_pred=y_pred[0]
        except:
    #        y_pred=['无此信息,请手工查询']*len(predData['企业名称(entName)'])
            y_pred='NULL'
    #    aaa=[]
    #    for i in range(len(predData['企业名称(entName)'])):
    ##        aaa.append('您所查询的企业:'+predData['企业名称(entName)'][i]+'类型为:'+y_pred[i]+'(仅供参考,如有疑问请手工查询)')
    #        aaa.append(y_pred[i])
        return y_pred
    
    
    #def randomforest(a,b):
    #    #模型加载
    #    X_test=np.arra
    

    三、PMML文件打包上线脚本

    from sklearn_pandas import DataFrameMapper, cross_val_score
    import sklearn.decomposition 
    from sklearn.feature_extraction.text import CountVectorizer
    import pandas as pd 
    import numpy as np 
    import xgboost as xgb 
    import random 
    import os 
    from datetime import date,datetime 
    from sklearn.linear_model import LogisticRegression 
    from sklearn.svm import SVC 
    from sklearn.metrics import roc_curve,roc_auc_score 
    from sklearn.model_selection import train_test_split 
    from sklearn.preprocessing import Normalizer
    from sklearn.preprocessing import StandardScaler as SS 
    from sklearn.preprocessing import MinMaxScaler as MM 
    from sklearn.preprocessing import LabelEncoder
    from sklearn.preprocessing import LabelBinarizer as LB 
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.externals import joblib 
    from sklearn_pandas import DataFrameMapper
    from sklearn2pmml import PMMLPipeline
    import pandas as pd
    from sklearn.preprocessing import FunctionTransformer
    from sklearn.ensemble import RandomForestClassifier
    from sklearn2pmml import sklearn2pmml
    
    import sys
    sys.path.append('E:\Java')
    sys.path.append('E:\Java\jdk1')
    sys.path
    
    
    heart_data=pd.read_csv("heart.csv")
    
    
    class A:
        def fit(self,X,params):
            pass
        def transform(self,X):
            return 3*X
    
    
    
    pipeline2 = PMMLPipeline([("test", A())])
    pipeline2.fit(2)
    pipeline2.transform(2)
    
    
    #aa=A()
    #aa.fit(5,10)
    #aa.transform(5)
    
    
    
    #用Mapper定义特征工程
    mapper = DataFrameMapper([
        (['sbp'], MM()),
        (['tobacco'], MM()),
        ('ldl', None),
        ('adiposity', None),
    #    (['famhist'], LB()),
        ('typea', None),
        ('obesity', None),
        ('alcohol', None),
        (['age'], FunctionTransformer(np.log)),
    ]) 
    
    #用pipeline定义使用的模型,特征工程等
    pipeline = PMMLPipeline([
       ('mapper', mapper),
    #   ("classifier", RandomForestClassifier())
    ])
    
    
    pipeline.fit(heart_data[heart_data.columns.difference(["chd","famhist"])])
    aaa=pipeline.transform(heart_data[heart_data.columns.difference(["chd","famhist"])])
    
    sklearn2pmml(pipeline,"aaa.pmml",with_repr=True)  
    
    
    pipeline1 = PMMLPipeline([
    #   ('mapper', mapper),
       ("classifier", RandomForestClassifier())
    ])
    
    pipeline1.fit(heart_data[heart_data.columns.difference(["chd","famhist"])],heart_data["chd"])
    aaa=pipeline1.predict(heart_data[heart_data.columns.difference(["chd","famhist"])])
    
    mapper.transformed_names_
    
    sklearn2pmml(pipeline1,"bbb.pmml",with_repr=True)  
    

    在上面代码代码中,不能对自己定义的数据预处理函数进行sklearn2pmml的输出,因为sklearn2pmml是sklearn中的家族,所以不认识上面mapper数据预处理中自己定义的A类中的函数,如果是sklearn下面的一些数据预处理函数,它可以导出为pmml文件;如果不考虑导出pmml文件,只是对数据在python环境下进行离线处理,则可以用自定义的A类函数并嵌入在mapper和pipeline中使用。

    展开全文
  •     机器学习模型部署,常因开发语言或环境的不同,导致系统或应用无法直接使用离线模型,如在模型训练使用Python,而应用使用Java等其他语言开发。而在此状况下,模型部署上线,通常采用Falsk API服务、PMML、...
  • 目前比较流行的4类机器学习模型上线的形式: 1、离线预测 + 不跨语言 这种形式最简单,就是用什么语言训练的就用什么语言预测,而且不用考虑高并发和响应时间等问题。 案例1:python训练 + airflow调度 使用...
  • 机器学习模型线上部署方法总结

    千次阅读 2019-05-07 17:05:30
    目前存在的几种模型上线的方式 1、R+pmml+spark+airflow调度 其他团队用R语言训练模型并转为pmml文件,然后我们使用spark将这个pmml文件封装为jar,使用airflow提交到yarn。val is: InputStream = fs.open(path) ...
  • 此时我们就可以考虑用预测模型标记语言(Predictive Model Markup Language,以下简称PMML)来实现跨平台的机器学习模型部署。 1. PMML概述 PMML是数据挖掘的一种通用的规范,它用统一的XML格式来描.
  • 目前存在的几种模型上线的方式1、R+pmml+spark+airflow调度其他团队用R语言训练模型并转为pmml文件,然后我们使用spark将这个pmml文件封装为jar,使用airflow提交到yarn。val is: InputStream = fs.open(path)val ...
  • 算法模型部署上线工程实践

    千次阅读 2019-05-07 15:13:27
    作者:潘鹏举,携程酒店研发BI经理,负责酒店服务相关的业务建模工作,主要研究方向是用机器学习实现业务流程自动化、系统智能化、效率最优化,专注于算法实践和应用。 我们经常会碰到一个问题:用了复杂的GBDT...
  • 1、自己开发完高斯混合聚类模型,需要发布上线部署,进行线上应用。由于公司每天日活数据有1.8亿,使用单机版的模型预测不现实,一天根本跑不完;于是使用分布式计算框架spark来解决大数据量情况下模型线上预测的...
  • 我们经常会碰到一个问题:用了复杂的GBDT或者xgboost大大提升了模型效果,可是在上线的时候又犯难了,工程师说这个模型太...这些疑问,我们以前碰到过,通过不断的摸索,试验出了不同的复杂机器学习上线方法,来...
  • 关于深度学习模型部署 问题分析 首先是模型的使用场景,根据使用场景就可以获取到对应的性能等要求。举个例子来说,如果是要上线给用户使用的,哦吼,恭喜你,这块最起码速度要求就很高,毕竟用户可不像自己人,...
  • 工作中,线下模型训练好以后,可以使用Flask Web框架,将其部署上线。用户通过API借口对模型进行调用。 一、Flask框架主要分为一下三个流程: 1、导入Flask类 app = Flask(name) 2、注册服务器 @app.route(’/’,...
  • 模型训练好后的部署上线,如果考虑跨平台的问题,针对目前很多web应用,都是基于java框架的,那么就需要java能够解析python训练出的模型文件,这时候就要借助一个第三方语言工具—— PMML(预测模型标记语言)。...
  • 转︱机器学习算法线上部署方法

    千次阅读 2017-02-04 17:17:28
    作者:潘鹏举,携程酒店研发BI经理,负责酒店服务相关的业务建模工作,主要研究方向是用机器学习实现业务流程自动化、系统智能化、效率最优化,专注于算法实践和应用。 我们经常会碰到一个问题:用了复杂的GBDT或者...
  • 机器学习算法线上部署方法

    千次阅读 2017-06-23 10:47:34
    我们经常会碰到一个问题:用了复杂的GBDT或者xgboost大大提升了模型效果,可是在上线的时候又犯难了,工程师说这个模型太复杂了,我...这些疑问,我们以前碰到过,通过不断的摸索,试验出了不同的复杂机器学习上线
  • 作者:潘鹏举,携程酒店研发BI经理,负责酒店服务相关的业务建模工作,主要研究方向是用机器学习实现业务流程自动化、系统智能化、效率最优化,专注于算法实践和应用。 我们经常会碰到一个问题:用了复杂的GBDT...
  • 机器学习基础知识 ...机器学习模型的分类 可以分为两大类: 监督学习:使用已标记数据来学习。“已标记”很关键,训练集必须是有标签的,不然就很难使用监督学习的模型。像经典的Kaggle的泰坦尼克号那个比赛就
  • 本文以一个小项目带你弄清ML的项目流程这周做作业查资料时,无意中看到一个GitHub项目ML-web-app,它以PyTorch训练MNIST文字识别模型为例,介绍了从模型训练到部署上线...
  • 出品 | 51Testing软件测试网8.3 机器学习测试重点在测试之前我们可能会有一些疑问,比如:1)模型能力达到怎样的标准可以部署到生产环境?2)如何设计测试用例才能以最小的成本完成上述标准的测试?3)如何获取测试数据...
  • 机器学习现在在很多地方都是...话不多说,一个机器学习模型的开发周期一般可以分为: 1、业务需求挖掘(Business insight) 2、数据搜集处理(Data Curation) 3、模型训练开发(Modeling) 4、部署及测试上线(Depl...
  • 如下面例子所示:这个偏差不是偶然的的,刘建平Pinard在《用PMML实现机器学习模型的跨平台上线》中说PMML加载得到的模型和算法库自己独有的模型相比,预测会有一点点的偏差,知乎问题《如何看待pmml标准在...
  • 1、PMLL概述用python训练好的机器学习模型如果上线部署,被java调用,可以将模型保存为pmml文件,那么什么是pmml呢?PMML是数据挖掘的一种通用的规范,它用统一的XML格式来描述我们生成的机器学习模型。这样无论你的...

空空如也

空空如也

1 2 3 4 5
收藏数 82
精华内容 32
关键字:

机器学习模型部署上线