Целью этого проекта было создание клона AirBnB, ориентированного исключительно на Нью-Йорк. Я работал в команде разработчиков пользовательского интерфейса, внешнего интерфейса, серверной части и специалистов по науке о данных. Моя работа заключалась в создании API, который соединял модель с серверной частью.

Пока другой разработчик Data Scientist работал над написанием хорошей модели для прогнозирования цены, я начал писать быструю базовую модель для реализации в API. Я получил свои данные из Kaggle и разместил их на моем Github здесь для удобства доступа.

Я начал там, где начинается каждый проект DS, с исследования и очистки данных. Давайте посмотрим на фрейм данных:

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

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

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

Мы можем рассчитать, насколько далеко мы будем в среднем от истинного прогноза, если вычтем наш прогноз среднего из каждой истинной цены. Затем мы можем взять среднее значение абсолютного значения каждой записи в переменной errors. Это оставляет нам количество ошибок в нашей базовой линии - 92,4.

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

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

После этого все, что остается, прежде чем мы сможем обучить нашу модель, - это разделить обучающие данные, чтобы получить набор тестов. Я воспользуюсь для этого пакетом train_test_split. Мой тестовый набор будет составлять 1/4 от полного набора.

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

Давайте посмотрим, как работает эта простая модель:

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

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

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

Функция pred_price принимает три параметра: входные данные, полученные от серверной части, модели и конвейера.

После того, как мы передадим ввод в функцию, его нужно будет преобразовать в соответствии с конвейером. После преобразования мы возвращаем результат model.predict (x).

Наконец, мы можем перейти к созданию API.

Я буду использовать Flask API, так как я уже был с ним знаком. Мой API очень прост и принимает всего 3 входных параметра: широта, долгота и min_nights (минимальное количество ночей в отеле). API будет введите исходные данные в модель, а затем она вернет цену.

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

Путь, по которому мы хотим, чтобы наши входные данные передавались, будет называться маршрутом «/ прогноз». Внутри этого маршрута будет функция предсказать.

Во-первых, нам нужно получить данные json от пользователя. Это легко сделать с помощью Flask со строкой flask.request.json. При этом будут собраны все данные json, которые отправляются по маршруту / прогноз в запросе.

Во-вторых, данные json нужно преобразовать во что-то, с чем мне будет немного легче работать. В модуле python json есть функция json.dumps (), созданная для декодирования данных json в строки.

В-третьих, я хочу сохранить дамп json в DataFrame. Я решил сохранить дамп в df, потому что его нужно было транспонировать, и к данным было легко получить доступ изнутри. Я мог бы выбрать другой тип данных для этой работы (а, возможно, мне и следовало бы это сделать), и он также сработал бы со своей работой.

В-четвертых, df можно передать в функцию pred_price.

В-пятых, мы хотим отправить бэкэнду ответ в формате json. Для этого мы воспользуемся функцией Flask jsonify. Jsonify принимает только словари Python в качестве входных данных, поэтому нам нужно будет преобразовать выходные данные функции pred_price в dict. Осталось только вернуть вывод json, и все готово!

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

К сожалению, наш инженер машинного обучения не смог вовремя завершить хорошую модель. В результате API, который я развернул на Heroku, не очень хорошо предсказывает. Это по-прежнему было хорошей практикой в ​​создании API и отличным опытом обучения. Я оставлю вам снимок экрана, на котором он работает вживую. Не стесняйтесь попробовать себя в чем-нибудь вроде Postman!