您当前的位置:网站首页>告白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青

告白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青

2019-04-09 21:44:34 投稿作者:admin 围观人数:335 评论人数:0次

机器之心修改

参加:思源


你是否常练习炫酷的机器学习模型,用来剖析数据或履行某些别致的使命?你是否发现你的模型只能在必定开发环境上才干跑起来,很难布置也很难参加其它程序?今日咱们将介绍一个炫酷的东西,它能够把构建在 scikit-learn 桔或 XGBoost 等库上的 ML 模型直接转化为不需求任何依靠项的 Java/Python/C喜欢夜蒲4 源代码。


  • 项目地址:https://github.com/BayesW药流的最佳时刻itnesses/m2cgen融水苗歌/


那么转化为 Java/Python/C 源代码有什么用呢?幻想一下假如咱们运用 ML 结构(scikit-learn\XGBoost\LightGBM)练习了一个模型,现在咱们期望把这个模型做成运用或嵌入到已有的模型中,那么咱们必定需求考虑这些问题:


  • 假如产品环境并没有 Python 运行时怎么办?

  • 假如产品不能经过云服务器进行核算,只能在本地进行怎么办?

  • ML 模型的揣度速度太慢又怎么办?


这些问题都很难处理,也是开发者在做自己项目经常遇到的问题。假如咱们能将用 Python 和 ML 库构建的模型转化一下,变成纯 Java 或 C 写的代码,且这些代码不会依靠各种库,那么布置或嵌入不就简略了么。在 m2cgen 这个项目中,它就能够将 ML 模型转化为不带有依靠项的纯代码。


m2cgen(Model 2 Code Generator)是一个轻量级的 Python 库,它能快速快捷地将已练习核算模型转化为 Python、C 和 Java 代码。现在 m2cgen 现已支撑各种分类模型与回归模型,包含支撑向量机、决策树、随机森林和梯度提高树等,留意这些都是核算机器学习模型,深度神经网络仍是老老实实运用 DL 结构吧。


模型转化作用


咱们能够经过几个简略事例了解 m2cgen 是怎么转化为纯代码的,简略而言即把模型架构和权重显化了。如下所示假如咱们简略地练习一个线性回归模型,当然代码看着简略是因为咱们直接调用了 scikit-learn 库中的模型。


from sklearn.datasets import load_boston
from sklearn import linear_model
import m2cgen as m2c

boston = load_boston()
X, y = boston.data, boston.target

estimator = linear_model.LinearRegression()
estimator.fit(X, y)

code = m2c.export_to_java(estimator)


上面最终一即将 scikit-learn 中的线性回归模型转化为 Java 代码,留意这个模型现已拟合了练习数据,或者说现已完成了练习。转化后的代码如下所示:


public class Model {

    public static double score(double[] input) {
        return (((((((((((((36.45948838508965) + ((input[0]) * (-0.10801135783679647))) + ((input[1]) * (0.04642045狮城网836688297))) + ((input[2]) * (0.020558626367073608))) + ((input[3]) * (2.6867338193449406))) + ((input[4]) * (-17.76661122830004))) + ((input[5]) * (3.8098652068092163))) + ((input[6]) * (0.0006922246403454562))) + ((input[7]) * (-1.475566845600257))) + ((input[8]) * (0.30604947898516943))) + ((input[9]) * (苑琼丹-0.012334593916574394))) + ((input[10]) * (-0.9527472317072884))) + 表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青((input[11]) * (0.009311683273794044))) + ((input[12]) * (-0.5247583778554867));
    }
}


如上 return 后边的句子,它便是一个线性回归的表达式,每一个 input[ * ] 都是一种特征,它后边的数值便是练习后的权重。所以整个线性模型有 13 个特征及对应权重,以及别的一个偏置项。


咱们还能够找到更多的事例,假如咱们用 XGBoost 练习一个简略的分类模型,咱们能够看到转化的代码会很多运用 if-else 大法,不过咱们自身也不必保护生成的代码,所以这种结构也没什么关系了。


import numpy as np
def score(input):
    if (input[2]) >= (2.5999999):
        var0&n叶利钦bsp;= -0.0731707439
    else:
        var0 = 0.142857149
  &nb表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青sp; if (input[2]) >= (2.5999999):
        var1 = -0.0705206916
    else:
        var1 = 0.12477719
    var2 = np.exp(((0.5) + (var0)) + (var1))
    if (input[2]) >= (2.5999999):
   &nbumzubsp;    if (input[2]) >=&nmusebsp;(4.85000038):
            var3 = -0.0578680299
        else:
            var3 = 0.132596686
    else:
        var3 = -0.0714285821
    if (input[2]) >= (2.5999999):
        if&310nbsp;(input[2]) >= (4.85000038):
            var4 = -0.055299表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青9191
        else:
            var4 = 0.116139404
    else:
        var4 = -0.0687687024
    var5 = np.exp(((0.5) + (var3)) + (var4))
    if (input[2]) >= (4.85000038):
        if (input[3]) >= (1.75):
            v表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青ar6&nb钓鱼岛sp;= 0.142011836
        else:
            var6 = 0.0405405387
    else:
        if (input[3]) >= (1.6500001):
            var6&运筹帷幄nbsp;= 0.0428571403
        else:
            var6 = -0.0730659068
    if (input[2]) >= (4.85000038):
        if (input[3]) >= (1.75):
            var7 = 0.124653712
        else:
            var7 = 0.035562478
    else:
&n俄罗斯地图bsp;       if (input[3]) >= (1.6500001):
&表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青nbsp;           var7 = 0.0425687581
        else:
   &毒宠佣兵王妃nbsp;      表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青  var7 = -0.0704230517
    var8 = np.exp(((0.5) 陆垚知马俐;+ (var6)) + (var7))
    sydneyvar粗长9 = ((var2) + (var5)) + (var8)
    return np.asarray([(v宏ar2) / (var9), (var5) / (var9), (var8) / (var9)])


不过上面这种代码也十分合理,自身决策树就能够视为一种 if-else 的规矩调集,不同输入特征 input[ * ] 满意不同的条件就能得到不同的值,这些值最终能联合核算分类成果。


项目细节


东西的装置很简略,直接用 pip 就行了:


pip install m2cgen


除了前面那样在代码中调用转化东西,咱们还能经过命令行运用序列化的模型方针(pickle protocol)生成代码:


$ m2cgen <pickle_file> --language <language> [--indent <indent>]
  &n欧美道德bsp;      [--class_name <class_name>] [--package_name <package_name>]
         [--recursion-limit <recursion_limit>]


现在项目支撑以下分类和回归模型的转化:



分类模型输出成果:




本文为机器之心修改,转载请联络本大众号取得授权

✄------------------------------------------------

参加机器之心(全职记者 / 实习生):hr@jiqizhixin.com

投稿或寻求报导:content表白,模型转代码:XGBoost等模型也能快速转纯C或Java代码,一把青@jiqizhixin.com

广告 & 商务协作:bd@jiqizhixin.com

the end
音乐早听|加倍努力,线上音悦台