Для импорта сторонней модели/версии модели необходимо:
|
|
Все этапы предобработки, которые подразумевают проведение обучения и трансформации, а именно методы fit и transform должны быть сохранены в pkl. |
Содержимое файла init.py
from .score import on_init, pre_score, score, post_score, finalize __all__ = ["score", "on_init", "pre_score", "post_score", "finalize"] |
Для того, чтобы загрузить новую версию модели необходимо заменить в архиве файлы с моделями, которые были изменены, например этапы предобработки с новыми параметрами, а также в файле score.py заменить название файлов модели в строках "pkls" и "__models" для каждого узла (этапа обработки данных) на необходимый файл с версией. Важно, чтобы при обучении внешней версии модели использовались те же названия переменных в датасете, что и в пайплайне Model Designer. Это касается в том числе промежуточных этапов, в которых вы можете изменять названия столбцов в датасете. Количество этапов и узлов также должно совпадать.
Для импорта новой модели можно использовать следующий шаблон кода в score.py:
import os
from typing import Dict, Any
import joblib
import numpy as np
import pandas as pd
"""
- Все объекты, участвующие в пайплайне (модель, препроцессоры и т. п.), должны быть сериализованы и сохранены в .pkl-файл.
- Эти объекты должны реализовывать методы .transform() (а при обучении — и .fit()), и применяться строго в том же порядке, в котором они были обучены.
⚠️ Важно:
- Пользователь обязан сохранить все этапы препроцессинга (например: scaler, dummizer, imputer и т.д.) в итоговый словарь перед сериализацией.
- Во время исполнения score(...) все препроцессоры должны вызываться в правильной последовательности:
1. imputing
2. scaling
3. encoding
4. и только потом — модель
- Поддерживаются разные типы моделей:
- Если у модели есть метод predict_proba, возвращаются вероятности и классификация по порогу.
- Иначе используется метод predict (например, для регрессии).
- Пример кода вызова:
X = model["imputer"].transform(df)
X = model["scaler"].transform(X)
X_cat = model["dummizer"].transform(df[cat_features])
X_full = np.concatenate([X, X_cat], axis=1)
y_pred = model["model"].predict_proba(X_full) или predict(X_full)
"""
# Инициализация модели
def on_init() -> Dict[Any, Any]:
script_dir = os.path.dirname(file)
models = {}
# Укажите список ID моделей (файлы .pkl)
pkls = ['<MODEL_ID>']
for pkl in pkls:
models[pkl] = joblib.load(os.path.join(script_dir, f'{pkl}.pkl'))
return models
# Предобработка входных данных (опционально)
def pre_score(df: pd.DataFrame) -> None:
pass
# Основная логика scoring-а
def score(df, models):
df=df.copy()
model = models['<MODEL_ID>']
# Предсказание вероятностей
proba = model.predict_proba(df)
# Создание DataFrame с результатами
output = pd.DataFrame(
proba,
columns=[f'P_target_{cls:.2f}' for cls in model.classes_],
index=df.index
)
# Классификация по порогу 0.5
output['C_target0'] = (output['P_target_1.00'] >= 0.5).astype(float)
# Объединение с исходными данными (если требуется)
df_out = df.copy()
df_out = pd.concat([df_out, output], axis=1)
return df_out
# Постобработка результата (опционально)
def post_score(df: pd.DataFrame, res: Any) -> None:
pass
# Завершение пайплайна
def finalize() -> None:
print("finalize stage")
|