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

Как приложение будет выглядеть окончательно

Код этой статьи находится по адресу:

kshirsagarsiddharth/machine_learning_model_for_car_prediction (github.com)

ПОСТАНОВКА ЗАДАЧИ

  1. Мы являемся частью компании SECOND CARS и продаем подержанные карты.
  2. В ходе недавнего опроса компаний было замечено, что продавцы неправильно оценивают автомобили, принадлежащие «Шевроле». Цены на некоторые автомобили сильно завышены, а на некоторые недооценены, что привело к значительным убыткам в предыдущем квартале.
  3. Чтобы исправить это, высшее руководство поручило нам создать модель, которая будет эффективно предсказывать цены на автомобили с минимальной ошибкой. Так что продавцам будет полезно правильно оценить машину.
  4. Они также попросили нас подготовить дерево решений для продавцов, которые также хотят использовать свою собственную интуицию в сочетании с моделью.
  5. Они попросили нас создать интерактивные информационные панели для наших продавцов без технического образования.
  6. Они также попросили нас создать RESTful API, который будет программно использоваться ИТ-отделами других наших клиентов для получения цен.

Цели

  1. Данные компании находятся в базе данных SQLite. Итак, нам нужно извлечь строки, принадлежащие только «Шевроле».
  2. Преобразование данных в пандас DataFrame.
  3. Обучите модель машинного обучения и сохраните модель машинного обучения.
  4. Создайте RESTful API и разверните его в героку.
  5. Создайте панель инструментов Plotly Dash в качестве внешнего интерфейса для продавцов, чтобы узнать цену, которую также можно развернуть на героку.

Часть 1: Загрузка данных из базы данных SQL в pandas

1.1: Способ 1 для загрузки данных из базы данных в фрейм данных:Установите ipython-sql для выполнения запросов непосредственно в ячейке jupyter.

pip install ipython-sql

1.1.1 Подключение к базе данных

# in my case the data is at the same location where my notebook is located hence I have given that location
%load_ext sql
%sql sqlite:///car_prediction_dataset.sqlite3

Понимание структуры базы данных

  1. Есть две таблицы, которые содержат данные, которые нам нужны.
  2. индексный столбец в model_info на самом деле model_id из model_with_companies.
  3. Другими словами, model_id в model_with_companies является внешним ключом model_info..
  4. Мы выполним внутреннее соединение index в model_info и model_id в model_with_companies и выберем только строки, необходимые для нашего моделирования.

По условию задачи я выбираю только компании, принадлежащие «Шевроле»

Примечание. ON mc.model_id = mi.»index» в этом случае «index» находится в двойных кавычках, потому что index — это стандартная функция или что-то в SQLite, поэтому он заключен в двойные кавычки.

1.1.2 Метод 2 для загрузки данных в pandas DataFrame с использованием метода read_sql_query pandas

Установить необходимый модуль: pip install SQLAlchemy

2.1 Обучающая модель машинного обучения

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

import numpy as np 
import pandas as pd 
from sklearn.model_selection import train_test_split 
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error 
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder 
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import ColumnTransformer 
from sklearn.pipeline import Pipeline

2.2 Проверка нулевых значений

df.isnull().sum()
year             0
price            0
km_traveled      0
tax              0
engineSize       0
km_per_liters    0
model            0
transmission     0
fuel_type        0
dtype: int64

2.3 Разделите набор данных на зависимый и независимый

y = df['price']
X = df.drop('price', axis = 1)
df['model']
0                               Camaro
1                          TrailBlazer
2          Silverado 2500 Extended Cab
3                          Astro Cargo
4                     S10 Extended Cab
                     ...              
5096                Express 1500 Cargo
5097     Silverado 2500 HD Regular Cab
5098                          Cavalier
5099                       Monte Carlo
5100    Silverado 2500 HD Extended Cab
Name: model, Length: 5101, dtype: object

2.4 Разделите набор данных на 3 части: обучение, тестирование и валидность.

Примечание: мы могли бы просто взять весь набор данных, применить pd.dummies к неупорядоченным столбцам и преобразовать упорядоченные категориальные столбцы в целые числа, но я этого не делаю, потому что это очень плохая практика.

  1. Мы хотим, чтобы наборы данных для обучения, тестирования и проверки были разделены.
  2. Что, если появятся новые данные, мы не сможем использовать метод pd.dummies для преобразования нового набора данных.
  3. использование метода pd.dummies не масштабируется и мешает нам быстро разрабатывать новые модели и тестировать

2.5 Извлечение имен числовых и категориальных столбцов

Примечание: столбцы год, модель кодируются метками, столбцы transmission,fuel_type — горячим кодированием.

numeric_columns = X.select_dtypes(exclude='object').columns
unordered_columns =['transmission', 'fuel_type']
# I am not one hot encoding year and model because there are too many values 
ordered_columns = ['year', 'model']
print(numeric_columns)
print(unordered_columns)
print(ordered_columns)
Index(['km_traveled', 'tax', 'engineSize', 'km_per_liters'], dtype='object')
['transmission', 'fuel_type']
['year', 'model']

2.6 Один категориальный столбец горячего кодирования

2.7 Lable Encoding столбцы упорядоченных категорий

2.8 Масштабирование числового столбца

2.9 Объединение числовых и категориальных столбцов

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

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

2.12 Итак, лучше всего работают модели ElasticNet и RandomForest, поэтому давайте выполним поиск по сетке по алгоритму ElasticNet.

GridSearch в ElasticNet

2.13 Итак, мы упростили предварительную обработку, но все еще слишком много кода, поэтому есть еще один метод, с помощью которого можно автоматизировать весь процесс. Мы будем использовать преобразование столбцов.

  1. Есть еще один недостаток описанного выше метода: сначала нам нужно сохранить все 3 трансформатора и модель для загрузки позже. Другими словами, нам нужно выбрать три преобразователя и модель и загрузить 4 файла позже в коде развертывания для прогнозирования.
  2. Подход не оптимизирован для быстрого обучения.


2.14 Использование преобразователя столбцов

Применяет преобразователи к столбцам массива или pandas DataFrame.

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

Итак, этот конвейер работает нормально. Чтобы улучшить результаты, мы также можем выполнить поиск по сетке в этом конвейере. Пожалуйста, обратитесь к руководству по ColumnTransformer для получения дополнительной информации.

Сохранение модели

import joblib
# saving the model 
joblib.dump(grid_search.best_estimator_,'final_car_prediction_model.pkl')
# saving the column names 
joblib.dump(list(X.columns),'column_names.pkl')
['column_names.pkl']

Загрузка сохраненной модели

loaded_model = joblib.load('final_car_prediction_model.pkl')

Создание прогноза для загруженной модели

joblib.load('column_names.pkl')))
loaded_model.predict(pd.DataFrame(data = [['2018', 39842.43038, 0, 1.5, 20.3643976, 'Camaro', 'Manual','Petrol']],
                                  columns = 
array([12693.99485813])

Теперь пришло время создать панель мониторинга, как было задано, найти следующую часть в

https://siddharth1.medium.com/deploy-ml-project-as-dashboard-with-google-authentication-14fee8c6988c