PyCaret — это библиотека машинного обучения с открытым исходным кодом на Python, которая автоматизирует рабочие процессы машинного обучения. Это оболочка Python для нескольких библиотек и фреймворков машинного обучения, таких как scikit-learn, XGBoost, LightGBM, CatBoost, spaCy, Optuna, Hyperopt, Ray и некоторых других. Поскольку PyCaret устанавливает несколько зависимостей и требует определенной среды, рекомендуется устанавливать его в виртуальной среде. Мы выбираем контейнеры Docker для установки PyCaret из-за официальной поддержки и простоты управления Docker как в локальной, так и в облачной среде.

Мы можем начать с установки Docker Desktop для управления контейнерами Docker на нашем ноутбуке. После того, как эти контейнеры будут готовы, их можно развернуть в облачном провайдере, таком как AWS. После установки Docker Desktop все, что нам нужно сделать, это запустить эту команду, чтобы вызвать полностью установленную библиотеку PyCaret с настройкой Jupyter Notebook, чтобы начать работу с нашими проектами машинного обучения.

docker run -p 8888:8888 pycaret/full

Это приводит к тому, что Терминал повторяет URL-адрес с токеном, необходимым для доступа к защищенной среде Jupyter. Это похоже на следующий пример.

http://127.0.0.1:8888/?token=ca3886f06ea4f3c596f80a1c8a03507293388703b6a54b87

Когда мы вставляем этот URL-адрес в наш браузер, нас встречает знакомый домашний экран Jupyter.

Мы также заметили, что в Docker Desktop запущен новый контейнер с образом pycaret/full:latest.

Пока мы не удаляем наш образ контейнера, а только выключаем и перезапускаем его, наши блокноты продолжают сохраняться в контейнере. Теперь это может быть хорошо, если мы просто экспериментируем с PyCaret, однако мы хотим также добавить другие фреймворки в нашу цепочку инструментов, такие как Streamlit, которые будут работать в своем собственном контейнере. Одна из проблем заключается в том, как мы обмениваемся данными между двумя контейнерами. Еще одна проблема заключается в том, что мы не можем следовать методу выключения/перезапуска контейнера Streamlit, поскольку мы будем удалять и перестраивать образ каждый раз при изменении нашего приложения Streamlit. Таким образом, для обоих сценариев решением является общий том докера между двумя контейнерами. Итак, мы создаем том с именем shared вот так.

docker volume create shared

Теперь используйте этот том для запуска официального док-контейнера PyCaret. На этот раз мы используем флаг -d, чтобы процесс контейнера работал в фоновом режиме. Это освобождает тот же экземпляр терминала для создания большего количества контейнеров в будущем. Мы по-прежнему можем управлять контейнером с помощью Docker Desktop, включая доступ к URL-адресу приложения с токеном. Просто щелкните имя контейнера на рабочем столе Docker после его запуска. Другой параметр команды, который мы используем, — это -p, чтобы указать порт, используемый для запуска среды PyCaret и Jupyter. Затем мы используем параметр -v, чтобы указать общий том и сопоставить его с папкой work, которую мы видим в среде Jupyter. Полный путь к этой папке: /home/jovyan/work. Теперь, когда мы сохраняем любые записные книжки, модели или файлы данных, они доступны в общем томе, даже если контейнер удален.

docker run -d -p 8888:8888 -v shared:/home/jovyan/work pycaret/full

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

Мы рассмотрим несколько фрагментов из блокнота, чтобы выделить функции PyCaret с низким кодом. Весь блокнот можно найти в официальном руководстве.

Перейдем в рабочую папку и создадим новый Python 3 (ipykernel). Мы переименуем наш блокнот в creditml имя файла. Мы можем начать с просмотра набора данных и отметить, что PyCaret предлагает репозиторий наборов данных, готовых к машинному обучению, которые могут помочь ускорить эксперименты с библиотеками и алгоритмами машинного обучения. Нам не нужно выполнять трудоемкий поиск и подготовку данных для подготовки этих наборов данных к обучению модели ML.

from pycaret.datasets import 
dataset = get_data('credit')

Затем мы разделяем набор данных на то, что будет использоваться для обучения модели ML, и на то, что будет использоваться для оценки прогнозов. Мы не хотим, чтобы модель обучалась на оценочных данных, чтобы мы могли имитировать прогнозы реального мира.

data = dataset.sample(frac=0.95, random_state=786)
data_unseen = dataset.drop(data.index)
data.reset_index(inplace=True, drop=True)
data_unseen.reset_index(inplace=True, drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))

Мы также сохраняем данные оценки для использования в нашем приложении Streamlit.

data_unseen.to_csv('data_unseen_creditml.csv', sep=',', encoding='utf-8')

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

exp_clf101 = setup(data = dataset, target = 'default', session_id=123)

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

best_model = compare_models()

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

models()

Теперь мы можем построить нашу модель на основе выбранного классификатора ML. В этом случае мы выбрали классификатор случайного леса, чтобы показать, как автоматическая настройка гиперпараметров может значительно изменить производительность модели. Обратите внимание, что мы улучшили точность этой модели.

rf = create_model('rf')
tuned_rf = tune_model(rf)

Мы также можем распечатать гиперпараметры модели до и после настройки.

print(rf)
print(tuned_rf)

Что приводит к следующему выводу.

RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=None, max_features='auto',
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=100,
                       n_jobs=-1, oob_score=False, random_state=123, verbose=0,
                       warm_start=False)
RandomForestClassifier(bootstrap=False, ccp_alpha=0.0, class_weight={},
                       criterion='entropy', max_depth=5, max_features=1.0,
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0002, min_impurity_split=None,
                       min_samples_leaf=5, min_samples_split=10,
                       min_weight_fraction_leaf=0.0, n_estimators=150,
                       n_jobs=-1, oob_score=False, random_state=123, verbose=0,
                       warm_start=False)

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

evaluate_model(tuned_rf)

Теперь все, что нам нужно сделать, это еще один тест с данными теста/удержания, и мы отметим точность по сравнению с настроенной моделью.

predict_model(tuned_rf);

Теперь мы можем доработать модель и обучиться всему набору данных, включая тестовые/удерживаемые данные.

final_rf = finalize_model(tuned_rf)

Мы также можем предсказать модель, используя невидимые данные.

unseen_predictions = predict_model(final_rf, data=data_unseen)
unseen_predictions.head()

Используйте следующий код для оценки общей точности.

from pycaret.utils import check_metric
check_metric(unseen_predictions['default'], unseen_predictions['Label'], metric = 'Accuracy')

Теперь мы готовы сохранить нашу модель. Отмечаем, что в нашей рабочей папке появилась целая куча новых файлов, включая сохраненный файл модели CreditML RF Model 2022-Sep-05.pkl pickle.

save_model(final_rf,'CreditML RF Model 2022-Sep-05')

И конвейер преобразования, и модель сохраняются.

(Pipeline(memory=None,
          steps=[('dtypes',
                  DataTypes_Auto_infer(categorical_features=[],
                                       display_types=True, features_todrop=[],
                                       id_columns=[],
                                       ml_usecase='classification',
                                       numerical_features=[], target='default',
                                       time_features=[])),
                 ('imputer',
                  Simple_Imputer(categorical_strategy='not_available',
                                 fill_value_categorical=None,
                                 fill_value_numerical=None,
                                 numeric_stra...
                  RandomForestClassifier(bootstrap=False, ccp_alpha=0.0,
                                         class_weight={}, criterion='entropy',
                                         max_depth=5, max_features=1.0,
                                         max_leaf_nodes=None, max_samples=None,
                                         min_impurity_decrease=0.0002,
                                         min_impurity_split=None,
                                         min_samples_leaf=5,
                                         min_samples_split=10,
                                         min_weight_fraction_leaf=0.0,
                                         n_estimators=150, n_jobs=-1,
                                         oob_score=False, random_state=123,
                                         verbose=0, warm_start=False)]],
          verbose=False),
 'CreditML RF Model 2022-Sep-05.pkl')

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

docker run -d -p 8888:8888 -v shared:/home/jovyan/work pycaret/full

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