Наука о данных + машинное обучение + веб-разработка

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

В основном проект состоит из 4 этапов:

Data Science

Первым шагом является типичная работа по науке о данных, когда мы берем набор данных из Kaggle под названием Данные о ценах на недвижимость в Бангалоре. Мы проведем над ним обширную работу по очистке данных, чтобы гарантировать получение точных результатов во время прогнозирования.

В этом блокноте jupyter под названием RealEstatePricePredictor.ipynb мы выполняем всю работу, связанную с наукой о данных. Поскольку блокнот jupyter не требует пояснений, я кратко коснусь реализованных мной концепций. Наш набор данных требует большой работы с точки зрения очистки данных. Фактически, 70% записной книжки посвящено очистке данных, когда мы удаляем пустые строки и удаляем ненужные столбцы, которые не помогают в прогнозировании.

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

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

Опять же, все это было объяснено в блокноте jupyter.

В конце концов, исходный набор данных, в котором было почти 13000 строк и 9 столбцов, сократился до почти 7000 строк и 5 столбцов.

Машинное обучение

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

Оказывается, модель линейной регрессии дает лучшие результаты для наших данных с показателем выше 80%, что неплохо.

Теперь нашу модель нужно экспортировать в файл рассола (Bengaluru_House_Data.pickle), который преобразует объекты Python в поток символов. Кроме того, нам нужно экспортировать местоположения (столбцы) в файл json (columns.json), чтобы иметь возможность взаимодействовать с ним из внешнего интерфейса.

Сервер

Мы будем использовать сервер Flask в качестве бэкэнда для локального размещения приложения. В папке сервера мы установим два файла:

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

Файл util.py - это главный мозг серверной части. У него есть функция для загрузки JSON и файла рассола. Этот файл принимает данные формы из server.py и использует модель для прогнозирования ориентировочной цены собственности.

Внешний интерфейс

Интерфейс состоит из простых HTML, CSS и JavaScript. Пользователь может выбрать количество квадратных футов, BHK, ванные комнаты и местоположение в форме и нажать кнопку ESTIMATE, чтобы получить ориентировочную цену. Файл JavaScript отвечает за взаимодействие как с маршрутами внутреннего флеш-сервера, так и с внешним интерфейсом HTML. Он получает данные формы, заполненные пользователем, и вызывает функцию, которая использует модель прогнозирования и отображает оценочную цену в лакхских рупиях (1 лакх = 100000).

Результат

Посмотрим, как работает наш проект. Запустите файл server.py в серверной части и откройте созданную нами веб-страницу HTML. Введите площадь собственности в квадратных футах, количество BHK, количество ванных комнат и местоположение и нажмите «ESTIMATE». 😲Ура! Мы предсказали цену того, что может стать домом чьей-то мечты.

Бонус - Развертывание

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

На данный момент проект является только локальным, мы узнаем, как развернуть приложение в Интернете с помощью экземпляра AWS EC2.

Мы будем использовать nginx, который представляет собой веб-сервер, который может обслуживать HTTP-запросы. Затем nginx может взаимодействовать с нашим Flask Server.

Скачайте nginx отсюда и установите его.

  • ШАГ 1: Для оценки в файле script.js изначально у нас были эти две строки:
var url = "http://127.0.0.1:5000/predict_home_price";
var url = "http://127.0.0.1:5000/get_location_names";

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

var url = "/api/predict_home_price";
var url = "/api/get_location_names";

Нам нужно настроить обратный прокси на сервере nginx так, чтобы все запросы к «/ api» направлялись только на порт 5000.

  • ШАГ 2: Войдите в свою консоль AWS. Вам нужно будет знать, как бесплатно запустить инстанс AWS EC2. Выполняя шаги по запуску вашего экземпляра на шаге 6, обязательно добавьте тип запроса HTTP и HTTPS, чтобы люди могли получить доступ к вашему сайту.

  • ШАГ 3. Создайте новую пару ключей, введите имя, загрузите ключ (файл .pem) и запустите экземпляр EC2.

  • ШАГ 4: Нажмите на опцию «Подключить» рядом с «Запустить экземпляр», где будет команда под «Примером».

Скопируйте эту команду. Это выглядело бы примерно так.

  • ШАГ 5: Откройте оболочку bash и вставьте эту команду, но заменив затемненную область на путь к загруженному PEM-файлу.

Теперь вы подключены к машине Linux в облаке AWS.

  • ШАГ 6: Теперь вам нужно скопировать свой проект на эту виртуальную машину с помощью WinSCP. Загрузите и запустите WinSCP.

  • ШАГ 7. Если на вашем AWS снова нажать «Подключиться», над «Примером» появится команда, которая выглядит примерно так:

Скопируйте это имя вашего хоста WinSCP, так как это имя хоста вашей виртуальной машины.

  • ШАГ 7. Имя пользователя - ubuntu. Перед вводом пароля нам нужно преобразовать файл .pem в файл .ppk с помощью PuTTYgen. Пожалуйста, скачайте PuTTYgen по этой ссылке.
  • Нажмите кнопку «Дополнительно» под полем «Пароль». Выберите загруженный файл .pem, он откроет PuTTYgen для преобразования файла .pem в файл .ppk. Выберите новый .ppk и нажмите «ОК».

  • Нажмите «Войти».
  • Скопируйте всю корневую папку проекта (RealEstatePricePrediction) со своего компьютера на облачный сервер.

  • В оболочке ubuntu сервера выполните следующие команды:
sudo apt-get update
sudo apt-get install nginx
  • Скопируйте и вставьте имя хоста в диалоговом окне «Подключиться», которое мы видели ранее, в браузер.

Вы должны увидеть домашнюю страницу запущенного nginx.

  • ШАГ 8: Выполните следующие команды:
cd /etc/nginx/sites-enabled/
sudo unlink default
cd ../sites-available/
sudo vim BengaluruHousePrediction.conf

Скопируйте и вставьте следующий код в файл .conf. Это установка обратного прокси.

server {
    listen 80;
        server_name BegaluruHousePrediction;
        root /home/ubuntu/RealEstatePricePrediction/client;
        index index.html;
        location /api/ {
            rewrite ^/api(.*) $1 break;
            proxy_pass http://127.0.0.1:5000;
        }
}
  • Выйдите из vim и выполните следующие команды:
cd ../sites-enabled/
ln -v -s /etc/nginx/sites-available/BengaluruHousePrediction.conf inside /etc/nginx/sites-enabled

В приведенной выше команде мы устанавливаем символическую ссылку.

  • Перезагрузите сервер, используя:
sudo service nginx restart
  • Проверить статус с помощью:
sudo service nginx status
  • Зайдите в свой браузер и введите ссылку на имя хоста в URL-адресе. Вы должны увидеть, как загружается интерфейс вашего приложения, но он еще не работает.
  • ШАГ 9. Вернитесь в терминал и введите:
cd ~
cd RealEstatePricePrediction/server/
sudo apt-get python3-pip
sudo pip3 install Flask
sudo pip3 install scikit-learn
sudo pip3 install numpy
  • Запустите внутренний сервер, используя:
 python server.py

Теперь ваше приложение размещено в Интернете и доступно из любой точки мира.

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

Надеюсь, вы все поняли и многому научились на своем пути.

Спасибо!