目前大部分程序开发时为求方便快捷通常采用python进行机器学习的训练,但最终代码却需要以C++或者java等其他语言完成,此时如何将python的训练模型转成最终代码语言就十分必要了。网上有大量如何使用m2gen库的介绍,官网对于该库的适用范围和使用方式的介绍也十分全面,链接:https://pypi.org/project/m2cgen/因此本文主要记录一下本人在使用过程中作为机器学习小白遇到的一些问题,下面就进入正题。
1. python训练模型
这里采用鸢尾花数据和逻辑回归分类作为例子
from sklearn.datasets import load_iris
from sklearn import linear_model
import m2cgen as m2c
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
samples = load_iris()
X, y = samples.data, samples.target
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y)
# 标准化
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.transform(X_test)
# 训练模型
clf = linear_model.LogisticRegression()
clf.fit(X_train_std, y_train)
# 模型转化为c++代码
code = m2c.export_to_c(clf)
print(code)
2. C++代码
2.1 输出结果
运行上述代码可以得到模型转化结果,结果如下:
#include <string.h>
void score(double * input, double * output) {
memcpy(output, (double[]){((((0.1291554804591392) + ((input[0]) * (-1.0376549179640582))) + ((input[1]) * (1.040034306046707))) + ((input[2]) * (-1.7150513835426182))) + ((input[3]) * (-1.603753882742344)), ((((1.7711784165043756) + ((input[0]) * (0.5269668866292136))) + ((input[1]) * (-0.46050100312172215))) + ((input[2]) * (-0.2989366090060719))) + ((input[3]) * (-0.7124289654502324)), ((((-1.9003338969635148) + ((input[0]) * (0.5106880313348463))) + ((input[1]) * (-0.5795333029249878))) + ((input[2]) * (2.0139879925486928))) + ((input[3]) * (2.3161828481925792))}, 3 * sizeof(double));
}
网上大多数帖子到这一步就停止了,但是作为小白,仍然不明白这个score函数该如何使用,这主要与不了解多分类的原理有关,想了解细节的朋友可以自行百度逻辑回归多分类(其余方法也类似)的原理,这里我仅简单描述该如何使用这个函数。
2.2 score函数的使用
2.2.1 多分类
鸢尾花数据分为3类,标签值分别为0,1,2。可以看到输出的c++代码给出了三个多项式,将正则化后的数据特征输入到多项式中可以计算得到三个值,记为s0,s1,s2,分别代入sigmoid函数,
得到p0,p1,p2,这三个值便是对应标签0,1,2的分类概率,即该样本为0类的概率为p0,为1类的概率为p1,为2类的概率为p2。取概率最大的即为训练模型所预测的分类结果。
2.2.2 二分类
而对于二分类问题比较简单,得到的score函数就是一个多项式,计算值的正负代表分类结果,同样可以带入sigmoid函数得到样本为正的概率。
了解了score函数的意思,将其放入C++代码中进行分类就很好处理。希望我的分享对你们有所帮助~