Маркировка данных имеет решающее значение для успеха проекта машинного обучения

Проекты по науке о данных включают в себя сбор, очистку и обработку большого количества данных. Мы сделали все шаги, чтобы качество набора данных было хорошим для обучения машинному обучению. Хотя есть одна конкретная важная часть проекта по науке о данных, которая может решить его или сломать: маркировка.

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

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

Чтобы помочь специалистам по обработке данных, работающим над обработкой этикеток, я хочу представить несколько пакетов Python, которые, по моему мнению, будут полезны для повседневной работы. Какие были пакеты? Давайте углубимся в это.

1. Написать

Compose — это пакет Python, разработанный для автоматизации прогнозной инженерной работы. Compose специально создан для создания меток для наблюдения за проблемами прогнозирования. Пользователь определяет критерии метки, а Compose запускает исторические данные для создания прогноза метки.

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

Начнем с установки пакета Compose.

pip install composeml

Кроме того, для этого примера я бы использовал набор данных о продуктах из Kaggle от Heerla Dedhia, который доступен для коммерческого использования.

import pandas as pd
df = pd.read_csv('Groceries_dataset.csv')
df['Date'] = pd.to_datetime(df['Date'])
df.head()

Набор данных содержит 3 столбца: идентификатор («Member_number»), время покупки («Дата») и купленный товар («itemDescription»).

Теперь представьте, что у нас есть бизнес-вопрос:

«Купят ли клиенты что-нибудь в течение следующего периода покупок?»

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

  1. Какой продукт купил бы клиент?
  2. Как долго длится следующий период покупок?

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

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

def bought_product(ds, itemDescription):
   return ds.itemDescription.str.contains(itemDescription).any()

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

lm = cp.LabelMaker(
#We want to process each customer so we use the Customer ID
target_dataframe_name='Member_number',
#Because we want to know if the customer bought item on the next period, we would need the time column
time_index='Date',
#Set the label function
labeling_function=bought_product,
#How long the shopping Period (or any period between time)
window_size='3d'
)

Когда мы уже установили класс LabelMaker, мы были готовы запустить процесс создания этикеток.

lt = lm.search(
#The dataset
df.sort_values('Date'),
#Number of label per customers, -1 means find all the existing
num_examples_per_instance=-1,
#What product we want to find
itemDescription='whole milk',
minimum_data='3d',
verbose=False,)
lt.head()

Выходные три столбца были объяснены ниже:

  • Member_number относится к покупкам. Поскольку каждый клиент мог купить более одного раза, примеров может быть несколько.
  • Время начала периода покупок. Это также крайний срок для построения функций.
  • Они рассчитывались с помощью функции маркировки, если товар был куплен в течение окна периода.

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

lt.describe()

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

Это пример Compose. Если вы хотите попробовать другие данные или посмотреть на другой пример, мы можем посетить Учебник.

2. Трубка

Snorkel — это пакет Python, разработанный специально для создания меток наборов данных без какого-либо ручного процесса маркировки. Snorkel был нацелен на сокращение времени, затрачиваемого на работу с этикеткой, с помощью нескольких строк кода. У шноркеля есть 3 основные особенности:

  • Маркировка данных
  • Преобразование данных
  • Разрез данных.

Хотя эта статья будет посвящена только процессу маркировки данных. Давайте попробуем пакет Snorkel для автоматизации нашего процесса маркировки.

Во-первых, нам нужно установить пакет.

pip install snorkel

В учебных целях мы будем использовать набор данных комментариев YouTube от Kaggle от Nipun Arora, который доступен для коммерческого использования.

import pandas as pd
df = pd.read_csv('youtube_dataset.csv')
df.head()

Набор данных содержит множество полей, в том числе данные комментариев YouTube. Допустим, мы хотим обучить предсказатель спама в комментариях YouTube на основе набора данных. В этом случае нам нужно пометить данные особыми требованиями — что мы считаем спамом?

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

Для ясности давайте будем рассматривать Хэм как 0, Спам как 1, а Воздержание как -1.

ABSTAIN = -1
HAM = 0
SPAM = 1

Также я бы предположил, что спам содержит в своем тексте «check» и «checking_out». Давайте построим функцию маркировки с указанным выше правилом.

from snorkel.labeling import labeling_function
@labeling_function()
def check(x):
   return SPAM if "check" in x.text.lower() else ABSTAIN

@labeling_function()
def checking_out(x):
   return SPAM if "checking out" in x.text.lower() else ABSTAIN

Когда функция готова, мы можем пометить данные комментария. Однако нам нужно изменить имя столбца, который мы хотим обработать как «текст».

df = df.rename(columns = {'Comment' : 'text'})

Поскольку мы также используем Pandas DataFrame, мы будем использовать PandasLFApplier для применения функции метки.

from snorkel.labeling import PandasLFApplier
lfs = [checking_out, check]
applier = PandasLFApplier(lfs=lfs)
L_train = applier.apply(df=df)

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

L_train

Из функции нанесения метки давайте проверим, насколько спам охватывает каждое слово.

coverage_checking_out, coverage_check = (L_train != ABSTAIN).mean(axis=0)
print(f"checking out coverage: {coverage_checking_out * 100:.1f}%")
print(f"check coverage: {coverage_check * 100:.1f}%")

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

from snorkel.labeling import LFAnalysis
LFAnalysis(L=L_train, lfs=lfs).lf_summary()

Используя LFAnalysis, мы могли бы получить более подробную информацию о процессе маркировки. Каждый из столбцов представляет эту информацию:

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

Это основное использование Snorkel для процесса маркировки. Вы еще так много можете сделать с пакетами и узнать. Важно то, что Snorkel сведет к минимуму вашу деятельность по маркировке.

3. Чистая лаборатория

Cleanlab — ​​это пакет Python для поиска проблем с этикетками и их автоматического устранения. По сути, этот пакет отличается от двух предыдущих пакетов, которые я упомянул, потому что Cleanlab требует, чтобы наш набор данных уже содержал метку.

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

Давайте используем пример набора данных для использования Cleanlab. Во-первых, нам нужно установить пакет.

pip install cleanlab

Мы будем использовать кредитные данные из функции Sklearn и установить случайное начальное число, чтобы получить стабильный результат. Данные поступают из кредитных данных OpenML, чьи источники были UCI и коммерчески доступны для использования.

from sklearn.datasets import fetch_openml
import random
import numpy as np
SEED = 123456
np.random.seed(SEED)
random.seed(SEED)
data = fetch_openml("credit-g")
X_raw = data.data
y_raw = data.target

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

import pandas as pd
from sklearn.preprocessing import StandardScaler
cat_features = X_raw.select_dtypes("category").columns
X_encoded = pd.get_dummies(X_raw, columns=cat_features, drop_first=True)
num_features = X_raw.select_dtypes("float64").columns
scaler = StandardScaler()
X_scaled = X_encoded.copy()
X_scaled[num_features] = scaler.fit_transform(X_encoded[num_features])
y = y_raw.map({"bad": 0, "good": 1})  # encode labels as integers

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

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

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

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()

Затем мы настроили перекрестную проверку K-Fold.

from sklearn.model_selection import cross_val_predict
num_crossval_folds = 5 
pred_probs = cross_val_predict(
    clf,
    X_scaled,
    y,
    cv=num_crossval_folds,
    method="predict_proba",
)

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

from cleanlab.filter import find_label_issues
ranked_label_issues = find_label_issues(
labels=y, pred_probs=pred_probs, return_indices_ranked_by="self_confidence")
print(f"Cleanlab found {len(ranked_label_issues)} potential label errors.")

Если мы проверим результат, то получим позицию плохой метки.

ranked_label_issues

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

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

Заключение

Маркировка так же важна, как и проект по науке о данных, поскольку многие модели машинного обучения зависят от правильной маркировки. Чтобы помочь специалисту по данным работать с процессом маркировки, я представляю 3 пакета Python для автоматического процесса маркировки. Пакеты:

  1. Написать
  2. Трубка
  3. Чистая лаборатория

Я надеюсь, что это помогает!

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

Если вы не подписаны как средний участник, рассмотрите возможность подписки через моего реферала.