Создание сквозного конвейера в машинном обучении (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, в котором суммируется время выполнения конвейера, информация об обученных данных и показатели производительности модели. Кроме того, создаются различные графики, демонстрирующие сравнение распределения данных, показатели производительности модели и матрицы путаницы.
Всеобъемлющий отчет служит ценным ресурсом для специалистов по данным, позволяя им глубже понять сильные и слабые стороны модели и области для улучшения.
Заключение
В этой статье мы рассмотрели ключевые аспекты построения конвейера машинного обучения, сосредоточив внимание на обработке утечек данных. Уделяя приоритетное внимание предотвращению утечки данных, возможности повторного использования, комплексной отчетности и поддержке развертывания, специалисты по данным могут повысить надежность и эффективность своих моделей.
Сильный акцент на лучшие практики и целостность данных гарантирует, что разработанный конвейер позволяет пользователям создавать надежные модели, которые хорошо обобщают невидимые данные. Это способствует более точным и эффективным приложениям машинного обучения в различных областях.