Получение наблюдаемости модели SOTA ML

Привет! Как дела?

В воскресенье вечером я задумался, на чем мне сосредоточить свои исследования, и я помню, что мне нужно было немного изучить (не очень) новую платформу мониторинга моделей, которую мы видели вокруг, под названием Arize. Вы можете сказать, что такое наблюдаемость модели, и мы немного поговорим об этом, а затем представим, в чем заключается Arize.

Что такое наблюдаемость и почему это важно?

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

Такие вещи, как Холодно ли на улице?/Будет ли дождь? просто чувствовать, как воздух и влажность отражаются на нашей коже, настолько тривиально, что мы никогда не думаем о них как о типах наблюдений в окружающей среде, в которой мы находимся.

Для систем нам нужны такие же возможности, чтобы отслеживать все, что происходит. Это чрезвычайно важно, и это легко понять, когда мы думаем о гонщиках Формулы-1 или астронавтах SpaceX: им необходимо измерять каждый сантиметр своего организма, чтобы остаться в живых и достичь своих целей.

Для систем машинного обучения нам необходимы три типа наблюдаемости: инфраструктура, данные и модельная наблюдаемость, как показано на изображении ниже, сделанном Апарной Дхинакаран. Она проделала потрясающую работу, указав три типа наблюдаемости, которые вы должны знать в системе машинного обучения, и вы можете проверить здесь.[1]

Учитывая это, как мы можем включить этот тип наблюдаемости в нашу систему? Должны ли мы кодировать каждую его часть?

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

К счастью, есть инструмент, с помощью которого это легко сделать: Arize. Вы также можете подумать о Monalabs или Whylabs, если вам нужны другие варианты, но я останусь на Arize, потому что он мне понравился больше всего.

Давайте испачкаем руки

Генерация данных

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

Предположим, что мы разработали модель машинного обучения, и мы смоделируем ее, создав поддельные наборы данных, каждый из которых содержит 10 случайных и разных функций на основе определенного начального числа для воспроизводимости, а также сгенерируем цель (удовлетворенный/неудовлетворенный клиент).

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

!pip install 'arize[MimicExplainer]' scikit-learn pandas numpy
import pandas as pd
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

## Generating Training and Test Dataset with make_classification function
X, y = make_classification(n_samples=10000, n_features=10, random_state=42)
df = pd.DataFrame(X, columns=[f"col_{i}"for i in range(10)])
df["target"] = pd.Series(y)
df['target_label'] = ["satisfied" if (i==1) else "unsatisfied" for i in y]
## Generating fake score probabilities to simulate the real world scenario
df["score"] = np.random.random(10000)
df['score_label'] = ["satisfied" if (round(i)==1) else "unsatisfied" for i in df.score]
df = df.reset_index()
train, test = train_test_split(df, test_size=0.2, stratify=df["target"], random_state=42)

К настоящему времени у нас есть наборы данных для обучения и тестирования.

## Emulating production dataset with slight changes and a different random state
X, y = make_classification(n_samples=3000, n_features=10, shift=0.2, scale=1.2, random_state=123)
prod_df = pd.DataFrame(X, columns=[f"col_{i}"for i in range(10)])
prod_df["target"] = pd.Series(y)
prod_df['target_label'] = ["satisfied" if (i==1) else "unsatisfied" for i in y]
prod_df["score"] = pd.Series(np.random.random(3000))
prod_df['score_label'] = ["satisfied" if (round(i)==1) else "unsatisfied" for i in prod_df.score]
prod_df = prod_df.reset_index()

Хорошо, теперь мы готовы начать.

Подключение к Аризе

Запустите приведенный ниже код, чтобы запустить соединение, как показано в документации Arize. [2]

from arize.pandas.logger import Client, Schema
from arize.utils.types import Environments, ModelTypes
API_KEY = 'YOUR_API_KEY'
SPACE_KEY = 'YOUR_SPACE_KEY'
arize_pandas_client = Client(space_key=SPACE_KEY, api_key=API_KEY)

Захват имен столбцов набора данных

# example feature columns from sample dataframe, swap these out to reflect your own data!
feature_column_names = [col for col in train.columns if col.startswith('col_')]
prediction_label_column_name="score_label"
prediction_score_column_name="score"
actual_label_column_name="target_label"
actual_score_column_name="target"

Ведение журнала наборов данных

Загрузка набора данных поезда

# Log the prediction using arize_pandas_client.log
# Be sure to set up your own model parameters in the method call below
schema = Schema(
prediction_id_column_name="index",
# timestamp_column_name="YOUR_PREDICTION_TS_COLUMN_NAME", # optional timestamp column
prediction_label_column_name=prediction_label_column_name,
actual_label_column_name=actual_label_column_name,
prediction_score_column_name=prediction_score_column_name,
actual_score_column_name=actual_score_column_name,
feature_column_names=feature_column_names
)
res = arize_pandas_client.log(
dataframe=train,
model_id='custom_model_test',
model_version='v1',
model_type=ModelTypes.SCORE_CATEGORICAL, # or ModelTypes.NUMERIC, see docs.arize.com for more info
environment=Environments.TRAINING, # see docs.arize.com for more info
schema=schema,
surrogate_explainability=True
)

Загрузка тестового набора данных

# Log the prediction using arize_pandas_client.log
# Be sure to set up your own model parameters in the method call below
schema = Schema(
prediction_id_column_name="index",
# timestamp_column_name="YOUR_PREDICTION_TS_COLUMN_NAME", # optional timestamp column
prediction_label_column_name=prediction_label_column_name,
actual_label_column_name=actual_label_column_name,
prediction_score_column_name=prediction_score_column_name,
actual_score_column_name=actual_score_column_name,
feature_column_names=feature_column_names
)
res = arize_pandas_client.log(
dataframe=test,
model_id='custom_model_test',
model_version='v1',
model_type=ModelTypes.SCORE_CATEGORICAL, # or ModelTypes.NUMERIC, see docs.arize.com for more info
environment=Environments.VALIDATION, # see docs.arize.com for more info
batch_id=1,
schema=schema,
surrogate_explainability=True
)
if res.status_code == 200:
    print(f"✅ You have successfully logged production set to Arize")
else:
    print(f"logging failed with response code  {res.status_code}, {res.text}")

Загрузка набора производственных данных

# Log the prediction using arize_pandas_client.log
# Be sure to set up your own model parameters in the method call below
schema = Schema(
prediction_id_column_name="index",
# timestamp_column_name="YOUR_PREDICTION_TS_COLUMN_NAME", # optional timestamp column
prediction_label_column_name=prediction_label_column_name,
actual_label_column_name=actual_label_column_name,
prediction_score_column_name=prediction_score_column_name,
actual_score_column_name=actual_score_column_name,
feature_column_names=feature_column_names
)
res = arize_pandas_client.log(
dataframe=prod_df,
model_id='custom_model_test',
model_version='v1',
model_type=ModelTypes.SCORE_CATEGORICAL, # or ModelTypes.NUMERIC, see docs.arize.com for more info
environment=Environments.PRODUCTION, # see docs.arize.com for more info
schema=schema,
surrogate_explainability=True
)
if res.status_code == 200:
    print(f"✅ You have successfully logged production set to Arize")
else:
    print(f"logging failed with response code  {res.status_code}, {res.text}")

После всего этого мы должны увидеть что-то вроде:

Success! Check out your data at https://app.arize.com/organizations/XXXXXXXXXXXXXXXXXXXXXX=/spaces/XXXXXXXXX/models/modelName/custom_model_test?selectedTab=dataIngestion ✅ You have successfully logged production set to Arize

Проверка интерфейса Arize

Теперь мы можем перейти на сайт Arize и проверить панель Models.

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

Я расскажу немного о том, что там можно увидеть и почему я так поражен этим инструментом.

Кто-то может сказать «ОК», но мы уже можем делать это кодирование, и у нас гораздо больше гибкости и т. д. Я частично согласен с этим, так как очень люблю кодирование. Но вы должны признать, что это значительно ускоряет работу, предоставляя все встроенное и не требуя усилий по кодированию, точно так же, как GitHub Copilot может помочь нам в целом (без необходимости искать в переполнении стека простые, но часто забываемые вещи).

Вот и все на сегодня, и я надеюсь, вам понравилось немного изучать наблюдаемость модели ML в нашем практическом использовании платформы Arize, есть так много того, что я не рассмотрел эту область NLP и их функциональность UMAP и другие информационные панели, но Я призываю вас немного изучить и проверить их документы.

Увидимся в следующий раз!

Примечания. Все сделанные скриншоты принадлежат Arize.ai и его красиво оформленному пользовательскому интерфейсу, который сделает нашу жизнь намного лучше, представляя модели заинтересованным сторонам.

Ссылки

[1] Апарна Дхинакаран. Три типа наблюдаемости, которые нужны вашей системе (июнь 2022 г.). На пути к науке о данных.

[2] Аризе.ИИ. Пакетная документация Python