Развертывание модели машинного обучения в Streamlit

Введение

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

Предварительные условия

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

· Обученная модель машинного обучения (в частности, модель случайного леса, используемая в этом проекте).

· Базовые знания Git для контроля версий.

· Знакомство с Streamlit для создания интерактивных веб-приложений.

Это руководство проведет вас через процесс развертывания приложения машинного обучения с помощью Streamlit. Streamlit — это мощная библиотека Python, которая упрощает создание интерактивных веб-приложений для ваших моделей машинного обучения, устраняя необходимость в обширных навыках веб-разработки.

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

Шаг 1. Настройка среды

Начните с создания нового каталога для вашего проекта. Откройте терминал и перейдите в каталог проекта. Затем создайте свою виртуальную среду:

# For Windows:
python -m venv venv; venv\Scripts\activate; python -m pip install -q --upgrade pip; python -m pip install -qr requirements.txt

# For Linux & MacOS:
python3 -m venv venv; source venv/bin/activate; python -m pip install -q --upgrade pip; python -m pip install -qr requirements.txt

Шаг 2. Установите необходимые библиотеки

Прежде чем начать, убедитесь, что у вас установлены необходимые библиотеки. В этом сценарии я включил библиотеки в файл require.txt. Установите их с помощью следующей команды:

pip install -r requirements.txt

Шаг 3. Импортируйте основные библиотеки

В файле app.py импортируйте необходимые библиотеки:

import streamlit as st
import pandas as pd
import numpy as np
import pickle

Шаг 4. Загрузите предварительно обученную модель и ключевые компоненты

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

with open("rf_model.pkl", "rb") as f:
    components = pickle.load(f)

num_imputer = components["num_imputer"]
cat_imputer = components["cat_imputer"]
encoder = components["encoder"]
scaler = StandardScaler()
model = components["model"]

Шаг 5. Создайте интерфейс приложения Streamlit

Разработайте поля ввода и пользовательский интерфейс для вашего приложения:

я. Название и описание:

Укажите заголовок и вводную подпись для вашего приложения и, при необходимости, добавьте изображение:

st.image("https://pbs.twimg.com/media/DywhyJiXgAIUZej?format=jpg&name=medium")
st.title("Sales Prediction App")
st.caption("This app predicts sales patterns of Corporation Favorita over time in different stores in Ecuador based on the inputs.")

ii. Боковая панель с описаниями полей ввода:

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

# Sidebar with input field descriptions
st.sidebar.header("Description of The Required Input Fields")
st.sidebar.markdown("**Store Number**: The number of the store.")
st.sidebar.markdown("**Product Family**: Product Family such as 'AUTOMOTIVE', 'BEAUTY', etc. "
                    "Details:\n"
                    " - **AUTOMOTIVE**: Products related to the automotive industry.\n"
                    " - **BEAUTY**: Beauty and personal care products.\n"
                    " - **CELEBRATION**: Products for celebrations and special occasions.\n"
                    " - **CLEANING**: Cleaning and household maintenance products.\n"
                    " - **CLOTHING**: Clothing and apparel items.\n"
                    " - **FOODS**: Food items and groceries.\n"
                    " - **GROCERY**: Grocery products.\n"
                    " - **HARDWARE**: Hardware and tools.\n"
                    " - **HOME**: Home improvement and decor products.\n"
                    " - **LADIESWEAR**: Women's clothing.\n"
                    " - **LAWN AND GARDEN**: Lawn and garden products.\n"
                    " - **LIQUOR,WINE,BEER**: Alcoholic beverages.\n"
                    " - **PET SUPPLIES**: Products for pets and animals.\n"
                    " - **STATIONERY**: Stationery and office supplies.")
st.sidebar.markdown("**Number of Items on Promotion**: Number of items on promotion within a particular shop.")
st.sidebar.markdown("**City**: City where the store is located.")
st.sidebar.markdown("**Cluster**: Cluster number which is a grouping of similar stores.")
st.sidebar.markdown("**Transactions**: Number of transactions.")
st.sidebar.markdown("**Crude Oil Price**: Daily Crude Oil Price.")

iii. Поля ввода и кнопка прогнозирования:

Создайте поля ввода, чтобы пользователи могли предоставлять данные:

# Create the input fields
input_data = {}
col1,col2,col3 = st.columns(3)
with col1:
    input_data['store_nbr'] = st.slider("Store Number",0,54)
    input_data['family'] = st.selectbox("Product Family", ['AUTOMOTIVE', 'BEAUTY', 'CELEBRATION', 'CLEANING', 'CLOTHING', 'FOODS', 
                                            'GROCERY', 'HARDWARE', 'HOME', 'LADIESWEAR', 'LAWN AND GARDEN', 'LIQUOR,WINE,BEER', 
                                            'PET SUPPLIES', 'STATIONERY'])
    input_data['onpromotion'] =st.number_input("Number of Items on Promotion",step=1)
    input_data['state'] = st.selectbox("State Where The Store Is Located", ['Pichincha', 'Cotopaxi', 'Chimborazo', 'Imbabura',
       'Santo Domingo de los Tsachilas', 'Bolivar', 'Pastaza', 'Tungurahua', 'Guayas', 'Santa Elena', 'Los Rios', 'Azuay', 'Loja',
       'El Oro', 'Esmeraldas', 'Manabi'])
    input_data['transactions'] = st.number_input("Number of Transactions", step=1)

with col2:    
    input_data['store_type'] = st.selectbox("Store Type",['A', 'B', 'C', 'D', 'E'])
    input_data['cluster'] = st.selectbox("Cluster", [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
    input_data['dcoilwtico'] = st.number_input("Crude Oil Price",step=1)
    input_data['year'] = st.number_input("Year",step=1)
with col3:    
    input_data['month'] = st.slider("Month",1,12)
    input_data['day'] = st.slider("Day",1,31)
    input_data['dayofweek'] = st.number_input("Day of Week (0=Sunday and 6=Satruday)",step=1)

Создайте кнопку для запуска прогнозов и отображения результатов:

# Create a button to make a prediction
if st.button("Predict"):

    # Convert the input data to a pandas DataFrame
    input_df = pd.DataFrame([input_data])

    # Product Categorization Based on Families
    food_families = ['BEVERAGES', 'BREAD/BAKERY', 'FROZEN FOODS', 'MEATS', 'PREPARED FOODS', 'DELI', 'PRODUCE', 'DAIRY', 'POULTRY', 'EGGS', 'SEAFOOD']
    home_families = ['HOME AND KITCHEN I', 'HOME AND KITCHEN II', 'HOME APPLIANCES']
    clothing_families = ['LINGERIE', 'LADYSWARE']
    grocery_families = ['GROCERY I', 'GROCERY II']
    stationery_families = ['BOOKS', 'MAGAZINES', 'SCHOOL AND OFFICE SUPPLIES']
    cleaning_families = ['HOME CARE', 'BABY CARE', 'PERSONAL CARE']
    hardware_families = ['PLAYERS AND ELECTRONICS', 'HARDWARE']

    # Apply the same preprocessing steps as done during training
    input_df['family'] = np.where(input_df['family'].isin(food_families), 'FOODS', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(home_families), 'HOME', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(clothing_families), 'CLOTHING', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(grocery_families), 'GROCERY', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(stationery_families), 'STATIONERY', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(cleaning_families), 'CLEANING', input_df['family'])
    input_df['family'] = np.where(input_df['family'].isin(hardware_families), 'HARDWARE', input_df['family'])

    categorical_columns = ['family', 'store_type', 'state']
    numerical_columns = ['transactions', 'dcoilwtico']

    # Impute missing values
    input_df_cat = input_df[categorical_columns].copy()
    input_df_num = input_df[numerical_columns].copy()
    input_df_cat_imputed = cat_imputer.transform(input_df_cat)
    input_df_num_imputed = num_imputer.transform(input_df_num)

    # Encode categorical features
    input_df_cat_encoded = pd.DataFrame(encoder.transform(input_df_cat_imputed).toarray(),
                                        columns=encoder.get_feature_names_out(categorical_columns))

    # Scale numerical features
    input_df_num_scaled = scaler.transform(input_df_num_imputed)
    input_df_num_sc = pd.DataFrame(input_df_num_scaled, columns=numerical_columns)

    # Combine encoded categorical features and scaled numerical features
    input_df_processed = pd.concat([input_df_num_sc, input_df_cat_encoded], axis=1)

    # Make predictions using the trained model
    predictions = dt_model.predict(input_df_processed)

    # Display the predicted sales value to the user:
    st.write("The predicted sales are:", predictions[0])

Шаг 6. Запустите приложение Streamlit.

Запустите приложение Streamlit, используя следующую команду терминала:

streamlit run app.py

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

На изображениях ниже показаны интерфейсы приложения до и после прогнозирования.

я. До прогноза

ii. После предсказания

Шаг 7. Поделитесь своим приложением

Как только вы будете довольны функциональностью своего приложения, вы сможете развернуть его на различных платформах, таких как Heroku или AWS, используя варианты развертывания Streamlit.

Заключение

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

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