Научитесь легко создавать конвейеры предварительной обработки, моделирования и поиска по сетке с помощью мини-проекта.
Каждый раз, когда вы выбираете набор данных для проекта, перед вами ставится задача очистки и предварительной обработки данных, работы с отсутствующими данными и выбросами, моделирования и даже выполнения поиска гиперпараметров, чтобы найти оптимальный набор гиперпараметров для использования в ваших оценках.
Очевидно, есть удобный и аккуратный способ сделать это в коде с помощью 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)}
В этом случае мы сосредоточимся на настройке трех параметров нашей модели:
- 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, чтобы не пропустить ни одной статьи по науке о данных, которую я публикую каждую неделю. Присоединяйтесь сюда 👇
Присоединиться!
Подпишитесь на меня в Твиттере.
Познакомьтесь с полным репозиторием кода всех моих сообщений о науке о данных!
Еще несколько моих статей, которые могут быть вам интересны: