Этикетка:模型部署
PMML
Для инженеров алгоритмов, как успешно развернуть обученную модель онлайн, также является важной частью работы. Конечно, развертывание модели, обученной Python, в среде Python является естественной идеей, но в большинстве моих реальных проектов необходимо реализовать кросс-платформенное (например, среду Java) развертывание модели и PMML ( Predictive Model Markup Language, язык разметки предиктивной модели) — это один из способов решения кроссплатформенного развертывания.
1. Что такое PMML?
PMML — это набор стандартов на основе XML, которые не зависят от платформы и среды.Язык представления модели. В основном он определяет и хранит основные элементы модели алгоритма через XML-схему:
- Словарь данных: описывает входные данные
- Преобразование данных: определяет способ предварительной обработки необработанных данных, например стандартизацию, обработку пропущенных значений, создание фиктивных переменных и т. д.
- Определение модели: тип и параметры модели, такие как разделяемый узел модели дерева и т. д.
- Выход модели: Выход модели
Несложно заметить, что, определив все основные элементы в PMML, можно завершить все процессы интеллектуального анализа данных, то есть при развертывании серверных разработчиков им нужно только прочитать данные, вызвать файл PMML, а затем получить выходные данные, не используя Фокус на преобразовании данных, параметрах модели и других вопросах, чтобы ускорить эффективность развертывания модели.
2. Как Python реализует упаковку файлов PMML?
Этот документ принимаетIris
Возьмите в качестве примера набор данных iris, обучите классификатор XGBoost с помощью конвейера, а затем упакуйте его для вывода файла PMML. Конвейер означает, что множество различных этапов предварительной обработки данных и одна или несколько моделей последовательно объединяются вместе, как в конвейере сращивания, тем самым завершая все этапы интеллектуального анализа данных и упрощая обучение и развертывание модели.
Iris
Набор данных радужной оболочки содержит 4 переменные признаков (длина чашелистика, ширина чашелистика, длина лепестка и ширина лепестка) и 1 метка категории (0-setosa, 1-versicolor, 2-virginica), цель нашей модели: на основе переменной признаков различать 3 виды ирисов.
Шаг 0: Импортируйте необходимые пакеты
# import packages
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import StandardScaler
from sklearn2pmml import PMMLPipeline
from sklearn2pmml import sklearn2pmml
from xgboost import XGBClassifier
Шаг 1. Обучите модель с помощью Python
# read data
iris = datasets.load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target
# split train and test dataset
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)
# define datamapper
mapper = DataFrameMapper([
(["sepal length (cm)", "sepal width (cm)"], StandardScaler()),
(["petal length (cm)"], None)
], df_out=True)
# define a model
xgb = XGBClassifier(n_estimators=5, seed=123)
# make a pipeline
pip_model = PMMLPipeline([
('mapper', mapper),
("classifier", xgb)]
)
# train a model & predict on test data
pip_model.fit(X_train, y_train)
pred_prob_pip = pip_model.predict_proba(X_test)
В примере мы сначала используемDataFrameMapper
Переменные входных признаков определены так, чтобы содержать только 3 (удаление ширины лепестка), и только длина чашелистика и ширина чашелистика стандартизированы, в то время как длина лепестка не обрабатывается. а затем определитьXGBClassifier
, наконец черезPMMLPipeline
Объедините два конвейера обработки данных и модели для обучения.
Шаг 2: Сохранить как файл PMML
# save model
sklearn2pmml(pip_model, "iris_model.pmml", with_repr = True)
Выходной файл PMML можно открыть любым редактором в виде:
Шаг 3. Вызовите PMML, чтобы проверить результат в python.
from pypmml import Model
model = Model.fromFile('iris_model.pmml')
pred_prob_reloaded_model = model.predict(X_test)
Повторное чтение файла PMML и результаты исходного прогноза Pipeline должны быть согласованы в среде python.
3. Какие ямы могут встретиться? ?
Реализация приведенного выше примера очень проста, но при его реальном развертывании всегда будут какие-то ямы, ведь все вырастают, наступая на ямы. Ниже перечислены некоторые проблемы, с которыми я столкнулся в процессе развертывания PMML, только для справки.
-
Яма 1: модель можно обучить, но нельзя сгенерировать файл pmml.
Это может быть связано с экологическими причинами, sklearn/sklearn2pmml/sklearn_pandas необходимо адаптировать, и когда версия sklearn2pmml слишком высока, а версия jar слишком мала, файл не может быть прочитан.Информация о версии, используемая в этой статье, следующая. :
- sklearn2pmml = 0.53.0
- sklearn = 0.23.1
- sklearn_pandas = 2.2.0
-
Яма 2: Java вызывает PMML, а исходное предсказание модели конвейера несовместимо (В нормальных условиях 5 знаков после запятой должны совпадать.)
У этой проблемы может быть две причины:(1) Несовместимые типы данных, (2) Обработка пропущенных значений.
-
Типы данных несовместимы, вы можете попробовать следующие 2 решения:
- Поскольку при создании файла pmml все переменные по умолчанию имеют тип double, а некоторые категориальные переменные имеют строковый тип, вы можете рассмотреть возможность использования labelencoder для преобразования категориальных переменных в числовые типы.
- Изменить double в файле pmml на строку
-
Обработка отсутствующих значений: когда в данных есть отсутствующие значения, и они не nan, а заменены на -9999, файл PMML должен находиться вИ datamapper, и модель определяются одновременно
-9999
пропущенное значение, иначе будут нестыковки в прогнозах. должно быть# define datamapper mapper = DataFrameMapper([ (["sepal length (cm)", "sepal width (cm)"], StandardScaler()), (["petal length (cm)"], ContinuousDomain(missing_values=-9999.0, with_data = False)) ], df_out=True) # define a model xgb = XGBClassifier(n_estimators=5, seed=123, missing=-9999.0)
Примечание: используйте
ContinuousDomain
После этого диапазон данных каждой функции будет найден в соответствии с данными обучения, и будет сообщено об ошибке, когда отображение тестовых данных превысит значение этого диапазона, поэтому необходимо установитьwith_data=False
для снятия этого ограничения.
-
-
Яма 3: исходная модель Pipeline и результаты прогнозирования файловой модели PMML для чтения python несовместимы.
Эта ситуация также во многом связана с пропущенными значениями. Если такие проблемы все еще возникают после правильной обработки pit 2, это может быть связано с тем, что когда python читает прогноз модели файла PMML, недостающие функции также передаются и назначаются
-9999
. Правильный способ — использовать pypmml для вызова файла PMML, вы не должны передавать отсутствующие функции или присваивать значение nan, чтобы файл PMML, вызываемый pypmml, мог согласовываться с результатами прогнозирования исходной модели конвейера.
Быть в курсе
- Python строит конвейерную модель
- Вызов обученного Python PMML с использованием Scala
Несанкционированная перепечатка запрещена, пожалуйста, свяжитесь с автором для перепечатки, в противном случае автор сохраняет все законные права.