Рубрики
Без рубрики

Учебное пособие M2CGEN – Как преобразовать модели машинного обучения в нативный код с нулевыми зависимостями

Автор оригинала: Davis David.

Самые тренируемые модели машинного обучения сохраняются как Машинные файлы Отказ Этот тип файла является стандартным способом сериализации и десериализующих объектов в Python.

Чтобы сделать прогнозы, вам необходимо загрузить сохраненную обученную модель, а затем выполнять прогнозы от приведенных входов.

В этой статье вы узнаете, как использовать M2CGEN Библиотека Python Чтобы преобразовать обученную модель обучения машины в нативный код (например, Python, PHP или JavaScript) с нулевыми зависимостями. Тогда вы сделаете прогнозы на основе этого.

Что такое библиотека M2CGEN Python?

M2CGEN (генератор кода модели 2) – это простая библиотека Python, которая преобразует обученную модель обучения машины на разные языки программирования.

Например, вы можете тренировать свою модель обучения машине из библиотеки Scikit-Sulect, а затем преобразуйте его в язык программирования на ваш выбор.

Эта библиотека очень полезна, если вы хотите развернуть модели в средах, в которых вы не можете установить стек Python, чтобы поддерживать прогноз вашего модели.

Языки, поддерживаемые библиотекой M2CGEN

M2CGEN Поддерживает 14 различных языков программирования:

  • C
  • C #
  • Дробил
  • F #
  • Идти
  • Haskell.
  • Ява
  • Javascript
  • Папирофон
  • PowerShell
  • Питон
  • R
  • Рубин
  • Visual Basic (VBA-совместимый)

Модели, поддерживаемые библиотекой M2CGEN

Библиотека поддерживает различные модели регрессии и классификации из Scikit-Suart, а также различные градиентные рамки повышения, таких как XGBOOST и LightGBM (машина повышения к градиентам).

Если вы хотите узнать о других поддерживаемых моделях, проверьте здесь: https://github.com/bayeswitnesses/m2cgen#supported-models Отказ

Как установить библиотеку M2CGEN Python

Чтобы установить M2CGEN, запустите следующую команду в своем терминале:

pip install m2cgen

Обратите внимание, что M2CGEN поддерживается Python Versions> = 3.6 Отказ

Как использовать библиотеку M2CGEN Python

В следующих примерах мы будем использовать набор данных кредита для создания простой модели обучения машины с использованием алгоритма логистики. Алгоритм сможет предсказать, если клиент имеет право на сумму кредита.

Затем мы преобразуем обученную модель в Python, PHP и JavaScript с помощью библиотеки M2CGEN. Вы можете скачать набор данных здесь Отказ

Давайте начнем! 🚀.

Импортируйте следующие важные пакеты для этого применения:

import pandas as pd
import numpy as np                     
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LogisticRegression
import m2cgen as m2c 
import warnings                        # To ignore any warnings
warnings.filterwarnings("ignore")

Загрузите набор кредитов, используя Pandas с этой командой:

data = pd.read_csv("data/loans_data.csv")

Затем показать список всех столбцов из набора данных:

list(data.columns)

Это колонны, которые вас интересуют:

LONE_ID Гендер женатые иждивенцев Образование Self_emoffied Alldicancome CoaPlicantancome CoinaMound Loan_Amount_term Credit_History Property_AREA loan_status

У нас есть 12 независимых функций и цель ( loan_status) Отказ Вы можете прочитать описание каждой функции здесь:

Вот первые 5 строк из набора данных:

#show the first 5 rows of the dataset
data.head() 

Как вы можете видеть, что набор данных имеет некоторые недостающие данные и категорические функции, которые необходимо преобразовать в числовые значения. Вот простая функция Python, которая поможет нам обрабатывать недостающие данные и функционирование. Затем он вернет обработанные функции и цель.

# preprocessing the dataset.

def preprocessing(data):

    # replace with numerical values
    data['Dependents'].replace('3+', 3,inplace=True)
    data['Loan_Status'].replace('N', 0,inplace=True)
    data['Loan_Status'].replace('Y', 1,inplace=True)

    # handle missing data 
    data['Gender'].fillna(data['Gender'].mode()[0], inplace=True)
    data['Married'].fillna(data['Married'].mode()[0], inplace=True)
    data['Dependents'].fillna(data['Dependents'].mode()[0], inplace=True)
    data['Self_Employed'].fillna(data['Self_Employed'].mode()[0], inplace=True)
    data['Credit_History'].fillna(data['Credit_History'].mode()[0], inplace=True)
    data['Loan_Amount_Term'].fillna(data['Loan_Amount_Term'].mode()[0], inplace=True)
    data['LoanAmount'].fillna(data['LoanAmount'].median(), inplace=True)

    # drop ID column
    data = data.drop('Loan_ID',axis=1)
    
    #split features and target 
    X = data.drop('Loan_Status',axis=1)
    y = data.Loan_Status.values

    #scale the  features 
    X  = pd.get_dummies(X,columns=["Gender","Married","Education","Self_Employed","Property_Area"])
    X = StandardScaler().fit_transform(X)
    

    return X,y 

Давайте предварительно назначим набор кредита. Это вернет обработанные функции и цель.

X,y = preprocessing(data) 

Затем мы разделим обработанные данные в поезд и тестируемые данные наборы, используя rain_test_split Функция от Scikit – учиться.

# split into train and test set 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)

Теперь мы создаем и тренируем модель логистистики в наш поезд.

# create and train the classifier 

classifier = LogisticRegression()

classifier.fit(X_train,y_train)

Как преобразовать обученную модель в код Python

Библиотека M2CGEN предоставляет методы преобразования обученной модели в любой из поддерживаемых языков, упомянутых выше. В этом примере мы преобразуем обученную модель в Python, используя export_to_python () Метод от M2CGEN.

# convert model to pure python code  
model_to_python = m2c.export_to_python(classifier)  

Вот обученная модель, представленная в коде Python:

#pure python code 

def score(input):
    
    return (((((((((((((((((0.7929123964945446) + ((input[0]) * (0.07801862594632314))) + ((input[1]) * (-0.014853900985478468))) + ((input[2]) * (-0.15783041201914427))) + ((input[3]) * (-0.05222073553791883))) + ((input[4]) * (-0.0787403404504791))) + ((input[5]) * (1.3714807410150505))) + ((input[6]) * (0.015077765348160292))) + ((input[7]) * (-0.015077765348160353))) + ((input[8]) * (-0.12161041350915254))) + ((input[9]) * (0.12161041350915253))) + ((input[10]) * (0.09387440269562626))) + ((input[11]) * (-0.09387440269562626))) + ((input[12]) * (-0.0047109053878701835))) + ((input[13]) * (0.004710905387870008))) + ((input[14]) * (-0.14569247529698154))) + ((input[15]) * (0.19858601990225683))) + ((input[16]) * (-0.06417592734444703))

Функциональный код Python, который он генерирует, получает входные данные, а затем выполняет его прогнозы. Теперь давайте проверим генерируемый код Python.

Сначала мы сделаем прогнозы от фактической обученной модели. Вот образец тестовых данных, которые мы будем использовать из тестового набора:

test_data = X_test[6]
print(test_data)

Массив ([1,24474546, 1,9817189, -0,55448733, 3,02536229, 0,2732313, 0,41173269, -0,47234264, 0,47234264, -0,72881553, 0,72881553, 0,52836225, -0,52836225, -2,54711697, 2,54711697, 1,55889948, -0,7820157, -0,70020801])

Теперь мы делаем прогнозы с фактической обученной моделью.

pred = classifier.predict(test_data.reshape(1,-1))  
print("prediction result: {}".format(pred))

Результат предсказания: [1]

Предсказание модели – 1 Это означает, что клиент имеет право на сумму кредита.

Мы будем использовать те же тестовые данные для выполнения прогнозов в чистом виде Python Code, созданном и оцените, если оно даст тот же прогноз.

# test prediction in pure python code 
input = [ 1.24474546,  1.9817189 , -0.55448733,  3.02536229,  0.2732313 ,
        0.41173269, -0.47234264,  0.47234264, -0.72881553,  0.72881553,
        0.52836225, -0.52836225, -2.54711697,  2.54711697,  1.55889948,
       -0.7820157 , -0.70020801]

pred = score(input) 
print("prediction result: {}".format(int(pred)))

Результат предсказания: 1

Чистый код Python также предоставляет одинаковые результаты прогнозирования.

Как преобразовать обученную модель в код PHP

Мы будем использовать export_to_php () Метод из M2CGEN для преобразования обученной модели в чистый PHP-код.

# convert model to pure PHP code  
model_to_php = m2c.export_to_php(classifier)  

Вот обученная модель, представленная в PHP-коде:

function score(array $input)
{
    return (((((((((((((((((0.8166973302490392) + (($input[0]) * (0.035269518507829584))) + (($input[1]) * (0.05203333118549156))) + (($input[2]) * (-0.13217178253938103))) + (($input[3]) * (-0.13136526173536608))) + (($input[4]) * (-0.024875019809902837))) + (($input[5]) * (1.2864103414352563))) + (($input[6]) * (-0.005259373701309709))) + (($input[7]) * (0.005259373701309715))) + (($input[8]) * (-0.11512289603368371))) + (($input[9]) * (0.11512289603368378))) + (($input[10]) * (0.06905305123713898))) + (($input[11]) * (-0.06905305123713898))) + (($input[12]) * (0.021080906307735767))) + (($input[13]) * (-0.02108090630773594))) + (($input[14]) * (-0.14491490189610398))) + (($input[15]) * (0.2189862115713242))) + (($input[16]) * (-0.08599736364921017));
}

Мы будем использовать те же тестовые данные для выполнения прогнозов в чистом виде кода PHP и оценки, если оно даст нам тот же прогноз:

# test prediction in pure PHP code
$input = [1.24474546, 1.9817189, -0.55448733, 3.02536229, 0.2732313,
    0.41173269, -0.47234264, 0.47234264, -0.72881553, 0.72881553,
    0.52836225, -0.52836225, -2.54711697, 2.54711697, 1.55889948,
    -0.7820157, -0.70020801];

// perform predition with pure php code
$pred = score($input);


echo "Predicton result: ". round($pred);

Результат предсказания: 1

Чистый PHP-код также обеспечивает одинаковое результаты прогнозирования.

Как преобразовать обученную модель в код JavaScript

В нашем последнем примере мы будем использовать export_to_javascript () Метод от M2CGEN для преобразования обученной модели в чистый код JavaScript.

# convert model to pure Javascript code  
model_to_javascript = m2c.export_to_javascript(classifier)  

Вот обученная модель, представленная в коде JavaScript:

function score(input)
{
    return (((((((((((((((((0.8166973302490392) + ((input[0]) * (0.035269518507829584))) + ((input[1]) * (0.05203333118549156))) + ((input[2]) * (-0.13217178253938103))) + ((input[3]) * (-0.13136526173536608))) + ((input[4]) * (-0.024875019809902837))) + ((input[5]) * (1.2864103414352563))) + ((input[6]) * (-0.005259373701309709))) + ((input[7]) * (0.005259373701309715))) + ((input[8]) * (-0.11512289603368371))) + ((input[9]) * (0.11512289603368378))) + ((input[10]) * (0.06905305123713898))) + ((input[11]) * (-0.06905305123713898))) + ((input[12]) * (0.021080906307735767))) + ((input[13]) * (-0.02108090630773594))) + ((input[14]) * (-0.14491490189610398))) + ((input[15]) * (0.2189862115713242))) + ((input[16]) * (-0.08599736364921017));
}

Мы будем использовать те же тестовые данные для выполнения прогнозов в чистом виде кода JavaScript и оценивают, если оно даст нам тот же прогноз.

// perform predition with pure Javascript code
let input =  [1.24474546, 1.9817189, -0.55448733, 3.02536229, 0.2732313,
    0.41173269, -0.47234264, 0.47234264, -0.72881553, 0.72881553,
    0.52836225, -0.52836225, -2.54711697, 2.54711697, 1.55889948,
    -0.7820157, -0.70020801];

let pred = score(input);

console.log("Prediction results:",Math.round(pred));

«Результат прогноза:», 1

Чистый код JavaScript также обеспечивает те же результаты прогнозирования.

Обертывание

Иногда нативный код, генерируемый библиотекой M2CGEN, может предоставить разные результаты по сравнению с оригинальной моделью ML ML Python. Вот краткое объяснение от разработчиков библиотеки:

В примерах, упомянутых выше, я использую int () для Python , раунд () для PHP и Math.round () для JavaScript Для преобразования результатов прогнозирования из плавать Тип данных для Целое число тип данных.

Поздравляем, вы доверяли это до конца этой статьи!

Вы можете скачать файлы набора данных, ноутбука и сценариев, используемые в этой статье: https://github.com/davisy/Convert-trained-ml-models-to-native-code.

Если вы узнали что-то новое или наслаждались чтением этой статьи, пожалуйста, поделитесь этим, чтобы другие могли его увидеть. До этого увидимся в следующем посте! Я также можно добраться в Twitter @Davis_mcdavid Отказ