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

Содержание:

  • Почему Стримлит?
  • Стримлит 101
  • Разработка моделей
  • Разработка приложений для моделей
  • Сравнение моделей
  • Выбор и построение лучшей модели

Почему Стримлит?

  • Его можно использовать для превращения проектов по науке о данных в веб-приложения. Например, мы хотим запустить модель прогнозирования. Мы написали весь код ИИ, но в нем еще есть такие процессы, как деплоймент и API. С помощью Streamlit вы можете сделать это легко на уровне «прогнозировать нажатие кнопки». Если мы думаем о коде .py, который мы написали, как о бэкэнде, streamlit дает нам возможность сделать из него внешний интерфейс.
  • Мы можем сделать панели визуализации данных. Было бы неплохо создать свой собственный инструмент BI таким образом?
  • Streamlit не ограничивается моделями AI, ML, DL. Допустим, мы делаем простой EDA и находим некоторые важные идеи. Настало время объяснить это заинтересованным сторонам, но наше рабочее пространство — это кодовый ад. Здесь это также позволяет нам показать нашим нетехническим коллегам окончательный результат в понятной форме.
  • В остальном все зависит от воображения, короче говоря, все, что делается с помощью Python, можно сделать в виде динамической веб-страницы.

Начнем с создания окружения

1- Создать пустую среду

conda create — name streamlit_env

2- Активировать его

conda activate streamlit_env

3- Установите предварительные требования

pip install streamlit

4- Переключите каталог и запустите streamlit.py. (На данный момент наш экран будет пустым.)

conda activate streamlit_env
cd pred_w_streamlit
streamlit run streamlit.py

Streamlit 101: основные команды

Прежде чем мы начнем, давайте немного познакомимся с основными командами.

  • Добавление заголовка
# import module
import streamlit as st
# Add title
st.title(“Hello, let’s build an app!”)

Выход:

  • Запись: st.write() работает как метод печати.
st.write(“We will predict and show in app something.”)
st.write(data[“Date”].head())

Выход:

  • Добавление изображений:
from PIL import Image
img = Image.open("st_logo.png")
st.image(img, width=300)

Выход:

  • Добавление радиокнопки:
status = st.radio(“Select animal: “, (‘Cat’,’Dog’))
# conditional statement to print cat or dog
if (status == ‘Cat’):
st.success(“Cat”)
else:
st.success(“Dog”)

Выход:

В дополнение к этому мы можем добавить различные функции, такие как ползунок, кнопка, поле выбора, боковая панель, ввод даты, палитра цветов.

Дополнительные примеры вы можете найти в шпаргалке Streamlit.

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

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

Модели будут представлять собой линейную регрессию, регрессор XGB и регрессор LGBM соответственно. Они предсказывают следующие 20 дней, глядя на исторические данные. Затем мы сравним и визуализируем характеристики этих трех моделей.

Примечание. Здесь мы сосредоточены на понимании возможностей Streamlite, а не на разработке моделей.

1- Считайте данные и подготовьте модели

  • Начнем с импорта библиотек.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly_express as px
import streamlit as st
from sklearn import preprocessing
from sklearn.linear_model import LinearRegression
from xgboost import XGBRegressor
from xgboost import plot_importance
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
import lightgbm as lgb
from lightgbm import LGBMRegressor
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.model_selection import GridSearchCV
  • Давайте прочитаем данные и выполним шаги предварительной обработки. Я не уделяю много внимания этим этапам, потому что основная тема, о которой мы хотим поговорить в этой статье, носит обтекаемый характер.
# Read data from csv.
data=pd.read_csv(‘/Users/sk/pred_w_streamlit/streamlit_data.csv’, sep=’,’)
# Change data type of date column. (object to datetime)
data[‘Date’] = pd.to_datetime(data[“Date”], format=’%Y-%m-%d’)
# Sort data by date column.
data.sort_values(by=[‘Date’], inplace=True)
# Create new time columns.
data[‘day_of_week’] = data[‘Date’].dt.dayofweek
data[‘day_of_month’] = data[‘Date’].dt.day
data[‘month’] = data[‘Date’].dt.month
data[‘week_of_year’] = data[‘Date’].dt.week
data[‘season’] = (data[‘Date’].dt.month % 12 + 3) // 3
# Encode col1, col2, col3 variables.
le = preprocessing.LabelEncoder()
data[‘col1’] = le.fit_transform(data[‘col1’])
data[‘col2’] = le.fit_transform(data[‘col2’])
data[‘col3’] = le.fit_transform(data[‘col3’])
  • Определите функции обработчика для отчета
def report_metric(pred, test, model_name):
     # Creates report with mae, rmse and r2 metric and returns as df
     mae = mean_absolute_error(pred, test)
     mse = mean_squared_error(pred, test)
     rmse = np.sqrt(mse)
     r2 = r2_score(test, pred)
     metric_data = {‘Metric’: [‘MAE’, ‘RMSE’, ‘R2’], model_name: [mae, rmse, r2]}
     metric_df = pd.DataFrame(metric_data)
     return metric_df
def plot_preds(data_date,test_date, target, pred):
     # Plots prediction vs real 
     fig = plt.figure(figsize=(20,10))
     plt.plot(data_date, target, label = 'Real')
     plt.plot(test_date, pred, label = 'Pred')
     plt.legend()
     st.pyplot(fig)
  • Определите период тестирования для всех моделей перед запуском и разделите тест поезда.
# Split train test and define test period.
test_period = -20
test = data[test_period:]
train = data[:test_period]
  • Подготовим модели, которые будем запускать и визуализировать:
### Prepare for model 1  Linear Regressor
x_trainm1 = train[["col1", "col2", "col3", "day_of_week", "day_of_month", "month", "week_of_year", "season"]]
y_trainm1 = train[["target"]]
x_testm1 = test[["col1", "col2", "col3", "day_of_week", "day_of_month", "month", "week_of_year", "season"]]
y_testm1 = test[["target"]]
lr = LinearRegression()
lr.fit(x_trainm1, y_trainm1)
m1pred = lr.predict(x_testm1)
metric1 = report_metric(m1pred, y_testm1, "Linear Regression")
### Prepare for model 2 XGB Regressor
x_trainm2 = train[["col1", "col2", "col3", "day_of_week", "day_of_month", "month", "week_of_year", "season"]]
y_trainm2 = train[["target"]]
x_testm2 = test[["col1", "col2", "col3", "day_of_week", "day_of_month", "month", "week_of_year", "season"]]
y_testm2 = test[["target"]]
xgb = XGBRegressor(n_estimators=1000, learning_rate=0.05)
# Fit the model
xgb.fit(x_trainm2, y_trainm2)
# Get prediction
m2pred = xgb.predict(x_testm2)
metric2 = report_metric(m2pred, y_testm2, "XGB Regression")
### Prepare for model 3 LGBM Regressor
x_trainm3 = train[["col1", "col3", "day_of_week", "day_of_month"]]
y_trainm3 = train[["target"]]
x_testm3 = test[["col1", "col3", "day_of_week", "day_of_month"]]
y_testm3 = test[["target"]]
# fit scaler on training data
norm = MinMaxScaler().fit(x_trainm3)
# transform training data
x_train_normm3 = pd.DataFrame(norm.transform(x_trainm3))
# transform testing data
x_test_normm3 = pd.DataFrame(norm.transform(x_testm3))

# We tuned parameters below with best params.
lgb_tune = LGBMRegressor(learning_rate=0.1, max_depth=2, min_child_samples=25,
            n_estimators=100, num_leaves=31)
lgb_tune.fit(x_train_normm3, y_trainm3)
m3pred = lgb_tune.predict(x_test_normm3)
metric3 = report_metric(m3pred, y_testm3, "LGBM Regression")

2 – Разработайте приложение для визуализации моделей

  • Добавим боковую панель
# Create a page dropdown
page = st.sidebar.selectbox(“””
         Hello there! I’ll guide you!
         Please select model”””, 
         [“Main Page”, 
          “Linear Regressor”, 
          “XGB Regressor”,                
         “LGBM Regressor”,        
         “Compare Models”])

Выход:

  • Давайте создадим то, что будет отображаться на главной странице, когда «Главная страница» выбрана на боковой панели.
if page == "Main Page":
     ### INFO
     st.title("Hello, welcome to sales predictor!")
     st.write("""
     This application predicts sales for the next 20 days with 3 different models
     # Sales drivers used in prediction:
     - Date: date format time feature
     - col1: categorical feature
     - col2: second categorical feature
     - col3: third categorical feature
     - target: target variable to be predicted
""")
     st.write("Lets plot sales data!")
     st.line_chart(data[["Date", "target"]].set_index("Date"))

Выход

  • Давайте разработаем, что будет отображаться, когда на боковой панели выбран «Линейный регрессор». Мы определили и предсказали выше. Настало время визуализировать это.
elif page == "Linear Regressor":
     
    # Base model, it uses linear regression.
    st.title("Model 1: ")
    st.write("Model 1 works with linear regression as base model.")
    st.write("The columns it used are: col1, col2, col3, 
          day_of_week, day_of_month, month, week_of_year, season")
    st.write(metric1)
    """
    ### Real vs Pred. Plot for 1. Model
    """
    plot_preds(data["Date"],test["Date"], data["target"], m1pred)

Выход:

  • Давайте продолжим с другими моделями, вторая модель — XGB Regressor.
elif page == “XGB Regressor”:
       # Model 2
      st.title(“Model 2: “)
      st.write(“Model 2 works with XGB Regressor.”)
      st.write(“The columns it used are: col1, col2, 
             col3,day_of_week, day_of_month, 
             month, week_of_year, season”)
      st.write(metric2)
      “””
      ### Real vs Pred. Plot for 2. Model
      """
      plot_preds(data["Date"],test["Date"], data["target"], m2pred)

Выход:

  • Наша последняя модель LGBM Regressor
elif page == "XGB Regressor":
    
     # Model 2
     st.title("Model 2: ")
     st.write("Model 2 works with XGB Regressor.")
     st.write("The columns it used are: col1, col2, col3, 
           day_of_week, day_of_month, month, week_of_year, season")         
     st.write(metric2)
     """
     ### Real vs Pred. Plot for 2. Model
     """
     plot_preds(data["Date"],test["Date"], data["target"], m2pred)

Выход:

  • Мы создали 3 страницы для трех моделей, теперь мы можем сравнить их в этом приложении. Давайте покажем характеристики моделей на странице и нарисуем лучшую модель.
elif page == “Compare Models”:
     # Compare models.
     st.title(“Compare Models: “)
     all_metrics = metric1.copy()
     all_metrics[“XGB Regression”] = metric2[“XGB Regression”].copy()
     all_metrics[“LGBM Regression”] = metric3[“LGBM Regression”].copy()
     st.write(all_metrics)
     # Best Model
     st.title(“Best Model /XGB Regressor: “)
     st.write(“Lets plot best models predictions in detail.”) 
     
     # Plot best model results.
     plot_preds(test[“Date”],test[“Date”], test[“target”], m2pred)
     # Show rowbase best result and real
     st.write(“Best Model Predictions vs Real”) 
     best_pred = pd.DataFrame(test[[“target”]].copy()) 
     best_pred[“pred”] = m2pred
     st.write(best_pred)

Выход:

  • Мы также можем добавить ссылки и смайлики.
link=’Made by [Sengul Karaderili](https://github.com/Sk1613/)'
st.markdown(link,unsafe_allow_html=True)
st.write(“💛”)

Выход:

Смотрим конечный продукт:

https://github.com/Sk1613/prediction_w_streamlit/blob/main/streamlit-app.mov

Вы можете использовать это репозиторий для доступа к полному коду.

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