Методология межотраслевого стандартного процесса интеллектуального анализа данных (CRISP-DM) состоит из 6 этапов, включая понимание бизнеса, подготовку данных и пояснительный анализ данных (EDA), моделирование, оценку, развертывание, а также обслуживание и мониторинг. Для этого примера я бы использовал Данные о доставке электронной коммерции от Kaggle.🚢

Этап 1. Понимание бизнеса 🐣

Прежде чем мы начнем процесс анализа, нам нужно установить цели SMART (конкретные, измеримые, действенные, ориентированные на результат и ограниченные по времени) цели. Цель SMART позволит нам понять критерии, которые будут использоваться для оценки успеха проекта с точки зрения бизнеса.🎯

Для этого тематического исследования основной целью может быть достижение уровня точности не менее 80% при прогнозировании оценок клиентов в течение года с использованием конкретных деталей заказа. Это поможет компаниям принимать основанные на данных решения о своих продуктах, маркетинговых стратегиях и обслуживании клиентов. Связанные бизнес-вопросы могут быть следующими: "Получен ли ответ на запрос клиента?", Был ли продукт доставлен вовремя?" или "Если важность продукта высока, продукты были доставлены вовремя?».

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

Этап 2: подготовка данных/объяснительный анализ данных (EDA)📈

  • Загрузите набор данных из Данные о доставке электронной коммерции и сохраните его на локальном ПК. Откройте блокнот Jupyter и импортируйте необходимые библиотеки. Чтобы загрузить набор данных, вам нужно щелкнуть правой кнопкой мыши загруженный CSV-файл, выбрать копировать и вставить путь к коду. Не забудьте поставить r перед путем для преобразования обычной строки в необработанную строку. В противном случае вы можете получить ошибку Unicode.
import numpy as np # linear algebra
import pandas as pd # data processing
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
ecomm = pd.read_csv(r"C:\Users\User\Desktop\Data Science\Kaggle Data\ecomm.csv")
  • Используя Dataframe.info(), мы узнаем, что набор данных состоит из 12 столбцов и 10 999 строк. 8 столбцов данных представлены в виде целых чисел, а остальные — в виде строк. Мы также можем сделать вывод, что ни в одном столбце данных нет пропущенных значений (10 999 ненулевых значений для всех столбцов набора данных).
ecomm.info()

  • Мы можем переименовать столбец фрейма данных, заменив подчеркивание пробелом, используя метод string.replace(). После этого мы можем сделать первую букву имени каждого столбца заглавной, а остальные изменить на строчные, используя метод string.title().
new_cols=[]
for i in ecomm.columns[1:-1]:
    i = i.replace("_"," ")
    i = i.title()
    new_cols.append(i);
new_cols = ['ID'] +  new_cols
new_cols.append('Arrival')
ecomm.columns = new_cols
ecomm.columns.to_list()
  • Чтобы получить общее представление о данных, мы могли бы использовать функции DataFrame.describe(). По умолчанию эта функция возвращает описательную статистику для числовых переменных. Однако мы можем узнать информацию об объектах, включив include=’object’ в качестве параметра. (Круто, правда?😎)
ecomm.iloc[:,1:-1].describe()

ecomm.describe(include='object')

  • Прежде чем мы создадим какую-либо визуализацию, нам нужно понять тип данных для каждого из столбцов набора данных. Данные в разделах «Стоимость продукта», «Вес в граммах» и «Предлагаемая скидка» являются числовыми, и мы могли бы использовать гистограммы для изучения кумулятивного частотного распределения этих столбцов. Между тем, мы могли бы использовать графики для остальных переменных.
# Plotting multiple graphs in a grid
# Exploring the distribution of numeric columns using cumulative frequency distribution
fig, ax = plt.subplots(figsize=(20,16), facecolor='#F2F4F4')
fig.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.2, hspace=0.5)
count=1
ls = ['Cost Of The Product', 'Weight In Gms','Discount Offered']
for i in ls:
    plt.subplot(3,1,count)
    h = sns.histplot(x=i, kde=True, data=ecomm)
    h.set_title(('frequency distribution of ' + i).title(), fontsize=13)
    count+=1

Из приведенных выше гистограмм мы можем сделать вывод, что:

  1. Стоимость большинства продуктов находится в диапазоне 240,00–275,00 долларов США.
  2. Вес большинства продуктов находится в диапазоне от 1000 до 2000 граммов и от 4000 до 6000 граммов.
  3. Скидка, которая, скорее всего, будет предоставлена, составляет от 1% до 10%. В третьем квартиле много выбросов.
# for categorical data
fig, axes = plt.subplots(4,2,figsize=(16,25), facecolor='#F2F4F4')

# countplot for 'Warehouse Block'
abs_whs=ecomm["Warehouse Block"].value_counts(ascending=False)
sns.countplot(x=ecomm["Warehouse Block"], order=abs_whs.index, ax=axes[0,0], palette='CMRmap_r')
axes[0,0].set_title('Orders Handled By Each Warehouse Block', fontsize=12)
rel_whs=ecomm["Warehouse Block"].value_counts(ascending=False, normalize=True).values*100
lbs_whs=[f"{w[0]} ({w[1]:.2f}%)" for w in zip(abs_whs,rel_whs)]
axes[0,0].bar_label(container=axes[0,0].containers[0], labels=lbs_whs)

# countplot for 'Mode Of Shipment' 
abs_ship = ecomm["Mode Of Shipment"].value_counts(ascending=False) 
sns.countplot(x=ecomm["Mode Of Shipment"], order=abs_ship.index, ax=axes[0,1], palette=['#DC143C','#556b2f','#008b8b'])
axes[0,1].set_title('Number of Orders By Shipment Mode', fontsize=12)
rel_ship = ecomm["Mode Of Shipment"].value_counts(ascending=False, normalize=True).values*100
lbs_ship = [f"{s[0]} ({s[1]:.2f}%)" for s in zip (abs_ship,rel_ship)]
axes[0,1].bar_label(container=axes[0,1].containers[0], labels=lbs_ship)

# countplot for 'Customer Care Calls'
abs_calls=ecomm["Customer Care Calls"].value_counts(ascending=False)
sns.countplot(x=ecomm["Customer Care Calls"], order=abs_calls.index,ax=axes[1,0],palette='cubehelix')
axes[1,0].set_title('Number of Customer Care Calls Made by Customers', fontsize=12)
rel_calls=ecomm["Customer Care Calls"].value_counts(ascending=False, normalize=True).values*100
lbs_calls=[f"{c[0]} ({c[1]:.2f}%)" for c in zip(abs_calls, rel_calls)]
axes[1,0].bar_label(container=axes[1,0].containers[0], labels=lbs_calls)

# countplot for 'Customer Rating'
abs_rating = ecomm["Customer Rating"].value_counts(ascending=False)
sns.countplot(x=ecomm["Customer Rating"], order=abs_rating.index,ax=axes[1,1],palette="rocket")
axes[1,1].set_title('Customer Rating Received', fontsize=12);
rel_rating = ecomm["Customer Rating"].value_counts(ascending=False, normalize=True).values*100
lbs_rating = [f"{r[0]} ({r[1]:.2f}%)" for r in zip(abs_rating, rel_rating)]
axes[1,1].bar_label(container=axes[1,1].containers[0], labels=lbs_rating)

# countplot for 'Prior Purchases'
abs_prior_pur = ecomm["Prior Purchases"].value_counts(ascending=False)
sns.countplot(x=ecomm["Prior Purchases"], order=abs_prior_pur.index,ax=axes[2,0],palette='viridis')
axes[2,0].set_title('Number of Prior Purchases Made by Customers', fontsize=12)
rel_prior_pur = ecomm["Prior Purchases"].value_counts(ascending=False, normalize=True).values*100
lbs_prior_pur = [f"{pur[0]} ({pur[1]:.0f}%)" for pur in zip(abs_prior_pur, rel_prior_pur)]
axes[2,0].bar_label(container=axes[2,0].containers[0], labels=lbs_prior_pur)

# countplot for 'Product Importance'
abs_priority = ecomm["Product Importance"].value_counts(ascending=False)
sns.countplot(x=ecomm["Product Importance"], order=abs_priority.index,ax=axes[2,1])
axes[2,1].set_title('Number of Orders Made by Product Importance', fontsize=12)
rel_priority = ecomm["Product Importance"].value_counts(ascending=False, normalize=True).values*100
lbs_priority = [f"{i[0]} ({i[1]:.2f}%)" for i in zip(abs_priority, rel_priority)]
axes[2,1].bar_label(container=axes[2,1].containers[0], labels=lbs_priority)

# countplot for 'Gender'
abs_gender = ecomm["Gender"].value_counts(ascending=False)
sns.countplot(x=ecomm["Gender"], order=abs_gender.index,ax=axes[3,0],palette=['#800000','#191970'])
axes[3,0].set_title("Number of Orders Made by Customers' Gender", fontsize=12)
rel_gender = ecomm["Gender"].value_counts(ascending=False, normalize=True).values*100
lbs_gender = [f"{g[0]} ({g[1]:.2f}%)" for g in zip(abs_gender, rel_gender)]
axes[3,0].bar_label(container=axes[3,0].containers[0], labels=lbs_gender)

# countplot for 'Arrival'
abs_arrival = ecomm["Reached.On.Time Y.N"].value_counts(ascending=False)
sns.countplot(x=ecomm["Reached.On.Time Y.N"], order=abs_arrival.index,ax=axes[3,1],palette='tab20c_r')
axes[3,1].set_title('Number of Orders Based On Arrival Time', fontsize=12)
axes[3,1].set_xticklabels(['Late', 'On Time'])
rel_arrival = ecomm["Reached.On.Time Y.N"].value_counts(ascending=False, normalize=True).values*100
lbls_arrival=[f"{a[0]}({a[1]:.2f}%)" for a in zip(abs_arrival,rel_arrival)]
axes[3,1].bar_label(container=axes[3,1].containers[0],labels=lbls_arrival);

Из приведенного выше сюжета мы можем сделать следующие выводы:

  1. 33,33% заказов было обработано складским блоком F, в то время как другие складские блоки обработали остальные заказы в равной степени.
  2. Большинство заказов было отправлено морским транспортом (67,84%), затем самолетом (16,16%) и, наконец, автомобильным транспортом (16%).
  3. 32,34% клиентов нужно было сделать 4 звонка, чтобы отследить посылку. Это предостережение для компании, поскольку проблемы клиентов необходимо решать как можно скорее, без необходимости клиентам делать несколько звонков.
  4. 1 — это рейтинг со вторым по величине количеством. Скорее всего, это связано с тем, что продукты не доставляются вовремя, и с большим количеством звонков, которые необходимо сделать клиентам.
  5. Около 36% клиентов сделали 3 покупки до этого. Есть 306 постоянных клиентов, которые сделали не менее 8 покупок.
  6. Только 8,62% заказов имеют высокую важность. Большинство заказов маловажны (48,16%).
  7. 50,41% клиентов — женщины, остальные — мужчины.
  8. Более половины из 10 999 заказов (59,67%) были задержаны.

👋 Если вы хотите проверить метод добавления меток данных к вашей визуализации, ознакомьтесь с другой моей статьей Построение круговой диаграммы, гистограммы с накоплением и гистограммы столбцов (с метками данных) с использованием Matplotlib и Seaborn». 🤩

Чтобы копнуть глубже, мы могли бы задать несколько вопросов о данных и ответить на них. Результаты могут быть в любом формате.

Этап 3. Моделирование 💁‍♀️

Чтобы упростить этот случай, мы можем сопоставить рейтинг от 2 до 5 как 0, чтобы представить рейтинг, отличный от 1. Это станет бинарной классификацией, а не мультиклассовой классификацией. Поскольку вывод представляет собой категориальные данные, нам необходимо использовать классификационные модели ML, такие как логическая регрессия, K-соседи, машины опорных векторов и т. д.

Чтобы подготовить набор данных для построения модели, нам нужно масштабировать числовые переменные и использовать pandas.get_dummies для создания фиктивных переменных для категориальных переменных. После этого нам нужно разделить данные на обучающие и тестовые данные, а также импортировать необходимые библиотеки алгоритмов ML для построения моделей. 👷‍♀️

# import libraries
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier as DT

# create dummy variables for categorical variables
ecomm['Gender'] = ecomm.Gender.map({'F':0, 'M':1})
ecomm['Customer Rating'] = ecomm['Customer Rating'].map({5:0, 4:0, 3:0, 2:0, 1:1})
dummy = pd.DataFrame(pd.get_dummies(ecomm[['Warehouse Block', 'Mode Of Shipment','Product Importance']]))

# for normalizing data
from sklearn.preprocessing import scale  
ecomm1 = pd.DataFrame(scale(ecomm[['Cost_of_the_Product','Discount_offered', 'Weight_in_gms']]),
         columns=['Cost_of_the_Product','Discount_offered', 'Weight_in_gms'])

# create new datafame for modeling 
ecomm_final = pd.concat([ecomm1, dummy,ecomm[['Customer Care Calls', 'Prior Purchases','Gender', 'Arrival','Customer Rating']]],
                        axis=1)

# Split data into output and input
X = ecomm_final.iloc[:,:-1] # inputs
Y = ecomm_final['Customer Rating'] # outputs

# Split data into train data and test data
X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.25,shuffle=True)

# append different classification models into classifiers array 
classifiers=[]
KNN_model = KNeighborsClassifier(n_neighbors=11, metric='euclidean')
classifiers.append(KNN_model)
DT_model = DT(criterion = 'entropy',max_depth=4)
classifiers.append(DT_model)

Фаза 4: Оценка 🧠

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

from sklearn.metrics import accuracy_score
accuracy_train = []
accuracy_test = []
for clf in classifiers:
    clf.fit(X_train, Y_train)
    pred_train = clf.predict(X_train)
    pred_test = clf.predict(X_test)
    acc_train = accuracy_score(Y_train, pred_train)
    acc_test = accuracy_score(Y_test, pred_test)
    accuracy_train.append(acc_train)
    accuracy_test.append(acc_test)
accuracy_result = pd.DataFrame(data={'Model':['KNN','Decision Tree'],
                                     'Training Accuracy':accuracy_train,
                                     'Testing Accuracy':accuracy_test})
accuracy_result.sort_values('Testing Accuracy',ascending=False)

👋 Если вы хотите создать тепловую карту для матрицы путаницы, вы можете ознакомиться с другой моей статьей Тепловая карта для матрицы корреляции и матрицы путаницы | Дополнительные советы по машинному обучению.🍡

Этап 5. Развертывание (с использованием Flask + HTML + CSS) 🏭

Зачем необходимо развертывание? Не каждый пользователь является программистом, поэтому нереально ожидать, что конечные пользователи будут знать, как запустить Jupyter Notebook и получить результат. Следовательно, развертывание модели, вероятно, является наиболее важной частью ML.

Как мы развертываем модель? Это зависит от языка программирования, который вы хотите использовать. Если вы используете R, вы можете использовать R Shiny. Если вы используете Python, вы можете использовать Flask, и вам также необходимо иметь некоторые базовые знания HTML и CSS. Для этого тематического исследования я бы использовал Flask для демонстрации. Не беспокойся! Я собираюсь объяснить подробно.

Теперь мы создали модель с помощью классификатора KNN. Затем нам нужно использовать Pickle для сериализации обученной модели и сохранения сериализованного формата в файл. 🥒 После запуска приведенных ниже кодов вы можете найти в своем каталоге файл рассола с именем finalized_knn.pkl. Мы бы использовали его в main.py (файл приложения, чтобы сделать прогноз на основе пользовательского ввода и отправить результат обратно пользователю).

import pandas as pd
from sklearn.preprocessing import scale
from sklearn.neighbors import KNeighborsClassifier
import pickle

# Load dataset
ecomm = pd.read_csv("https://raw.githubusercontent.com/jadanpl/E-Commerce-Shipping/main/E-Commerce%20Shipping%20Data.csv")

# Rename columns
cols=[]
for i in ecomm.columns[1:-1]:
    i = i.lower()
    cols.append(i);
cols = ['ID'] +  cols
cols.append('arrival')
ecomm.columns = cols

# Data preprocessing
ecomm['gender'] = ecomm.gender.map({'F':0, 'M':1})
ecomm['customer_rating'] = ecomm['customer_rating'].map({5:0, 4:0, 3:0, 2:0, 1:1})
dummy = pd.DataFrame(pd.get_dummies(ecomm[['warehouse_block', 'mode_of_shipment','product_importance']]))
ecomm1 = pd.DataFrame(scale(ecomm[['cost_of_the_product','weight_in_gms','discount_offered']]),
                      columns=['cost_of_the_product','weight_in_gms','discount_offered'])
ecomm_final = pd.concat([ecomm1,dummy,ecomm[['customer_care_calls', 'prior_purchases','gender', 'arrival','customer_rating']]],
                        axis=1)

# Split data into output and input
X = ecomm_final.iloc[:,:-1] # inputs
Y = ecomm_final['customer_rating'] # outputs

# Model building
KNN_model = KNeighborsClassifier(n_neighbors=11, metric='euclidean')
KNN_model.fit(X, Y)

# Save the model
filename = 'finalized_knn.pkl'
pickle.dump(KNN_model, open(filename, 'wb'))

Как видно из рисунка выше, нам нужно создать папку с именем 'templates' для хранения файла home.html (фактически это форма, позволяющая пользователям предоставлять свои inputs) и файл result.html (файл, который показывает результат пользователям).

Другая папка, называемая статической, предназначена для хранения файлов CSS для улучшения внешнего вида веб-страницы или для хранения любых изображений. Вы можете связать файл CSS с файлом HTML, используя <link>. Необязательно создавать файл CSS, так как вы всегда можете применить внутренний CSS в HTML, включив функции стиля с помощью тега <style> в <head> части файла HTML (⚠️PS: внутренний CSS может увеличить размер страницы и время загрузки).

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Customer Rating Prediction</title>
    <link rel="stylesheet" type="text/css" href="static/style.css" />
</head>
<body>
    <h1>Customer Rating Prediction</h1>
    <h3>Let's check whether the customer will give rating 1.</h3>
    <center><img src="https://images.pexels.com/photos/799091/pexels-photo-799091.jpeg?auto=compress&cs=tinysrgb&dpr=2&h=650&w=940" alt="Photography of Ship" width="500px"></center>
    <form action="/result" method="POST">
        <fieldset>
            <!--input 1-->
            <p>Q1. Select the gender of the customer.</p>
                <select required name="gender">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="0">Female</option>
                    <option value="1">Male</option>
                </select>
            <!--input 2-->
            <p>Q2. Select the warehouse block that in charge.</p>
                <select required name="warehouse_block">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="A">Warehouse A</option>
                    <option value="B">Warehouse B</option>
                    <option value="C">Warehouse C</option>
                    <option value="D">Warehouse D</option>
                    <option value="F">Warehouse F</option>
                </select>
            <!--input 3-->
            <p>Q3. Select the mode of shipment.</p>
                <select required name="mode_of_shipment">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="Ship">Ship</option>
                    <option value="Flight">Flight</option>
                    <option value="Road">Road</option>
                </select>
            <!--input 4-->
            <p>Q4. Select the product importance.</p>
                <select required name="product_importance">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="low">Low</option>
                    <option value="medium">Medium</option>
                    <option value="high">High</option>
                </select>
            <!--input 5-->
            <p>Q5. Select the number of calls that the customer has made.</p>
                <select required name="customer_care_calls">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                    <option value="5">5</option>
                    <option value="6">6</option>
                    <option value="7">7</option>
                </select>
            <!--input 6-->
            <p>Q6. Did the shipment arrive on time?</p>
                <select required name="arrival">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="1">Late</option>
                    <option value="0">On Time</option>
                </select>
            <!--input 7-->
            <p>Q7. Select the purchases that the customer had made.</p>
                <select required name="prior_purchases">
                    <option value="" disabled selected>-- select an option --</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                    <option value="5">5</option>
                    <option value="6">6</option>
                    <option value="7">7</option>
                    <option value="8">8</option>
                    <option value="10">10</option>
                </select>
            <!--input 8-->
            <p>Q8. Select the cost of the product (in USD).</p>
            <input type="number" placeholder="Enter the product cost" name="cost_of_the_product" required>
            <!--input 9-->
            <p>Q9. Select the discount given to customer.</p>
            <input type="number" placeholder="Enter the discount" name="discount_offered" required>
            <!--input 10-->
            <p>Q10. Select the weight (in gms) of the product.</p>
            <input type="number" placeholder="Enter the product's weight" name="weight_in_gms" required>
            <div class="parent">
                <button type="submit" class="child" value="Submit">Submit</button>
            </div>
        </fieldset>
    </form>
</body>
</html>

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

from flask import Flask, render_template, request
import numpy as np
# import pandas as pd
import pickle

model = pickle.load(open('finalized_knn.pkl', 'rb'))
app = Flask(__name__)

@app.route("/")
def home():
    return render_template("home.html")

@app.route("/result", methods=["POST"])
def submit():
    global cost_of_the_product,weight_in_gms,discount_offered
    global warehouse_block_A,warehouse_block_B,warehouse_block_C,warehouse_block_D,warehouse_block_F
    global mode_of_shipment_Flight,mode_of_shipment_Road,mode_of_shipment_Ship
    global product_importance_high,product_importance_low,product_importance_medium
    global customer_care_calls,prior_purchases,gender,arrival,customer_rating

    # HTML to .py
    if request.method == "POST":
        warehouse_block = request.form["warehouse_block"]
        if (warehouse_block == "A"):
            warehouse_block_A = 1
            warehouse_block_B = 0
            warehouse_block_C = 0
            warehouse_block_D = 0
            warehouse_block_F = 0
        elif warehouse_block == "B":
            warehouse_block_A = 0
            warehouse_block_B = 1
            warehouse_block_C = 0
            warehouse_block_D = 0
            warehouse_block_F = 0
        elif warehouse_block == "C":
            warehouse_block_A = 0
            warehouse_block_B = 0
            warehouse_block_C = 1
            warehouse_block_D = 0
            warehouse_block_F = 0
        elif warehouse_block == "D":
            warehouse_block_A = 0
            warehouse_block_B = 0
            warehouse_block_C = 0
            warehouse_block_D = 1
            warehouse_block_F = 0
        elif warehouse_block == "F":
            warehouse_block_A = 0
            warehouse_block_B = 0
            warehouse_block_C = 0
            warehouse_block_D = 0
            warehouse_block_F = 1

        mode_of_shipment = request.form["mode_of_shipment"]
        if mode_of_shipment == "Ship":
            mode_of_shipment_Flight = 0
            mode_of_shipment_Road = 0
            mode_of_shipment_Ship = 1
        elif mode_of_shipment == "Flight":
            mode_of_shipment_Flight = 1
            mode_of_shipment_Road= 0
            mode_of_shipment_Ship = 0
        elif mode_of_shipment == "Road":
            mode_of_shipment_Flight = 0
            mode_of_shipment_Road = 1
            mode_of_shipment_Ship = 0

        product_importance = request.form["product_importance"]
        if product_importance == "low":
            product_importance_high = 0
            product_importance_low = 1
            product_importance_medium = 0
        elif product_importance == "medium":
            product_importance_high = 0
            product_importance_low = 0
            product_importance_medium = 1
        elif product_importance == "high":
            product_importance_high = 1
            product_importance_low = 0
            product_importance_medium = 0

        customer_care_calls = int(request.form["customer_care_calls"])
        arrival = int(request.form["arrival"])
        gender = int(request.form["gender"])
        prior_purchases = int(request.form["prior_purchases"])
        cost_of_the_product = int(request.form["cost_of_the_product"])
        discount_offered = int(request.form["discount_offered"])
        weight_in_gms = int(request.form["weight_in_gms"])

    # .py to HTML
    # Get prediction results
    x = np.array([cost_of_the_product,weight_in_gms,discount_offered,
                  warehouse_block_A,warehouse_block_B,warehouse_block_C,warehouse_block_D,warehouse_block_F,
                  mode_of_shipment_Flight,mode_of_shipment_Road,mode_of_shipment_Ship,
                  product_importance_high,product_importance_low,product_importance_medium,
                  customer_care_calls,prior_purchases,gender,arrival])
    x = x.reshape((1, -1))
    prediction = model.predict(x)
    if prediction == 1:
        return render_template('result.html', prediction="give rating 1.")
    else:
        return render_template('result.html', prediction="not give rating 1.")

if __name__ == "__main__":
    app.run(debug=True)

Помимо библиотеки Flask, нам также необходимо импортировать следующие библиотеки:

  • render_template : для отображения HTML-шаблонов.
  • request: для отправки HTTP-запросов с помощью Python.

Сначала нам нужно создать маршрут к домашней странице с помощью @app.route(“/”). После этого нам нужно создать собственную функцию прогнозирования и @app.route(“/result”, methods=[“POST”]) прогнозировать прибытие отправления (прибытие вовремя или с опозданием) на основе входных данных от пользователя и отображать выходные данные в result.html. Важно отметить, что methods=[“POST”] в элементе формы home.html тоже. Думаю, вы понимаете связь между home.html и main.py.🤓

После того, как вы завершили кодирование, вы можете запустить main.py на локальном ПК и просмотреть приложение в браузере, щелкнув появившуюся ссылку. После нажатия на ссылку вы увидите страницу home.html.

Этап 6. Обслуживание и мониторинг🚴‍♂️

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

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

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

⚠️ПРИМЕЧАНИЕ. Вы можете использовать методы настройки и перекрестной проверки, чтобы управлять процессом выбора модели.

Приятного обучения!😊