Научете се да изграждате 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
На обикновен английски
Благодарим ви, че сте част от нашата общност! Преди да тръгнете:
- Не пропускайте да ръкопляскате и следвайте писателя! 👏
- Можете да намерите още повече съдържание в PlainEnglish.io 🚀
- Регистрирайте се за нашия безплатен седмичен бюлетин. 🗞️
- Следвайте ни в Twitter, LinkedIn, YouTube и Раздори.