Методология межотраслевого стандартного процесса интеллектуального анализа данных (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
Из приведенных выше гистограмм мы можем сделать вывод, что:
- Стоимость большинства продуктов находится в диапазоне 240,00–275,00 долларов США.
- Вес большинства продуктов находится в диапазоне от 1000 до 2000 граммов и от 4000 до 6000 граммов.
- Скидка, которая, скорее всего, будет предоставлена, составляет от 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);
Из приведенного выше сюжета мы можем сделать следующие выводы:
- 33,33% заказов было обработано складским блоком F, в то время как другие складские блоки обработали остальные заказы в равной степени.
- Большинство заказов было отправлено морским транспортом (67,84%), затем самолетом (16,16%) и, наконец, автомобильным транспортом (16%).
- 32,34% клиентов нужно было сделать 4 звонка, чтобы отследить посылку. Это предостережение для компании, поскольку проблемы клиентов необходимо решать как можно скорее, без необходимости клиентам делать несколько звонков.
- 1 — это рейтинг со вторым по величине количеством. Скорее всего, это связано с тем, что продукты не доставляются вовремя, и с большим количеством звонков, которые необходимо сделать клиентам.
- Около 36% клиентов сделали 3 покупки до этого. Есть 306 постоянных клиентов, которые сделали не менее 8 покупок.
- Только 8,62% заказов имеют высокую важность. Большинство заказов маловажны (48,16%).
- 50,41% клиентов — женщины, остальные — мужчины.
- Более половины из 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 под названием Электронная коммерция-доставка. 🙌
⚠️ПРИМЕЧАНИЕ. Вы можете использовать методы настройки и перекрестной проверки, чтобы управлять процессом выбора модели.
Приятного обучения!😊