Автор статьи: Рустем Галиев
В этой статье я рассказываю об использовании машинного обучения в Streamlit и о том, как оно может помочь бизнес-пользователям лучше понять, как работает наука о данных. Мы собираемся посмотреть, сможем ли мы использовать модель на практике, чтобы пользователи могли протестировать и проверить, выжил бы кто-то на Титанике с определенными характеристиками.
Здесь мы собираемся объединить мощь Streamlit с процессом машинного обучения.
Первый пример машинного обучения
Мы проходим эту короткую практику, чтобы дать вам лучшее представление о том, как мы можем создавать и развивать наши решения и улучшать дэшборды.. С помощью этого дэшборда, мы попытаемся предсказать вероятность выживаемости пользователя на Титанике.
Первые шаги
Пример, на котором мы сосредоточимся в этой практике, больше связан с использованием уже сохраненной модели для выполнения прогнозирования, поэтому количество требуемых здесь библиотек довольно ограничено:
cat << EOF > /root/test.py
import streamlit as st
import pandas as pd
import pickle
EOF
Мы начинаем с загрузки модели с помощью pickle, и если вы хотите, вы также можете использовать исходный набор данных для разработки модели и демонстрации ее пользователям:
cat << EOF >> /root/test.py
filename = '/usr/local/bin/titanic_model.sav'
model = pickle.load(open(filename, 'rb'))
df = pd.read_csv('https://raw.githubusercontent.com/Stijnvhd/Streamlit_Course/main/First Exercise/second.csv')
st.write(df)
EOF
Вы можете запустить дэшборд, выполнив:
streamlit run /root/test.py --server.port 80
Определение ключевых характеристик для использования в нашей модели
Следующая часть панели инструментов состоит из некоторой настройки макета, а также настройки некоторых функций, которые вы можете выбрать для работы с моделью. Основываясь на этих функциях, на последнем этапе мы увидим, как на самом деле работает предсказание.
Мы начнем с лока некоторых переменных, которые мы будем использовать в качестве вариантов на нашей панели инструментов, а также немного стилей. Прежде чем запускать приведенный ниже код, введите Ctrl + C в терминале, чтобы остановить запуск панели управления.
cat << EOF >> /root/test.py
titles = ('Not applicable', 'Dr.', 'Rev.',
'Miss.', 'Master.', 'Don.', 'Mme.',
'Major.', 'Lady.', 'Sir.', 'Mlle.', 'Col.', 'Capt.', 'Countess.', 'Jonkheer.')
ports_range = ('Queenstown, Ireland', 'Southampton, U.K.')
Pclass = (1, 2, 3)
st.markdown("""
<style>
.big-font {
font-size:60px !important;
color :#C7BACC !important;
font-family: 'Roboto', sans-serif;
}
.colored-font {
font-size:50px !important;
color: grey !important;
font-weight: bold;
}
</style>
""", unsafe_allow_html=True)
EOF
Теперь мы напишем некоторую информацию о том, что будет делать приборная панель, и продолжим с ключевыми элементами выбора, которые позволяют нам определить значение различных переменных. Вы бы выжили на Титанике? Ну, есть только один способ узнать!
cat << EOF >> /root/test.py
st.markdown('<p class="big-font">Would you make it if you were on the Titanic? Describe yourself using the lefthand menu and find out. </p>', unsafe_allow_html=True)
st.sidebar.title('Describe yourself')
title = st.sidebar.selectbox('Your title', titles)
Title_Unusual = 0 if title == "Not applicable" else 1
gender = st.sidebar.radio('Sex', ('Male', 'Female'))
Sex = 0 if gender == 'Male' else 1
Age = st.sidebar.slider('Age', 0, 90, 1)
Pclass = st.sidebar.radio('Class', Pclass)
fare_range = df.loc[df['Pclass'] == Pclass, 'Fare']
Cabin_Known = st.sidebar.radio('Cabin', (0, 1))
ports = st.sidebar.radio('Port of departure', ports_range)
Embarked_Q = 1 if ports == 'Queenstown, Ireland' else 0
Embarked_S = 1 if ports == "Southampton, U.K." else 0
Fare = st.sidebar.slider('How much was your ticket (£)?', min(fare_range), max(fare_range))
SibSp = st.sidebar.slider("How many siblings are on the Titanic with you?", 0, 10)
Parch = st.sidebar.slider("Parents or children with you?", 0, 10)
prediction_inp = [Pclass] + [Sex] + [Age] + [SibSp] + [Parch] + [Fare] + \
[Title_Unusual] + [Cabin_Known] + [Embarked_Q] + [Embarked_S]
EOF
Мы запускаем дэшборд, выполнив
streamlit run /root/test.py --server.port 80
Отображение результата предикции
Здесь мы увидим модель в работе, предсказывающую результат на основе выбранных функций. Затем мы запишем результат модели с вероятностью в конце на нашем дэшборде. В зависимости от выданных результатов нашей модели машинного обучения мы увидим, выживет кто-то или нет, и дэшборд сообщит нам об этом
Прежде чем запускать приведенный ниже код, введите Ctrl + C в терминале, чтобы остановить дэшборд.
cat << EOF >> /root/test.py
survial = model.predict_proba([prediction_inp])[0,1]
survial = round(survial,2)
if survial*100 >= 50:
fate = "Survive"
st.write(survial)
st.write('You will likely '+ fate)
else:
fate = "Die"
st.write(survial)
st.write('You will likely '+ fate)
EOF
Теперь вы можете видеть весь дэшборд и протестировать
Мне тут не повезло)
Вы смогли увидеть, как мы можем использовать наши модели в практике, чтобы бизнес-пользователи могли легко адаптировать независимые переменные и, таким образом, видеть, что модель дает им в качестве выходных данных!
Полный код
cat << EOF > /root/test.py
import streamlit as st
import pandas as pd
import pickle
filename = '/usr/local/bin/titanic_model.sav'
model = pickle.load(open(filename, 'rb'))
df = pd.read_csv('https://raw.githubusercontent.com/Stijnvhd/Streamlit_Course/main/First%20Exercise/second.csv')
st.write(df)
titles = ('Not applicable', 'Dr.', 'Rev.',
'Miss.', 'Master.', 'Don.', 'Mme.',
'Major.', 'Lady.', 'Sir.', 'Mlle.', 'Col.', 'Capt.', 'Countess.', 'Jonkheer.')
ports_range = ('Queenstown, Ireland', 'Southampton, U.K.')
Pclass = (1, 2, 3)
st.markdown("""
<style>
.big-font {
font-size:60px !important;
color :#C7BACC !important;
font-family: 'Roboto', sans-serif;
}
.colored-font {
font-size:50px !important;
color: grey !important;
font-weight: bold;
}
</style>
""", unsafe_allow_html=True)
st.markdown('<p class="big-font">Would you make it if you were on the Titanic? Describe yourself using the lefthand menu and find out. </p>', unsafe_allow_html=True)
st.sidebar.title('Describe yourself')
title = st.sidebar.selectbox('Your title', titles)
Title_Unusual = 0 if title == "Not applicable" else 1
gender = st.sidebar.radio('Sex', ('Male', 'Female'))
Sex = 0 if gender == 'Male' else 1
Age = st.sidebar.slider('Age', 0, 90, 1)
Pclass = st.sidebar.radio('Class', Pclass)
fare_range = df.loc[df['Pclass'] == Pclass, 'Fare']
Cabin_Known = st.sidebar.radio('Cabin', (0, 1))
ports = st.sidebar.radio('Port of departure', ports_range)
Embarked_Q = 1 if ports == 'Queenstown, Ireland' else 0
Embarked_S = 1 if ports == "Southampton, U.K." else 0
Fare = st.sidebar.slider('How much was your ticket (£)?', min(fare_range), max(fare_range))
SibSp = st.sidebar.slider("How many siblings are on the Titanic with you?", 0, 10)
Parch = st.sidebar.slider("Parents or children with you?", 0, 10)
prediction_inp = [Pclass] + [Sex] + [Age] + [SibSp] + [Parch] + [Fare] + \
[Title_Unusual] + [Cabin_Known] + [Embarked_Q] + [Embarked_S]
survial = model.predict_proba([prediction_inp])[0,1]
survial = round(survial,2)
if survial*100 >= 50:
fate = "Survive"
st.write(survial)
st.write('You will likely '+ fate)
else:
fate = "Die"
st.write(survial)
st.write('You will likely '+ fate)
EOF
В заключение приглашаю посетить открытый урок для новичков в ML на тему «Первичный анализ данных с Pandas», который пройдет послезавтра вечером в Otus. На встрече участники обсудят, зачем нужен первичный анализ данных в машинном обучении, какие существуют инструменты для первичного анализа данных в Python, как визуализировать данные и какая преобработка данных нужна в ML. Записаться можно по ссылке.