Note
Click here to download the full example code
Conversion of a logistic regression into C#
Simple example which shows how to predict with a logistic regression using a code implemented in C. This configuration is significantly faster in case of one-off prediction. It usually happens when the machine learned model is embedded in a service.
Train a logistic regression
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from mlprodict.grammar.grammar_sklearn import sklearn2graph
iris = load_iris()
X = iris.data[:, :2]
y = iris.target
y[y == 2] = 1
lr = LogisticRegression()
lr.fit(X, y)
Out:
LogisticRegression()
Conversion into a graph.
gr = sklearn2graph(lr, output_names=['Prediction', 'Score'])
Conversion into C
ccode = gr.export(lang='c')
print(ccode['code'])
Out:
int LogisticRegression (float* pred, float* Features)
{
// 139928843360192-LogisticRegression - children
// 139928843360864-concat - children
// 139928843361056-sign - children
// 139928843361008-+ - children
// 139928843361488-adot - children
float pred0c0c00c0[2] = {(float)3.3882975578308105, (float)-3.164527654647827};
float* pred0c0c00c1 = Features;
// 139928843361488-adot - itself
float pred0c0c00;
adot_float_float(&pred0c0c00, pred0c0c00c0, pred0c0c00c1, 2);
// 139928843361488-adot - done
float pred0c0c01 = (float)-8.323304176330566;
// 139928843361008-+ - itself
float pred0c0c0 = pred0c0c00 + pred0c0c01;
// 139928843361008-+ - done
// 139928843361056-sign - itself
float pred0c0;
sign_float(&pred0c0, pred0c0c0);
// 139928843361056-sign - done
// 139928843360864-concat - itself
float pred0[2];
concat_float_float(pred0, pred0c0, pred0c0c0);
// 139928843360864-concat - done
memcpy(pred, pred0, 2*sizeof(float));
// 139928843360192-LogisticRegression - itself
return 0;
// 139928843360192-LogisticRegression - done
}
This approach may work on small models. On bigger models with many dimensions, it would be better to use AVX instructions and parallelisation. Below, the optimisation this machine can offer.
from mlprodict.testing.experimental_c_impl.experimental_c import code_optimisation
print(code_optimisation())
Out:
AVX-omp=8
Total running time of the script: ( 0 minutes 0.097 seconds)