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)

Gallery generated by Sphinx-Gallery