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

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

Очевидно, есть удобный и аккуратный способ сделать это в коде с помощью Pipelines.

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

Приступаем👇

Изучение набора данных

Набор данных, который мы будем использовать для этого мини-проекта, будет получен от Kaggle — Табличный набор данных для обнаружения сердечной недостаточности, доступный по лицензии Creative Common. Возьмите его по ссылке Kaggle ниже:



Давайте импортируем его и посмотрим, как он выглядит!

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

The shape of the data:
Output:
((209, 12), (90, 12), (209,), (90,))

Наконец, мы исследуем все числовые столбцы нашего набора данных:

X_train.describe().T

Глядя на категориальные данные, мы убеждаемся, что их нет:

# there are no categorical features
categorical_features = X_train.select_dtypes(exclude='number').columns.tolist()
categorical_features

И теперь мы можем перейти к строительству нашего трубопровода!

Наш конвейер Scikit-Learn

Конвейер предварительной обработки

Во-первых, мы строим наш конвейер предварительной обработки. Он будет состоять из двух компонентов: 1) экземпляра MinMaxScalar для преобразования данных в диапазон (0, 1) и 2) экземпляра SimpleImputer для заполнения пропущенных значений с использованием среднего значения существующих значений в столбцы.

col_transformation_pipeline = Pipeline(steps=[
    ('impute', SimpleImputer(strategy='mean')),
    ('scale', MinMaxScaler())
])

Мы собрали их вместе, используя ColumnTransformer.

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

Тогда давайте все вместе:

Потрясающий! Первая часть нашего пайплайна готова!

Теперь давайте построим нашу модель.

Конвейер модели

Для этой задачи мы выбираем классификатор Random Forest. Давайте запустим объект быстрого классификатора:

# random forest classifier
rf_classifier = RandomForestClassifier(n_estimators = 11, criterion='entropy', random_state=0)

И мы можем объединить нашу предварительную обработку и модели в одном конвейере:

rf_model_pipeline = Pipeline(steps=[
    ('preprocessing', columns_transformer),
    ('rf_model', rf_classifier),
])

Теперь подогнать наши обучающие данные достаточно просто:

rf_model_pipeline.fit(X_train, y_train)

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

# predict on test set
y_pred = rf_model_pipeline.predict(X_test)

Собираем вместе:

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

Давайте рассмотрим это дальше!

Использование GridSearch с нашим пайплайном

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

Давайте сначала создадим нашу сетку параметров:

params_dict = {'rf_model__n_estimators' : np.arange(5, 100, 1), 'rf_model__criterion': ['gini', 'entropy'], 'rf_model__max_depth': np.arange(10, 200, 5)}

В этом случае мы сосредоточимся на настройке трех параметров нашей модели:

  1. n_estimators: количество деревьев в случайном лесу,

2. критерий: функция для измерения качества разделения и

3. max_depth : максимальная глубина дерева.

Важно отметить следующее: вместо простого использования n_estimators в качестве имени параметра в нашей сетке мы используем: rf_model__n_estimators. Здесь префикс rf_model__ происходит от имени, которое мы выбрали для нашей модели случайного леса в нашем пайплайне. (см. предыдущий раздел).

Далее мы просто используем модуль GridSearch для обучения нашего классификатора:

grid_search = GridSearchCV(rf_model_pipeline, params_dict, cv=10, n_jobs=-1)
grid_search.fit(X_train, y_train)

Давайте объединим все это в одно:

Теперь достаточно легко предсказать, используя наш объект grid_search следующим образом:

Потрясающий! Мы построили полный пайплайн для нашего проекта!

Несколько напутственных слов…

Итак, вот оно! Полный конвейер sklearn, состоящий из препроцессора, модели и поиска по сетке, экспериментировал с мини-проектом от Kaggle. Я надеюсь, что вы найдете этот урок поучительным и легким для понимания.

Пришло время похлопать себя по спине! 😀

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

В будущем я вернусь и напишу еще несколько статей на основе Scikitlearn. Так что подпишитесь на меня на Medium и будьте в курсе!

Я также рекомендую стать участником Medium, чтобы не пропустить ни одной статьи по науке о данных, которую я публикую каждую неделю. Присоединяйтесь сюда 👇



Присоединиться!

Подпишитесь на меня в Твиттере.
Познакомьтесь с полным репозиторием кода всех моих сообщений о науке о данных!

Еще несколько моих статей, которые могут быть вам интересны: