Программирование | Искусственный интеллект

Разработка и развертывание машинного обучения Pycaret на Tkinter

Создание простого портфолио моделирования и развертывания машинного обучения

А. Введение

Некоторые студенты, изучающие науку о данных, спрашивают меня: «Что делать дальше, когда мы закончим разработку модели машинного обучения?» В основном они все еще задаются вопросом, как реализовано машинное обучение. Поэтому в этой статье мы просто обсудим реализацию машинного обучения. Среднее простое место находится на Tkinter Python. Надеюсь, прочитав это, вы улучшите свое понимание реализации машинного обучения.

Без реализации машинного обучения ваша модель будет бесполезной. Как специалист по данным, вы должны внедрить свою модель в производство. Несколько человек позвонили специалистам по анализу данных. Кроме того, если вы хотите стать специалистом по анализу данных, вы можете попробовать упражнение по развертыванию Tkinter Machine Learning.

Давайте узнаем, как развернуть машинное обучение на основе моделирования.

Б. Обсуждение и руководства

1. Моделирование машинного обучения

В этом разделе мы разрабатываем модель машинного обучения с Pycaret. Кстати, Pycaret был разработан господином Моэзом Али. Эта библиотека является наиболее полезной и простой в использовании с небольшим кодом и развертыванием. Чтобы узнать больше о Pycaret, нажмите здесь. На момент написания этой статьи Pycaret был на версии 2.3 или, возможно, он будет обновлен снова в будущем.

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

а. Импорт библиотеки

В данном случае нашими целями являются загрузка, анализ, очистка и моделирование. Итак, нам нужно подготовить несколько библиотек, таких как NumPy, Pandas, Matplotlib, Seaborn и Pycaret. Пожалуйста, установите все необходимые библиотеки с помощью этого кода:

Этот код предназначен для установки в Jupyter Notebook. Если вы хотите установить в командной строке, вам нужно удалить знак «!» в каждой строке кода.

!pip install pandas
!pip install numpy
!pip install pycaret
!pip install seaborn
!pip install matplotlib 

Хорошо, все наборы, и у нас есть все библиотеки. Мы импортируем только все библиотеки.

# import modul for load, analyze, and modelling 
import pandas as pd
import numpy as np
import pycaret.classification #our decision model is classification
# import modul for visualization
import matplotlib.pyplot as plt
import seaborn as sns

б. Исследование данных

Если мы хотим заниматься машинным обучением, мы не можем избежать исследования данных. Это позволяет нам понять шаблон данных, и мы получаем некоторое представление, чтобы решить, для чего нужна предварительная обработка данных и техника модели машинного обучения. Эти шаги некоторого набора данных исследования:

  • Загрузить наборы данных
df = pd.read_csv('https://raw.githubusercontent.com/ronnyfahrudin/Medium-Code/main/Pycaret_to_Tkinter/datasets/churn_analysis.csv',sep=',' )
  • Форма наборов данных
print('the number of rows:',df.shape[0])
print('the number of columns:',df.shape[1])

из этого кода мы увидим, что у нас 6950 строк и 13 столбцов.

  • Головные данные
df.head()

У нас есть некоторое представление о данных головы. Есть несколько наборов числовых данных и категориальных наборов данных со столбцами, например: «ОбновленоAt», «customerID», «пол», «SeniorCitizen», «Партнер», «владение», «PhoneService», «StreamingTV», «InternetService», « Безбумажный биллинг »,« Ежемесячные платежи »,« Общие расходы »,« Отток ». Хорошо, мы можем видеть типы данных каждого столбца.

  • Информационные типы данных
df.info()

из «df.info ()» мы узнали, что

  • Проверить нулевые значения
nul = df.isna().sum().reset_index()
nul.columns = ['variables','sum_nan']
nul['perc_nan_%'] = nul['sum_nan']/len(df)*100
nul

Наши наборы данных чистые, потому что в них нет нулевых значений.

  • Описательная статистика

Для создания числовой описательной статистики:

df.describe()

Чтобы сделать категориальные описательные, мы должны написать параметры, включаемые с помощью «объекта»:

df.describe(include='object')

  • Отдельные числовые и категориальные данные

Мы делаем переменную «num_col» для сохранения списка числовых столбцов и «obj_col» для сохранения категориальных столбцов.

# define numeric and categorical columns
num_col = df.describe().columns.tolist()
all_col = df.columns.tolist()
obj_col = [i for i in all_col if i not in num_col]
  • Числовое распределение

Для визуализации данных мы делаем некоторые функции с визуализацией фасетной сетки, например:

def viz(df,types):
    num = df
    f = pd.melt(num, value_vars=num)
    g = sns.FacetGrid(f, col="variable",  col_wrap=3, 
                      sharex=False, sharey=False, size = 5)
    g = g.map(types, "value")
    plt.show()
    return (g)
# histogram visualization 
viz(df[num_col], sns.distplot)

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

  • Категориальное распределение
# bar chart facet grid visualizations
viz(df[obj_col],sns.countplot)

Сообщите мне, наш целевой набор данных - «Отток». Как правило, наши наборы данных обычно не распределяются, нам нужно нормализовать наши наборы данных на этапах предварительной обработки. Наша целевая переменная - дисбаланс. Мы должны исправить это с помощью SMOTE. Хорошо, перейдем к предварительной обработке данных.

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

На этом этапе мы удаляем 2 столбца: «ОбновленоAt» и «customerID». Потому что эти столбцы бесполезны для моделирования.

# deleting columns UpdatedAt and customerID
dfs = df.drop(['UpdatedAt','customerID'],1)
# normalize True : default we use zscore to normalize datasets
# fix_imbalance True : default use is SMOTE 
# Our splitting data is 0.7 train and 0.3 test sets. 
# we save the result with the name of class variable
clas = setup(dfs, target = 'Churn',train_size = 0.7,
           normalize = True, fix_imbalance = True)
  • Увидеть переменную "clas"

если вы хотите увидеть результат переменной «clas», вы можете увидеть это с помощью этого кода:

print(clas)

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

  • Просмотр наборов данных Split train и test
# to see the shape of X_train,y_train, X_test, y_test
X_train = clas[-1]
y_train = clas[-15]
X_test = clas[20]
y_test = clas[9]
print('X_train shape:',X_train.shape)
print('y_train shape:',y_train.shape)
print('X_test shape:',X_test.shape)
print('y_test shape:',y_test.shape)

Рис 1.6. показывает, что X_train с 4864 строками и 10 столбцами. Кроме того, X_train имеет 2086 строк и 10 столбцов. Хорошо, давайте начнем сравнивать модели, чтобы найти лучшую. Когда вы получаете сообщение об ошибке, вам необходимо изменить нарезку индекса.

d. Моделирование машинного обучения

  • Сравнение модели
compare_models()

Да, из этой модели сравнения мы используем лучшую модель с самым высоким AUC. Итак, выбираем Ada Boost Classifier. Мы выбираем AUC, потому что наши наборы данных в целевой переменной несбалансированы.

  • Создание лучшей модели
ada = create_model('ada')

На этих шагах мы создаем лучшую модель Ada Boost Classifier. Pycaret имеет 10-кратную перекрестную проверку по умолчанию. Итак, пользуемся. Тогда результат среднего AUC равен 0,8244.

  • Модель прогнозирования или тестирования

После создания модели мы должны протестировать ее. Мы тестируем модель, чтобы увидеть, есть ли переоснащение, неполное подгонка или подгонка.

predict_model(ada)

Далее мы создаем и тестируем модель. Мы можем сравнить AUC на этапах создания и тестирования модели. На этапе создания модели мы обнаружили, что AUC составляет 0,8244. В тестовой модели мы видим результат 0,8276. Это значит, что наша модель в целом подходит.

  • Построение модели с помощью графика кривой ROC
plot_model(ada)

Хорошо, из построения модели мы видим, что классы ROC 0 и 1 подходят. Это хорошие новости для нас.

  • Видя важность функции
importances = ada.feature_importances_
indices = np.argsort(importances)
features = X_train.columns
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()

На диаграмме важных функций показано, что 7 основных вкладов функций - это MonthlyCharges, tenure, totalCharges, PaperlessBilling, InternetService, PhoneService, SenioCitizen. Итак, из 12 функций мы можем использовать 7 из них. Но в этом разделе я пытаюсь использовать 10 функций, как мы обучаем модель, описанную выше.

  • Сохранение модели
# save transformation pipeline and model 
save_model(ada, model_name = 'ada_model.pkl')

Хорошо, наша модель была сохранена с именем «ada_model.pkl». Мы можем выполнить развертывание с помощью этой модели.

2. Развертывание машинного обучения

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

  • Создание функции
# import library tkinter
import tkinter 
from tkinter import *

#load model
dt_saved = load_model('path/model/model.pkl')
#making function
def predict():
    MonthlyCharges = inp1.get()
    tenure = inp2.get()
    totalCharges = inp3.get()
    PaperlessBilling = inp4.get()
    InternetService = inp5.get()
    PhoneService = inp6.get()
    SeniorCitizen = inp7.get()
    StreamingTV = inp8.get()
    gender = inp9.get()
    Partner = inp10.get()
try:
        MonthlyCharges = float(MonthlyCharges)
        tenure = int(tenure)
        totalCharges = float(totalCharges)
        PaperlessBilling = str(PaperlessBilling)
        InternetService = str(InternetService)
        PhoneService = str(PhoneService)
        SeniorCitizen = str(SeniorCitizen)
        StreamingTV = str(StreamingTV)
        gender = str(gender)
        Partner = str(Partner)
        
        dc = {'MonthlyCharges':[MonthlyCharges],
              'tenure':[tenure],
              'TotalCharges':[totalCharges],
              'PaperlessBilling':[PaperlessBilling],
              'InternetService':[InternetService],
              'PhoneService':[PhoneService],
              'SeniorCitizen':[SeniorCitizen],
              'StreamingTV':[StreamingTV],
              'gender':[gender],
              'Partner':[Partner]}
        test=pd.DataFrame.from_dict(dc)
        
        lbl11['text'] = [*predict_model(dt_saved, data=test)['Label'].values][0]
        if lbl11['text'] == 'No':
            lbl11['text'] = 'No Churn'
        else: 
            lbl11['text'] = 'Churn'
    except ValueError:
        messagebox.showinfo("Alert Message", "Enter Properly, bro!") # this code to make alert messages when we wrong input data
  • Код Tkinter

Это код Tkinter для ввода данных ...

wdw = tk.Tk()
wdw.title("Simulation predict!") #mengubah nama jendela
#MonthlyCharges
inp1 = tk.Entry(wdw)
inp1.insert(0,'Numbers')
inp1.grid(row=1,column=1)
lbl1 = tk.Label(wdw, text="MonthlyCharges: ")
lbl1.grid(row=1,column=0)
#tenure
inp2 = tk.Entry(wdw)
inp2.insert(0,'Numbers')
inp2.grid(row=2,column=1)
lbl2 = tk.Label(wdw, text="tenure: ")
lbl2.grid(row=2,column=0)
#totalCharges
inp3 = tk.Entry(wdw)
inp3.insert(0,'Numbers')
inp3.grid(row=3,column=1)
lbl3 = tk.Label(wdw, text="totalCharges: ")
lbl3.grid(row=3,column=0)
#PaperlessBilling
inp4 = tk.Entry(wdw)
inp4.insert(0,'Yes or No')
inp4.grid(row=4,column=1)
lbl4 = tk.Label(wdw, text="PaperlessBilling: ")
lbl4.grid(row=4,column=0)
#InternetService
inp5 = tk.Entry(wdw)
inp5.insert(0,'Yes or No')
inp5.grid(row=5,column=1)
lbl5 = tk.Label(wdw, text="InternetService: ")
lbl5.grid(row=5,column=0)
#PhoneService
inp6 = tk.Entry(wdw)
inp6.insert(0,'Yes or No')
inp6.grid(row=6,column=1)
lbl6 = tk.Label(wdw, text="PhoneService: ")
lbl6.grid(row=6,column=0)
#SeniorCitizen
inp7 = tk.Entry(wdw)
inp7.insert(0,'Yes or No')
inp7.grid(row=7,column=1)
lbl7 = tk.Label(wdw, text="SeniorCitizen: ")
lbl7.grid(row=7,column=0)
#StreamingTV
inp8 = tk.Entry(wdw)
inp8.insert(0,'Yes or No')
inp8.grid(row=8,column=1)
lbl8 = tk.Label(wdw, text="StreamingTV: ")
lbl8.grid(row=8,column=0)
#gender
inp9 = tk.Entry(wdw)
inp9.insert(0,'Male or Female')
inp9.grid(row=9,column=1)
lbl9 = tk.Label(wdw, text="gender: ")
lbl9.grid(row=9,column=0)
#Partner
inp10 = tk.Entry(wdw)
inp10.insert(0,'Yes or No')
inp10.grid(row=10,column=1)
lbl10 = tk.Label(wdw, text="Partner: ")
lbl10.grid(row=10,column=0)
btn = tk.Button(wdw, text = "Click to predict!", command=predict)
btn.grid(row=12,columnspan=2)
lbl11 = tk.Label(wdw, text="Result ...")
lbl11.grid(row=11,columnspan=2)
wdw.mainloop()

На рисунке ниже показан результат нашей успешной модели развертывания.

С. Заключение

Хорошо, достаточно кодировщика, мы могли бы сделать простой EDA, разработать модель и развернуть модель на нашем локальном ПК. К вашему сведению, мы делаем только простой проект в области науки о данных. Потому что мы не используем большие данные. Я надеюсь, что с помощью этого простого проекта сможет понять кандидат наук о данных. Если вы хотите быть более продвинутым, вы можете провести больше исследований EDA; разработка функций; попробуйте развернуть модель, как в Heroku, Kafka и т. д.

D. Источник

[1] Моэз Али Домашняя страница PyCaret, (2021 г.)

[2] Моэз Али Классификационный модуль, (2021 г.)

[3] Ронни Фахрудин Medium-Code, (2021 г.)

Еще одно мое сочинение:

  1. Визуализация акций ANTM с помощью Plotly и Mplfinance
  2. Очистка списка индонезийских акций
  3. Машинное обучение с низким кодом
  4. Общие чит-листы на уровне среднего уровня, который вам необходимо знать
  5. Как легко установить Apache Kafka Windows?
  6. Правильное обнаружение и обработка выбросов
  7. Сценарии оболочки в Unix