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
Вы можете использовать это репозиторий для доступа к полному коду.
Спасибо за прочтение, вы можете связаться со мной, если хотите добавить или оставить отзыв.