Синхронизация pl.StringCache / Категориальное кодирование на различных машинах в Polars

Вопрос или проблема

Мне нужно, чтобы тип данных полярного Categorical имел одинаковое физическое представление на разных машинах. На одной машине я могу использовать pl.StringCache, чтобы получить такое же физическое представление:

with pl.StringCache():
    s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
    s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)

Но мне нужно воспроизвести такое же физическое кодирование на совершенно другой машине:

with pl.StringCache():
    s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)
    # Как-то сохранить кодирование здесь

# На другой машине
with pl.StringCache(): # Как-то загрузить кодирование здесь
    s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)

На данный момент это, похоже, невозможно, но есть ли какие-либо обходные пути?

Мой случай использования – машинное обучение. Я обучаю модель на категориальных данных на одной машине, и мне нужно кодирование для инференса на других машинах. Хотя я мог бы технически использовать кодировщик меток Scikit learn, я бы хотел остаться в полярных данных.

Ответ или решение

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

Шаг 1: Сохранение кодировки

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

import polars as pl
import json

# Первая машина
with pl.StringCache():
    s1 = pl.Series("color", ["red", "green", "red"], dtype=pl.Categorical)

    # Сохраняем уникальные значения и их индексы
    unique_values = s1.cat.categories
    encoding = {value: index for index, value in enumerate(unique_values)}

    # Сохраняем кодировку в файл
    with open('encoding.json', 'w') as f:
        json.dump(encoding, f)

Шаг 2: Загрузка кодировки на другой машине

На другой машине необходимо загрузить сохранённые данные кодировки и использовать их для создания категориальной переменной с тем же представлением.

import polars as pl
import json

# Вторая машина
with pl.StringCache():
    # Загружаем кодировку из файла
    with open('encoding.json', 'r') as f:
        encoding = json.load(f)

    # Воссоздаем кодировку
    categories = list(encoding.keys())

    # Создаем новый столбец с требуемыми данными
    s2 = pl.Series("color", ["blue", "red", "green"], dtype=pl.Categorical)

    # Преобразуем данные по загруженной кодировке
    s2 = pl.Series("color", s2.to_list(), dtype=pl.Categorical, categories=categories)

    # Для правильного отображения индексов используем .cast
    s2 = s2.cast(pl.Categorical)

Заметки

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

  2. Обработка новых категорий: Если на второй машине присутствуют новые категории, которые не были определены на первой, то вы можете решить это, добавив их в категориальный набор при создании.

  3. Использование в машинном обучении: Если вы используете категориальные данные для обучения моделей, убедитесь, что вы применяете одну и ту же кодировку при предсказаниях на разных машинах.

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

Оцените материал
Добавить комментарий

Капча загружается...