От тази статия ще разберете как да създавате интерактивни резултати за вашите решения за машинно обучение на преносим компютър jupyter с помощта на ipywidgets.

Тази статия първоначално е публикувана в блога Neurotech Africa.

В много отношения това е скучен език, заимстващ солидни стари концепции от много други езици и стилове: скучен синтаксис, неизненадваща семантика, малко автоматична принуда и т.н. Но това е едно от нещата, които харесвам в Python. – Тим Питърс

В повечето случаи не-софтуерни разработчици или ИТ, които се гмуркат в науката за данни, се сблъскват с предизвикателства как могат просто да съобщят своите резултати, но това също е често срещано предизвикателство за начинаещите в машинното обучение. Направата на тествани решения за машинно обучение може да бъде предизвикателство за голяма група, използваща Python рамки като Django и Flask. Това е така, защото те наистина изискват някой да има умения за уеб разработка.

Но в днешно време технологията се развива твърде бързо, има множество платформи, които опростяват работата по правенето на модели живи над облаците, такива платформи са „streamlit“, „gradio“ и „Gooey“.

Днес ще ви преведа през общата среда за разработване на модел за машинно обучение за потребители на python и ще ви покажа как можете да разработите интерактивни резултати на преносим компютър jupyter.

Какво е Jupyter Notebook?

Уеб приложение с отворен код, което можете да използвате за създаване и споделяне на документи, които съдържат код на живо, уравнения, визуализации и текст.

Бележникът Jupyter е интерактивен бележник, който ви позволява да пишете документи с вграден код и да изпълнявате този код в движение. Първоначално е разработен като част от проекта Ipython и по това време може да се използва само за код на Python. В днешно време преносимият компютър Jupyter интегрира множество езици, като R, Julia, Haskell и много други — преносимият компютър поддържа около 50 „езика“.

Той позволява на потребителя да изтегли бележника в различни файлови формати като PDF, HTML, Python, Markdown или .ipynb файл.

Прости интерактивни резултати от ML модели на Jupyter Notebook

Предполагам, че читателите се чувстват добре с концепциите на Python и Machine Learning, нека приемем регресионни предизвикателства, които изискват прогнозиране на разходите за медицинска застраховка на дадено лице въз основа на age, gender, Body mass index (kg / m ^ 2), smoking behavior и Number of children covered by health insurance / Number of dependents. Повече информация за наборите от данни, използвани за изграждане на това решение, можете да намерите тук.

Наборите от данни имат 7 колони, аз избирам да използвам 5 функции (X) и charges колона като изходна цел

Нека използваме Linear Regression, за да създадем регресионен модел за прогнозиране на таксите за медицинска застраховка, но имаме обектни характеристики като пол и пушач, за да направим нещата по-лесни, нека да използваме sklearn pipelineкойто ни помага да дефинираме всички необходими процеси за нашия регресионен модел да се учим от наблюденията.

from sklearn.pipeline import make_pipeline
from category_encoders import OneHotEncoder
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error

Ще използваме make_pipeline за обгръщане на всички процеси, OneHoteEncoder за предварителна обработка на всички характеристики на обекта[sex, smoker] в цифров формат, така че нашият регресор да може да разбере, LinearRegression за изграждане на модели за прогнозиране и mean_absolute_error за оценка на ефективността на нашия модел.

Ето как трябва да дефинираме нашия тръбопровод

# building model pipeline
model = make_pipeline(
    OneHotEncoder(use_cat_names=True),
    LinearRegression()
)

След като дефинираме нашия конвейер, сега трябва да обучим нашия модел чрез монтиране на функции (X) и етикети (цел) в конвейера.

# training model to forecast medical costs
model.fit(X,target)

След това можем да оценим нашия модел, за да видим производителността

# evaluating model
y_pred_training = model.predict(X)
print("Training MAE:", mean_absolute_error(target,y_pred_training))

Еха! изградихме нашия прост регресорен модел, сега е време да се съсредоточим върху това как да правим интерактивни резултати с нашия модел?

Нашият модел изисква ли да бъде хостван в облака, за да взаимодейства с него?

Ако отговорът ви е НЕ, имате право, ние можем да създадем интерактивна среда дори в бележника на Jupyter, като използваме библиотека на python, която предлага няколко уиджета на jupyter за интерактивност, известни като ipywidgets.

Ipywidgets, известни също като jupyter-widgets или прости widgets, са интерактивни HTML widgets за преносими компютри Jupyter и ядрото на IPython. Преносимите компютри оживяват, когато се използват интерактивни уиджети. Потребителите получават контрол върху своите данни и могат да визуализират промените в данните.

С ipywidgets ученето се превръща в потапящо, забавно изживяване. Изследователите и разработчиците могат лесно да видят как променящите се входни данни към модела влияят върху резултатите.

След това без допълнително дължимо, нека инсталираме и импортираме всички ipywidgets и след това да ги консумираме, но за най-новата версия на преносими компютри Jupyter няма нужда от инсталиране, можете просто да импортирате и консумирате.

pip install ipywidgets
# import ipywidgests 
import ipywidgets as widgets

След това нека създадем нашата функция за извършване на прогнози в зависимост от петте функции, които използвахме за обучение на модел.

def make_prediction(age, gender, bmi, children, smoker):
    """
        Function to perform predictions of (medical costs)insurance charges depending on:
        1. age - age of primary beneficiary
        2. sex - insurance contractor gender, female, male
        3. bmi - Body mass index (kg / m ^ 2) using the ratio of height to weight, ideally 18.5 to 24.9
        4. children - Number of children covered by health insurance / Number of dependents
        5. smoker - smoking or not
    """
    df = pd.DataFrame({"age":age,"sex":gender,"bmi":bmi,"children":children, "smoker":smoker},index=[0])
    prediction = model.predict(df).round(2)[0]
    return f"Predicted total insurance cost: ${prediction}"

Нека се опитаме да извикаме нашата make_prediction функция с очакваните аргументи

make_prediction(39,"male", 20, 3, "yes")
# outputs
# 'Predicted total insurance cost: $29564.47'

Еха! страхотно, време е да вмъкнем нашата функция в ipywidgets, така че да може да бъде гъвкава за взаимодействие. ipywidgets съдържат множество джаджи, но за нашия случай нека използваме само 4 джаджи.

Първият е interact джаджа за обвиване на нашата функция и всички необходими входове.

Вторият е IntSlider джаджа за контролиране на всички входове на цели числа за нашия модел.

Третият е FloatSlider джаджа за контролиране на всякакви плаващи входове за нашия модел.

Последният е Dropdown джаджа за контролиране на всякакви входове, които изискват потребителят да избира от множество опции.

widgets.interact(
                make_prediction,
    
                age=IntSlider(
                    min=X["age"].min(),
                    max=X["age"].max(),
                    value=X["age"].mean(),
                ),
    
                gender = widgets.Dropdown(options=sorted(X["sex"].unique())),
                bmi= widgets.FloatSlider(
                    min=X["bmi"].min(),
                    max=X["bmi"].max(),
                    step=0.01,
                    value=X["bmi"].mean(),
                ),
                children=  widgets.IntSlider(
                    min =X["children"].min(),
                    max =X["children"].max(),
                    value=X["children"].mean(),
                ),
                smoker= widgets.Dropdown(options=sorted(X["smoker"].unique())),
            );

Можете да видите интерактивните плъзгачи и падащи менюта, които правят гъвкави начини за въвеждане и правене на прогнози.

Това е лесен начин да тествате как моделът, който сте създали, може да извършва прогнози за потребителски входове, преди да бъде внедрен в облака. Освен това, ако обучавате някого за изграждането на решение за машинно обучение, ще бъде лесно да разберете как потребителят може да взаимодейства с крайното решение.

Изглежда просто, но има голямо влияние върху разбирането на машинното обучение, не се колебайте да споделите тази статия с общността.