Наука о данных + машинное обучение + веб-разработка
Веб-разработка и наука о данных были моей давней страстью. Всегда была идея объединить эти два интереса, объединить их вместе и создать проект. Наконец, мне удалось выполнить эту задачу, создав веб-приложение, которое прогнозирует стоимость недвижимости и домов в городе Бангалор, Индия. Это был огромный проект, который потребовал времени. Я обязательно проведу вас через каждый шаг, который я сделал.
В основном проект состоит из 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.
Надеюсь, вы все поняли и многому научились на своем пути.
Спасибо!