Модели машинного обучения — это мощные инструменты для прогнозирования и извлечения информации из данных. Однако развертывание этих моделей может оказаться непростой задачей, особенно для тех, кто не имеет опыта разработки программного обеспечения. В этом сообщении блога мы рассмотрим, как развернуть модель машинного обучения с помощью 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')
Установить Стримлит
Предпосылки
Прежде чем приступить к работе, вам понадобится несколько вещей:
- Ваша любимая IDE или текстовый редактор
- Питон 3.7 — Питон 3.11
- ПИП
Настройте виртуальную среду
Чтобы установить Streamlit в базовой среде Conda, выполните следующие действия:
- Откройте приглашение Anaconda
- Установите Streamlit:
pip install streamlit
- Проверьте установку, выполнив следующую команду
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
Удачного обучения :)