Постановка проблемы и цель

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

Пикарет

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

PyCaret — это альтернативная библиотека с низким кодом, которую можно использовать для замены сотен строк кода всего несколькими строками. Это делает цикл эксперимента экспоненциально быстрым и эффективным.

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

Градио

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

Градио полезен для:

  • Создание быстрых демонстраций на основе обученных конвейеров машинного обучения.
  • Получение живого отзыва о производительности модели
  • Интерактивная отладка вашей модели во время разработки

Установка Пикаре

%%capture #suppresses the displays
# install the full version
pip install pycaret[full]

При установке полной версии pycaret также устанавливаются все дополнительные зависимости, перечисленные здесь.

Установка Градио

pip install gradio

Импортируйте необходимые пакеты

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 
import pycaret
from pycaret.regression import *

Загрузите данные, связанные с постановкой задачи

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sub = pd.read_csv("Sample_Submission.csv")
# display first 5 samples of the training data
train.head()

Предварительная обработка данных

  • Округление возраста основного бенефициара до ближайшего целого числа
  • Индекс массы тела ИМТ – это отношение веса к росту. Группировка людей по ИМТ: недостаточная масса тела, нормальная масса тела, избыточная масса тела и ожирение.
* Underweight: [0–18.5)
* Normal : [18.5, 25)
* Overweight : [25, 30)
* Obese : [30+]
  • Создайте новую функцию age_category для разделения возрастов
* Infant: [0–2)
* Toddler : [2, 5)
* Child : [5, 13)
* Teen : [13- 20)
* Adult : [20, 40)
* Middle Age : [40, 60)
* Senior : [60+]

Код

train[‘age’] = train[‘age’].round().astype(int)
test[‘age’] = test[‘age’].round().astype(int)
#
#Define Function to define body category
def group_bmi(x):
 if x >= 0 and x <= 18.5:
 return ‘underweight’
 elif x > 18.5 and x <= 25:
 return “normal”
 elif x > 25 and x <= 30:
 return “overweight”
 else:
 return “obese”
#
train[‘body_category’] = train[‘bmi’].apply(lambda x : group_bmi(x))
test[‘body_category’] = test[‘bmi’].apply(lambda x : group_bmi(x))
#
# Define function to define the age category
def age_bin(x):
  if x >= 0 and x < 2:
    return "infant"
  elif x >= 2 and x< 5:
    return "toddler"
  elif x >=5 and x < 13:
    return "child"
  elif x >= 13 and x < 20:
    return "teen"
  elif x >= 20 and x < 40 :
    return "adult"
  elif x >= 40 and x < 60:
    return "middle_aged"
  else:
    return "senior"
train['age_group']  = train['age'].apply(lambda x : age_bin(x) )
test['age_group'] = test['age'].apply(lambda x : age_bin(x) )

Делайте выводы из визуализации данных

sns.set_style(‘darkgrid’)
plt.figure(figsize=(12,8))
sns.lineplot(x=’age’,y=’charges’,data=train)

sns.displot(train, x= “charges”, hue= “smoker”, kind=”kde”, fill=True)

sns.set_style(‘darkgrid’)
plt.figure(figsize=(12,8))
sns.lineplot(x=’age’,y=’charges’,data=train,hue=’smoker’)

plt.figure(figsize=(12,8))
sns.countplot(x=’body_category’,data=train,hue=’sex’ )

sns.set_style(‘darkgrid’)
plt.figure(figsize=(12,8))
sns.lineplot(x=’age’,y=’charges’,data=train,hue=’age_group’)

Начало работы с построением модели и выводом с помощью pycaret

Инициализировать настройку

reg = setup(data = train, 
            target = ‘charges’,
            use_gpu =True,
            preprocess=True,
            log_data=True,
            log_experiment=True,
            normalize=True)

setup в PyCaret профилирует набор данных и определяет типы данных для всех входных функций. Это первый и единственный обязательный шаг для начала любого эксперимента по машинному обучению в PyCaret.

Сравнить модели

Эта функция обучает все доступные модели в библиотеке моделей с использованием гиперпараметров по умолчанию и оценивает показатели производительности с помощью перекрестной проверки. Количество складок можно определить с помощью параметра fold (по умолчанию = 10 складок). Таблица сортируется (от большего к меньшему) по выбранной метрике, которую можно определить с помощью параметра sort(в данном случае мы отсортировали ее по RMSE).

Параметр n_select в функции настройки управляет возвратом обученных моделей. В данном случае я устанавливаю значение 15, что означает возврат 15 лучших моделей в виде списка. Функция pull во второй строке сохраняет вывод compare_models как pd.DataFrame .

best = compare_models(n_select = 15,sort=’RMSE’)
compare_model_results = pull()

поскольку было установлено, что RandomForestregressor имеет сравнительно лучшую среднеквадратичную ошибку, давайте построим модель с использованием RandomForestregressor.

rf = create_model(‘rf’)

Настройка гиперпараметров

tuned_rf = tune_model(rf,optimize = ‘RMSE’,search_library = ‘optuna’)

Оптимальные гиперпараметры, выбранные с помощью Optuna

Анализ производительности модели

plot_model(tuned_rf)

Интерпретируйте результаты

В PyCaret мы можем интерпретировать модель по значениям SHAP и графику корреляции всего одной строкой кода.

interpret_model(tuned_rf)

Оцените модель

Если мы не хотим строить все эти визуализации по отдельности, то в библиотеке PyCaret есть еще одна замечательная функция — evaluate_model. В этой функции вам просто нужно передать объект модели, и PyCaret создаст интерактивное окно, в котором вы сможете увидеть и проанализировать модель всеми возможными способами:

evaluate_model(tuned_rf)

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

val_rf_pred = predict_model(tuned_rf)

Прогнозы (метка) сделаны следующим образом:

Делайте прогнозы на тестовых данных

# predictions on new dataset
pred_new_rf = predict_model(tuned_rf, data = test) #new_data is pd dataframe
pred_new_rf = pred_new_rf.rename(columns={‘Label’:’prediction’})
pred_new_rf

Оценка представления RandomForestRegressor (RMSE): 4234,403588306586.

Построение моделей ансамбля с использованием PyCaret

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

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

# train a voting regressor dynamically
blender_specific = blend_models(estimator_list = compare_models(n_select = 5))

Калиброванная модель смешивания выглядит следующим образом:

blender_specific

Анализ производительности модели в PyCaret

plot_model(blender_specific)

Оцените производительность модели

evaluate_model(blender_specific)

Делайте прогнозы на проверочном наборе

val_pred = predict_model(blender_specific)

  • регрессор голосования показывает улучшенный R2_score и RMSE

Делайте прогнозы по невидимым данным

# predictions on new dataset
pred_new = predict_model(blender_specific, data = test) #new_data is pd dataframe
pred_new = pred_new.rename(columns={‘Label’:’prediction’})
pred_new

  • Оценка представления регрессора голосования составляет 4084,5919179367957. Эта оценка лучше по сравнению с другими моделями.

Сохраните и загрузите модель

save_model(blender_specific , ‘/content/drive/MyDrive/blender_specific_saved_06142021’)
# Loading the saved model
blend_saved = load_model(‘/content/drive/MyDrive/blender_specific_saved_06142021’)
pred = blend_saved.predict(test)
pred[:5]

Создание интерфейсов для моделей ML с помощью Gradio

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

import gradio as gr

Создание функций предварительной обработки

Эта функция предварительно обрабатывает данные

def encode_attributes(df): # Binning ages 
 df[‘body_category’] = df[‘bmi’].apply(lambda x : group_bmi(x)) 
 df[‘age_group’] = df[‘age’].apply(lambda x : age_bin(x) )
 return df

Создайте функцию прогноза

def predict_charges(age, bmi,sex,smoker,region,children):
 df = pd.DataFrame.from_dict({‘sex’: [sex], ‘age’: [age], ‘smoker’: [smoker],’bmi’:[bmi],’region’:[region],’children’:[children]})
 df = encode_attributes(df)
 pred = blend_saved.predict(df).tolist()[0]
 return ‘charges : ‘+str(pred)+” in rupees”

Создайте общий пользовательский интерфейс

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

Базовый класс Interface инициализируется тремя параметрами:

  • fn: функция для переноса
  • inputs: тип(ы) входных компонентов
  • outputs: тип(ы) выходных компонентов
sex = gr.inputs.Radio([‘female’, ‘male’], label=”sex”)
smoker = gr.inputs.Radio([‘no’, ‘yes’], label=”smoker”)
children = gr.inputs.Radio([2, 3, 1, 4, 5, 0], label=”children”)
region = gr.inputs.Radio([‘northeast’, ‘southeast’, ‘northwest’, ‘southwest’], label=”region”)
age = gr.inputs.Slider(minimum=15, maximum=75, default=16, label=”age”)
bmi = gr.inputs.Slider(minimum=15, maximum=60, default=16, label=”bmi”)

gr.Interface(predict_charges, inputs=[age, bmi,sex,smoker,region,children], 
 outputs=”label”,
 title=”Medical Insurance Cost Prediction”,
 capture_session=True,
 live=True).launch();

Приведенный выше интерфейс автоматически появится в записной книжке Python или появится в браузере с URL-ссылкой, если он запущен из скрипта.

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

Конечные примечания

Это действительно так просто в использовании. Лично я обнаружил, что PyCaret весьма полезен для получения быстрых результатов при работе над хакатонами или проектами, где у нас сжатые сроки и необходимо сравнить различные подходы к моделированию. Это также помогает ускорить выбор гиперпараметров и функций с помощью всего нескольких строк кода. Так что обо всех начальных шагах позаботится Пикаре.

использованная литература







Свяжитесь со мной