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

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

Алгоритм случайного леса

Случайный лес — это ансамблевый алгоритм обучения, который объединяет несколько деревьев решений для повышения точности и стабильности прогнозов. Основная идея случайного леса состоит в том, чтобы создать набор деревьев решений, где каждое дерево обучается на случайном подмножестве обучающих данных и функций. Затем делается окончательный прогноз путем объединения прогнозов всех деревьев.

Оптимизация гиперпараметров

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

Чтобы оптимизировать гиперпараметры нашего классификатора случайного леса, мы будем использовать GridSearchCV, функцию в Scikit-Learn, которая выполняет исчерпывающий поиск по заданной сетке параметров, чтобы найти наилучшую комбинацию гиперпараметров.

стримлит

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

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

Прохождение кода — часть 1

Давайте подробнее рассмотрим код нашего приложения Random Forest Classifier и Streamlit.

RFModel.ipynb

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

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import joblib

# Load the dataset
iris_df = pd.read_csv('Iris.csv')

# Split into features and target variable
X = iris_df.iloc[:, 1:-1].values
y = iris_df.iloc[:, -1].values

# Split into training and testing data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Затем мы стандартизируем функции с помощью StandardScaler и кодируем целевую переменную с помощью LabelEncoder.

# Standardize the features using a StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Encode the target variable using a LabelEncoder
encoder = LabelEncoder()
encoder.fit(y_train)
y_train_encoded = encoder.transform(y_train)
y_test_encoded = encoder.transform(y_test)

Затем мы определяем сетку гиперпараметров для настройки модели и используем GridSearchCV для поиска оптимальной комбинации гиперпараметров.

# Define hyperparameter grid for tuning the model
param_grid = {
    'n_estimators': [25, 50, 100, 200],
    'max_depth': [None, 1, 2, 3],
    'min_samples_split': [2, 3, 4],
    'min_samples_leaf': [1, 2, 3],
    'criterion': ['gini', 'entropy']
}

Гиперпараметры в сетке:

  • n_estimators: количество деревьев решений в лесу
  • max_depth: максимальная глубина каждого дерева решений в лесу.
  • min_samples_split: минимальное количество выборок, необходимое для разделения внутреннего узла.
  • min_samples_leaf: минимальное количество выборок, необходимое для конечного узла.
  • criterion: функция для измерения качества разделения. «джини» для примеси Джини и «энтропия» для получения информации.

Затем функция GridSearchCV используется для обучения классификатора случайного леса со всеми возможными комбинациями гиперпараметров в сетке, а для оценки производительности каждой комбинации используется 5-кратная перекрестная проверка. Затем на основе средней оценки перекрестной проверки выбираются лучшие гиперпараметры.

# Train a Random Forest Classifier using GridSearchCV to find the optimal hyperparameters
rf_model = RandomForestClassifier(random_state=42)
rf_model_tuned = GridSearchCV(rf_model, param_grid, cv=5)

Как только оптимальные гиперпараметры найдены, классификатор случайного леса обучается на всем обучающем наборе данных с использованием метода fit.

rf_model_tuned.fit(X_train_scaled, y_train_encoded)

Затем производительность модели оценивается на тестовом наборе данных с использованием метода score, и с помощью функции classification_report создается отчет о классификации.

# Evaluate the model's performance on the testing and training data
test_score = rf_model_tuned.score(X_test_scaled, y_test_encoded)
train_score = rf_model_tuned.score(X_train_scaled, y_train_encoded)
print(f'Testing score: {test_score:.2f}')
print(f'Training score: {train_score:.2f}')

# Make predictions on the test data using the tuned random forest classifier
y_pred = rf_model_tuned.predict(X_test_scaled)

# Generate a classification report to evaluate the performance of the model
print(f'Classification Report: {classification_report(y_test_encoded, y_pred)}')

Чтобы добавить график важности функции с помощью Seaborn, мы можем использовать feature_importances_attribute обученной модели Random Forest, чтобы получить важность каждой функции. Затем мы можем создать кадр данных pandas с именами функций и их важностью и использовать функцию гистограммы Seaborn для визуализации важности функций.

# Plot feature importance using Seaborn
feature_importances = pd.DataFrame(
    rf_model_tuned.best_estimator_.feature_importances_,
    index = iris_df.columns[1:-1],
    columns=['importance']).sort_values('importance', ascending=False)

print(feature_importances)
#                importance
# PetalLengthCm    0.435875
# PetalWidthCm     0.423670
# SepalLengthCm    0.094298
# SepalWidthCm     0.046158

sns.barplot(x=feature_importances.index, y=feature_importances.importance)
plt.xticks(rotation=45)
plt.title('Feature Importance')
plt.show()

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

# Save the trained model, StandardScaler, and LabelEncoder for later use
joblib.dump(rf_model_tuned, 'rf_model.sav')
joblib.dump(scaler, 'features_scaler.sav')
joblib.dump(encoder, 'label_encoder.sav')

Установить Стримлит

Предпосылки

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

Настройте виртуальную среду

Чтобы установить Streamlit в базовой среде Conda, выполните следующие действия:

  1. Откройте приглашение Anaconda
  2. Установите Streamlit: pip install streamlit
  3. Проверьте установку, выполнив следующую командуstreamlit hello Эта команда запустит сервер Streamlit и откроет окно браузера с примером приложения «Hello World».

Прохождение кода — часть 2

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

app.py

Шаг 1. Импорт необходимых библиотек. Чтобы создать наше приложение Streamlit, нам необходимо импортировать необходимые библиотеки. Эти библиотеки включают joblib, streamlit и любую другую библиотеку, которая может нам понадобиться в проекте.

import joblib
import streamlit as st

Шаг 2. Загрузка модели и необходимых объектов. После импорта необходимых библиотек следующим шагом является загрузка сохраненной модели, StandardScaler и LabelEncoder с помощью функции joblib.load().

loaded_model = joblib.load('rf_model.sav')
scaler = joblib.load('features_scaler.sav')
encoder = joblib.load('label_encoder.sav')

Шаг 3. Создание заголовка приложения и входных переменных. Мы создадим заголовок и подзаголовок для приложения с помощью функции st.write(). Мы также создадим входные переменные, чтобы пользователь мог вводить значения длины чашелистика, ширины чашелистика, длины лепестка и ширины лепестка. Мы будем использовать функцию st.slider() для создания ползунков для каждой входной переменной.

st.write("""
# Iris Flower Prediction App
This app predicts the **Iris flower** type!
""")

col1, col2, col3, col4 = st.columns(4)
sl = col1.slider('Select Sepal Length:', 0.0, 10.0, 5.0)
sw = col2.slider('Select Sepal Width:', 0.0, 10.0, 5.0)
pl = col3.slider('Select Petal Length:', 0.0, 10.0, 5.0)
pw = col4.slider('Select Petal Width:', 0.0, 10.0, 5.0)

Шаг 4. Создание новых данных для прогнозирования. После того, как пользователь введет значения для четырех входных переменных, мы создадим новые данные для прогнозирования, используя эти значения. Мы сохраним эти значения в списке, а затем передадим список в модель для прогнозирования.

new_data = [[sl, sw, pl, pw]]

Шаг 5. Масштабирование объектов с помощью StandardScaler. Прежде чем делать прогнозы, нам нужно масштабировать объекты с помощью загруженного StandardScaler. Мы будем использовать метод transform() для масштабирования функций.

new_data_scaled = scaler.transform(new_data)

Шаг 6. Создание прогнозов с использованием модели случайного леса. Для прогнозирования мы будем использовать функцию Predict() загруженной модели случайного леса. Мы передадим масштабированные новые данные в качестве входных данных для функции predict().

predictions = loaded_model.predict(new_data_scaled)

Шаг 7: Декодирование прогнозируемой целевой переменной с помощью LabelEncoder. Прогнозируемая целевая переменная будет закодирована, и нам нужно ее декодировать с помощью загруженного LabelEncoder. Мы будем использовать метод inverse_transform() для декодирования предсказанной целевой переменной.

decoded_predictions = encoder.inverse_transform(predictions)

Шаг 8: Отображение прогнозируемого результата пользователю И наконец: мы отобразим прогнозируемый результат пользователю с помощью st.write(). Мы будем отображать предсказанный тип цветка ириса в качестве подзаголовка.

st.write("""
## Prediction
The predicted Iris flower type is:
""")
st.write(decoded_predictions[0])

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

streamlit run app.py

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

Мы также можем настроить внешний вид приложения, используя различные функции Streamlit, такие как st.title(), st.header(), st.text(), st.markdown(), st.image(), st.audio( ), st.video() и многие другие. Эти функции позволяют нам создать интерактивную и информативную веб-страницу для пользователя.

Как только мы будем довольны приложением, мы сможем развернуть его в облачном сервисе, таком как Heroku или Google Cloud Platform, чтобы сделать его доступным для более широкой аудитории. Мы также можем поделиться приложением с другими, поделившись URL-адресом приложения или разместив его на общедоступном веб-сервере.

Заключение

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

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

Затем мы определили сетку гиперпараметров с помощью GridSearchCV, которую мы использовали для обучения классификатора случайного леса для поиска оптимальных гиперпараметров. Мы оценили производительность модели на данных тестирования и обучения и создали отчет о классификации для оценки производительности модели.

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

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

Исходный код: https://github.com/rizwan-ai/Machine-Learning-Model-Deployment-using-Streamlit

Удачного обучения :)