Автор статьи: Рустем Галиев

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

Комментарии (0)