Научете се да изграждате API за машинно обучение, за да отключите вратата към свят на взаимосвързани възможности, позволявайки на софтуера да общува помежду си и да създава смислени резултати

В този блог ще разгледаме темите по-долу

  • Въведение в MaaS
  • Какво представлява рамката на Flask?
  • Основи за създаване на прост уеб API с помощта на Flask
  • Изграждане на модела за машинно обучение
  • Създаване на API от модел на машинно обучение с помощта на Flask
  • Тестваме нашия API с два различни подхода
  • Заключение и литература

Въведение

В бързо развиващия се пейзаж на изкуствения интелект концепцията за „Моделите за машинно обучение като услуга“ (MaaS) се очерта като новаторска промяна на парадигмата. Представете си, че имате способността да използвате потенциала на усъвършенстваните алгоритми за машинно обучение без необходимост от обширна техническа експертиза или ресурсоемка инфраструктура. Моделите на машинно обучение като услуга предефинират начина, по който взаимодействаме и внедряваме решения за машинно обучение. Традиционно разработването и внедряването на модели за машинно обучение изискваше значителна инвестиция на време, изчислителни ресурси и опит в областта. Моделът MaaS обаче премахва тези бариери, правейки AI достъпен за по-широка аудитория.

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

Предимства от използването на API

Какво представлява рамката на Flask?

Flask е лека и популярна уеб рамка за изграждане на уеб приложения, включително API (интерфейси за програмиране на приложения), използвайки езика за програмиране Python. Той е проектиран да бъде прост, гъвкав и лесен за използване, което го прави отличен избор за разработчици, които искат бързо да създават уеб приложения или API, без да бъдат обременени от прекомерни разходи.

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

Създаване на прост уеб API с помощта на Flask

Нека започнем с основен пример, за да започнем с Flask. Ето кратка илюстрация, демонстрираща простотата на Flask. Предоставеният код създава основен уеб API. При получаване на определен URL адрес API генерира предварително дефиниран изход, който в този случай е текстът „Нашият минималистичен API, използващ Flask !!

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Our minimalistic API using Flask !!"

if __name__ == '__main__':
    app.run(debug=True)

След като бъде изпълнено, можете да навигирате до браузъра с URL: http://localhost:5000 и да наблюдавате резултата. В следващия раздел ще използваме подобен подход, за да разработим API за модела, но преди да направим това, трябва да изградим модел за машинно обучение, така че нека изградим модела в следващия раздел.

Изграждане на модела за класификация на машинното обучение

Ще използваме набора от данни Рак на гърдата Уисконсин (диагностика). Целта на този проект за ML е да се предвиди дали дадено лице има доброкачествен или злокачествен тумор. Ще използваме VSCode като мой редактор и имайте предвид, че ще тестваме нашата услуга направо в редактора на VSCode с помощта на Thunder Client.

Стъпка 1: Настройте средата за разработка

Нека създадем виртуална среда, ще използваме тази среда в следващите раздели. Ето стъпките за създаване на виртуална среда за разработка.

# STEP 1: Open the terminal and install the library virtualenv
pip install virtualenv
# STEP 2: Create a new virtual environment by name riskmgt
virtualenv venv
# STEP 3: Activate the new virtual environment
venv\scripts\activate

Стъпка 2: Заредете библиотеките

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
import pickle
import os
import yaml

Стъпка 3: Създаване на конфигурационен файл

Конфигурационният файл се използва, за да направи жизнения цикъл на изграждане на модела по-гъвкав и също така помага при експериментиране с различни параметри по време на етапите на фина настройка, без да се променя основният код.

#INITIAL SETTINGS
data_directory: "./Data/"
data_name: "breast-cancer-wisconsin.csv"
drop_columns: ["id","Unnamed: 32"]
target_name: "diagnosis"
test_size: 0.3
random_state: 123
model_directory: "./Model"
model_name: KNN_classifier.pkl
#kNN parameters
n_neighbors: 3
weights: uniform
algorithm: auto
leaf_size: 15
p: 2
metric: minkowski
n_jobs: 1

Стъпка 4: Заредете конфигурационния файл

# folder to load config file
CONFIG_PATH = "../Configs"
# Function to load yaml configuration file
def load_config(config_name):
    with open(os.path.join(CONFIG_PATH, config_name)) as file:
        config = yaml.safe_load(file)
    return config
config = load_config("config.yaml")

Стъпка 5: Зареждане и предварителна обработка на данни

#path to the dataset
filename = "../../Data/breast-cancer-wisconsin.csv"
#load data 
data = pd.read_csv(filename)
#replace "?" with -99999
data = data.replace('?', -99999)
# drop id column
data = data.drop(config["drop_columns"], axis=1)
# Define X (independent variables) and y (target variable)
X = np.array(data.drop(config["target_name"], 1))
y = np.array(data[config["target_name"]])

Стъпка 6: Разделете набора от данни на обучение и тест

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=config["test_size"], random_state= config["random_state"])

Стъпка 7: Изградете класификационния модел

Ще изградим модел KNeighborsClassifier()

# call our classifier and fit to our data
classifier = KNeighborsClassifier(
    n_neighbors=config["n_neighbors"],
    weights=config["weights"],
    algorithm=config["algorithm"],
    leaf_size=config["leaf_size"],
    p=config["p"],
    metric=config["metric"],
    n_jobs=config["n_jobs"],
)
# training the classifier
classifier.fit(X_train, y_train)
# test our classifier
result = classifier.score(X_test, y_test)
print("Accuracy score is. {:.1f}".format(result))

Стъпка 8: Запазете модела на диск

Ще използваме библиотеката pickle, за да запазим модела в папки Models с името KNN_model.pkl на диска с помощта на функцията dump(). По-късно в сървърния файл ще използваме функцията load(), за да заредим модела в нашата среда за прогнозиране.

# Saving model to disk
pickle.dump(classifier, open('../../Flask/Models/KNN_model.pkl','wb'))

След като завършихме изграждането на модела, нека да преминем към изграждането на API с рамката на Flask. Можете да намерите целия код model.pyв Github

Създаване на API от ML модел с помощта на Flask

Сега, когато моделът за машинно обучение е готов, нека проучим как можем да капсулираме базиран на Python модел за машинно обучение в API на Python. Този процес включва създаване на интерфейс, който излага функционалността на модела в мрежата.

Стъпка 1: Заредете библиотеките

Една от основните библиотеки във Flask и ние импортираме заявки, които се използват за получаване на входящите заявки, jsonifyсе преобразува във формат JSON и обменът на информация между системите се извършва във формат JSON. Научете повече за Flask

import numpy as np
from flask import Flask, request, jsonify
import pickle
import json

Стъпка 2: Създайте обект на приложение Flask

Ще създадем Flask обект по име app. Можете да го наименувате произволно, но се уверете, че е последователно в целия файл.

# creating a Flask app
app = Flask(__name__)

Стъпка 3: Заредете запазения KNN модел

Записахме нашия модел на диск в предишния ни раздел в папкатаModels. Ще използваме библиотеката pickle, за да заредим модела от диска. Накратко, всеки път, когато услугата бъде извикана, вместо да изграждаме модел, ние просто зареждаме предварително обучения модел и правим прогнозата.

# Load the model
model = pickle.load(open('../../Flask/Models/KNN_model.pkl','rb'))

Стъпка 4: Напишете функция за маршрутизиране и върнете JSON

Ще създадем POST заявка и крайна точка “/Predict”и накрая ще върнем JSON обект.

@app.route('/predict', methods = ['POST'])
def pred():
    # Get the data from the POST request.
    data = request.get_json(force=True)    
    varList = []
    for val in data.values():
        varList.append(val)
    # Make prediction from the saved model
    prediction = model.predict([varList])
    # Extract the value
    output = prediction[0]
    #return the output in the json format
    return jsonify(output)

Стъпка 5: Напишете функция на драйвер

Функцията на драйвера изпълнява основно услугата на порт 81. Ако портът вече се използва, тогава ще изведе грешка, че портът не е наличен. В такъв случай превключете към наличния порт.

# driver function
if __name__ == '__main__':  
    app.run(debug = False, port = 81)

Стъпка 6: Сглобяване на всичко

Файлът server.py ще бъде както по-долу. Можете да получите достъп до целия код от Github

import numpy as np
from flask import Flask, request, jsonify
import pickle
import json
# creating a Flask app
app = Flask(__name__)
# Load the model
# model = pickle.load(open('../Models/KNN_model.pkl','rb'))
model = pickle.load(open('../../Flask/Models/KNN_model.pkl','rb'))
@app.route('/predict', methods = ['POST'])
def pred():
    # Get the data from the POST request.
    data = request.get_json(force=True)    
    varList = []
    for val in data.values():
        varList.append(val)
    # Make prediction from the saved model
    prediction = model.predict([varList])
    # Extract the value
    output = prediction[0]
    #return the output in the json format
    return jsonify(output)
# driver function
if __name__ == '__main__':  
    app.run(debug = False, port = 81)

На този етап структурата на папките на нашия проект е както по-долу.

Нека тестваме файла server.pyведнъж, преди да продължим. Във vscode стартирайте файла и трябва да можете да видите изхода по-долу в терминала. Обърнете внимание, че услугата работи на порт 81, както сме дефинирали.

Тестване на API

В предишния раздел създадохме прост API, където при натискане на http://localhost:5000 в браузъра получихме изходно съобщение „Нашият минималистичен API използва Flask“. Това е добре, стига изходът да е по-опростен и се очаква вход от потребителя или системата. Но ние изграждаме модел като услуга, където изпращаме данни като входни данни, за да може моделът да предвиди. В такъв случай ще ни трябва по-добър и по-лесен начин да го тестваме.

Ще проучим два подхода, единият използвайки request.py, а другият използвайки Thunder Client.

Подход 1: Използване на request.py

Ще създадем JSON файл с всички променливи и съответните стойности, които да бъдат въведени в модела за прогнозиране.

Стъпка 1: Стартирайте файла server.py в терминал, така че да може да приема нашите заявки и да връща предвидения изход.

Стъпка 2: Изпълнете request.py в другите терминали. Резултатът трябва да бъде M или Bи резултатът ще бъде отпечатан в терминала vscode. Нека опитаме това.

import requests
url = 'http://127.0.0.1:81/predict'
r = requests.post(url,json={
  "radius_mean": 13.54,
  "texture_mean": 14.36,
  "perimeter_mean": 87.46,
  "area_mean": 566.3,
  "smoothness_mean": 0.09779,
  "compactness_mean": 0.08129,
  "concavity_mean": 0.06664,
  "concave points_mean": 0.04781,
  "symmetry_mean": 0.1885,
  "fractal_dimension_mean": 0.05766,
  "radius_se": 0.2699,
  "texture_se": 0.7886,
  "perimeter_se": 2.058,
  "area_se": 23.56,
  "smoothness_se": 0.008462,
  "compactness_se": 0.0146,
  "concavity_se": 0.02387,
  "concave points_se": 0.01315,
  "symmetry_se": 0.0198,
  "fractal_dimension_se": 0.0023,
  "radius_worst": 15.11,
  "texture_worst": 19.26,
  "perimeter_worst": 99.7,
  "area_worst": 711.2,
  "smoothness_worst": 0.144,
  "compactness_worst": 0.1773,
  "concavity_worst": 0.239,
  "concave points_worst": 0.1288,
  "symmetry_worst": 0.2977,
  "fractal_dimension_worst": 0.07259
})
print(r.json())

Трябва да можете да видите изхода като Bкато в „benign“ в терминала vscode.

Подход 2: Използване на Thunder Client

Има инструменти като Postman, Swagger и т.н., които са много популярни и ги използвам от дълго време. Един от проблемите, с които се сблъсквам, е постоянното превключване между прозореца Postman (изходен резултат от теста) и vscode (код). Търсех инструмент, който да се използва във vscode, за да улесни живота и Thunder Client прави точно това.

Нека използваме Thunder Client,лек клиент Rest за тестване на API. Моля, отидете до разширенията и инсталирайте клиента Thunder. Ето и моментната снимка.

Стъпка 1: Стартирайте файла server.py във vscode.

Стъпка 2: Натиснете ctrl + shift + p и изберете Thunder Client: Нова заявка

Стъпка 3: Въведете съответните подробности, както е показано по-долу, и щракнете върху изпращане. Резултатът от модела може да се види в раздела за отговор, който в този конкретен случай е „B

Стъпка 4: Продължавайте да променяте стойността в JSON и натиснете изпращане, за да видите резултата в раздела Отговор в десния панел.

Заключение

Създадохме наистина лесен за разбиране модел на машинно обучение и го превърнахме в полезна услуга с помощта на рамката на Flask. Приложните програмни интерфейси отключват вратата към свят от взаимосвързани възможности, позволявайки на софтуера да общува помежду си и да създава смислени резултати. Има и други инструменти като Django, FastAPI, облачна услуга от Azure и други, които могат да се използват за изграждане на услуги като API.

Ето основните изводи от блога

  • Първо изградихме нашия класификационен модел —KNeighborsClassifier()
  • Разработи API за модела в рамката на Flask
  • И накрая, тествахме API с Thunder Client във VSCode

Надявам се статията да ви е харесала и да ви е била полезна.

Можете да се свържете с мен — в Linkedin и Github

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

Създаване на персонализирано приложение за VaR симулатор с помощта на Python
Симулация на Монте Карло за повреда на тръба в Python
Други приложения на Python в GitHub
Разработване на Plotly Dash и интегриран OpenAI Приложение за чатбот

Препратки

https://www.thunderclient.io/
https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client

На обикновен английски

Благодарим ви, че сте част от нашата общност! Преди да тръгнете: