Запуск модели машинного обучения Lending Club в производство

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

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

Есть еще одна, еще более очевидная причина, по которой вы можете захотеть запустить свою модель в производство: вы можете использовать ее или поделиться ею с другими! Я живу в штате, где инвесторам не разрешено использовать Lending Club, и я хотел иметь возможность делиться своими моделями с друзьями или семьей, которые могли бы их использовать, независимо от того, обучены они Python или нет.

Для тех, кто не знаком, LendingClub - это площадка для однорангового кредитования. По сути, заемщики обращаются за займами, и LendingClub им назначает процентную ставку. Индивидуальные инвесторы могут выбирать ссуды для финансирования или инвестирования, привлекая капитал для ссуды аналогично кампании краудсорсинга. Как инвестор, ваша доходность зависит от выбранных вами займов (как процентных ставок, так и ставок по умолчанию). Следовательно, если вы можете лучше предсказать, какие заемщики выплатят свои займы, вы можете ожидать более высокой доходности инвестиций.

Для одного из моих личных проектов я построил модель, которая надежно отбирала портфель ссуд, превышающий среднерыночный. После того, как моя модель была полностью настроена (т.е. была завершена часть «науки о данных»), было 5 основных шагов для запуска модели в производство.

Сохранение / сериализация вашей модели

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

Чтобы использовать нашу модель функционально, нам нужно сохранить результаты для будущего использования. Это также известно как сериализация. Простой способ сделать это в Python - использовать библиотеку рассола.

Из документации библиотеки:

Модуль pickle реализует бинарные протоколы для сериализации и десериализации структуры объекта Python. Обработка - это процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а извлечение - это обратная операция, посредством которой поток байтов (из двоичного файл или байтовый объект ) преобразуется обратно в иерархию объектов.

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

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

rf.fit(X,y)
import pickle
pickle.dump(rf, open('rf.sav', 'wb'))

Затем в нашей пользовательской программе, когда мы хотим перезагрузить нашу модель:

rf = pickle.load(open(‘rf.sav’, ‘rb’))

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

Загрузка данных в реальном времени - с помощью Lending Club API

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

К счастью, Lending Club предоставляет простой в использовании API, с которым мы можем взаимодействовать, используя библиотеку запросов. Запросы позволяют очень легко выполнять HTTP-запросы, позволяя взаимодействовать с веб-страницами и API. Вы можете найти документацию здесь.

Первые две строки кода определяют переменные и параметры для нашего запроса. Наша переменная apikey определяется, когда пользователь входит в систему (и вводит свой ключ API), а Content-Type определяет формат данных, возвращаемых API. Lending Club перечисляет новые займы четыре раза в день. Параметр «showAll» сообщает API, следует ли возвращать все финансируемые ссуды или только ссуды из последнего листинга.

header = {‘Authorization’: apikey, ‘Content-Type’: ‘application/json’}
params = {‘showAll’: ‘True’}

Следующий код делает запрос из Lending Club API:

url = ‘https://api.lendingclub.com/api/investor/v1/loans/listing’
resp = requests.get(url, headers=header, params=params)

Наконец, мы извлекаем информацию о ссуде из ответа и форматируем ее как фрейм данных pandas.

loans = resp.json()[‘loans’]
loans = pd.DataFrame.from_dict(loans)

Теперь у нас есть живые данные от LendingClub в знакомом формате.

Обработка данных в реальном времени

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

Это имеет значение для некоторых решений, которые мы принимаем во время очистки данных и разработки функций. Например, преобразование журнала будет значительно проще реализовать таким же образом в производственной среде, чем преобразование box-cox.

Прогнозировать вероятность погашения с помощью модели

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

Реализация модели с помощью пользовательского интерфейса

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

Моя первая программа была просто скриптом, который выводил на терминал фрейм данных с результатами модели. Это заставило меня задуматься над многими из приведенных выше уроков, и я думаю, что это вполне плодотворное и стоящее занятие, если до этого дойти. Однако я также хотел создать графический пользовательский интерфейс (то, что большинство людей считают программой или приложением). Я чувствовал, что это значительно повысит мою способность делиться своей программой с другими, и я также чувствовал, что моя неспособность создать приложение - это то, что я должен исправить.

Я остановился на PyQt5 как на библиотеке для разработки. Процесс был довольно обширным, и я писал о нем подробнее во части второй этой статьи. Есть несколько онлайн-пошаговых инструкций, которые, наряду с документацией, позволили ознакомиться с ними. Дизайнер Qt, который позволяет визуально размещать окна и генерировать для вас код, также оказался невероятно полезным.

Заключение

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

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

Если вас интересуют основы настройки графического интерфейса пользователя (GUI) для этой программы, ознакомьтесь со второй частью здесь.