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

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

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

Конвейеры Scikit-Learn

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

Набор данных

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

Строительство трубопровода

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

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

def create_pipeline():
    return Pipeline([
        ('scaler', StandardScaler()),
        ('clf', LogisticRegression())
    ])

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

Написание автоматизированного теста

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

from pipeline import create_pipeline
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

def test_pipeline_accuracy():
    # Arrange
    iris = load_iris()
    X_train, X_test, y_train, y_test = train_test_split(
        iris.data, iris.target, test_size=0.2, random_state=42)
    pipeline = create_pipeline()

    # Act
    pipeline.fit(X_train, y_train)
    accuracy = pipeline.score(X_test, y_test)

    # Assert
    assert accuracy >= 0.9

Функция test_pipeline_accuracy() загружает набор данных радужной оболочки с помощью функции load_iris(), разбивает его на обучающий набор и тестовый набор с помощью функции train_test_split() и создает объект конвейера с помощью определенной ранее функции create_pipeline(). Затем конвейер аппроксимируется на обучающем наборе с помощью метода fit(), а его точность оценивается на тестовом наборе с использованием метода score(). Наконец, точность проверяется, чтобы убедиться, что она составляет не менее 0,9, с помощью оператора assert.

Заключение

В этой статье мы продемонстрировали, как использовать конвейеры scikit-learn для задач классификации и как писать автоматические тесты для этих конвейеров с помощью pytest. Написав тесты для наших конвейеров, мы можем убедиться, что наши модели работают правильно и дают точные результаты. Тестирование — важная часть процесса разработки машинного обучения, оно может помочь нам выявить ошибки на ранней стадии и избежать дорогостоящих ошибок. Используя конвейеры, мы можем создавать модульные, многоразовые и тестируемые системы машинного обучения, которые проще поддерживать и развертывать.