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

В этой статье мы рассмотрим ключевые моменты, которые следует учитывать при построении конвейера машинного обучения, сосредоточившись на обработке утечки данных в случае Iris Classification. Мы углубимся в следующие темы:

1. Предотвращение утечки данных

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

2. Возможность повторного использования

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

3. Полная отчетность

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

4. Поддержка файлов для развертывания

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

Чтобы обеспечить визуальный обзор этапов разработки пайплайна, ниже приведена схема:

Обратите внимание, что код, который использовался для объяснения деталей, является частью сквозного проекта машинного обучения, который можно найти в моем репозитории здесь, внутри файла pipeline.py.

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

1. Получение данных

Конвейер начинается с получения набора данных с удаленного сервера, такого как Репозиторий машинного обучения UCI. Этот процесс можно выполнить с помощью таких библиотек, как pandas, которые предоставляют метод read_csv для чтения данных из CSV-файлов.

# Getting data
self.col_names = ['sepal_length', 'sepal_width', 
                  'petal_length', 'petal_width', 
                  'class']
self.data = pd.read_csv(
               'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', 
               names=self.col_names
            )

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

try:
      # Acquisition data process...
      # ...
      # ...
except ConnectionError:
      print('Error: Could not connect to server.')
except ValueError:
      print('Error: Could not load data into DataFrame.')

2. Предварительная обработка данных

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

Ключевые подэтапы, связанные с предварительной обработкой данных, следующие:

  • Кодирование меток классов. Если метки классов имеют строковый формат, необходимо закодировать их в числовые значения. Этот процесс обычно выполняется с использованием таких методов, как Label Encoding или One-Hot Encoding, в зависимости от характера проблемы и используемых алгоритмов.
self.label_encoder = LabelEncoder()
self.label_encoder.fit(self.data['class'])
self.data['class_label'] = self.label_encoder.transform(self.data['class'])
  • Разделение данных. Разбиение данных в начале имеет решающее значение, чтобы гарантировать, что информация из проверочного набора не просочится в процесс обучения. Когда данные разделены в начале, мы можем выполнить этапы предварительной обработки, такие как проектирование признаков или масштабирование (позже) только для обучающих данных, и сохранить информацию из этого процесса. Затем примените те же шаги к проверочным или тестовым данным. Технически мы можем использовать метод train_test_split из библиотеки sk-learn, чтобы легко разделить данные. Мы можем указать параметр stratify для поддержания баланса классов для набора поездов и проверки. Кроме того, можно заполнить параметр random_state, чтобы гарантировать, что данные разделения будут одинаковыми при каждом запуске.
train_test_split(X, y, test_size=.2, stratify=y, random_state=self.random_state)
  • Разработка функций. Разработка функций включает в себя создание новых функций из существующего набора данных для улучшения прогностических возможностей модели. На этом этапе мы могли бы реализовать методы проектирования признаков, создав признаки sepal_area и petal_area на основе измерений чашелистиков и лепестков. Используя эти новые функции, мы предоставляем информацию о модели, которая может помочь выявить основные закономерности в данных и упростить модель.
# Create area feature for sepal and petal
self.fe_source_columns = {'sepal_area': ['sepal_width', 'sepal_length'],
                          'petal_area': ['petal_width', 'petal_length']}

data['sepal_area'] = data[self.fe_source_columns['sepal_area']].prod(axis=1) 
data['petal_area'] = data[self.fe_source_columns['petal_area']].prod(axis=1)
  • Масштабирование данных. Масштабирование данных необходимо для обеспечения одинакового масштаба всех функций. Масштабирование не позволяет объектам с большими значениями доминировать в расчетах расстояний и помогает создать более сбалансированную и надежную модель. Один из способов, мы можем использовать стандартный скейлер. Этот метод масштабирования позволит функциям иметь нулевое среднее значение и единичную дисперсию, что сделает их сопоставимыми и подходящими для обучения моделей машинного обучения.
# Data scaling
self.scaler = StandardScaler()
self.scaler.fit(self.x_train)
self.x_train = self.scaler.transform(self.x_train)

3. Построение модели

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

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

# Example, build Logistic Regression model
model_lr = LogisticRegression(random_state=self.random_state)
model_lr.fit(self.x_train, self.y_train)
self.lr = model_lr

4. Оценка модели

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

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

# prepare validation data
self.x_val = self._feature_engineering(data=self.x_val)
self.x_val = self.scaler.transform(self.x_val) 

# make predictions and calculate metrics
results = {} 
models = [self.lr, self.dtc, self.svc]
for model in models:
  y_pred = model.predict(self.x_val)
  results[type(model).__name__] = {
    'accuracy': acc(y_true=self.y_val, y_pred=y_pred),
    'precision': prec(y_true=self.y_val, y_pred=y_pred, average='macro'),
    'recall': rec(y_true=self.y_val, y_pred=y_pred, average='macro'),
    'f1-score': f1(y_true=self.y_val, y_pred=y_pred, average='macro'),
    'confusion_matrix': cm(y_true=self.y_val, y_pred=y_pred)
  }

5. Экспорт файла

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

self.pipeline_object = {
  'scaler': self.scaler,
  'label_encoder': self.label_encoder,
  'model_lr': self.lr,
  'model_dtc': self.dtc,
  'model_svc': self.svc,
  'trained_data': self.x_train,
  'trained_label': self.data.loc[self.train_index]['class'].tolist(),
  'feature_engineering': self.fe_source_columns
}

joblib.dump(self.pipeline_object, './pipeline.bin' )

6. Создание отчета

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

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

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

Заключение

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

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