Как новичку в машинном обучении, любому может быть легко получить достаточно ресурсов обо всех алгоритмах машинного обучения и глубокого обучения, но когда я начал искать ссылки для развертывания модели машинного обучения в производственной среде, я не нашел действительно хороших ресурсов, которые может помочь мне развернуть мою модель, так как я новичок в этой области. Итак, когда мне удалось развернуть мою модель с использованием Flask в качестве API, я решил написать статью, чтобы помочь другим просто развернуть свою модель. Я надеюсь, что это помогает:)

В этой статье мы собираемся использовать простой алгоритм линейной регрессии с scikit-learn для простоты, мы будем использовать Flask, поскольку это очень легкий веб-фреймворк. Мы создадим три файла,

  1. model.py
  2. server.py
  3. request.py

В файле model.py мы разработаем и обучим нашу модель, в файле server.py мы запишем код для обработки запросов POST и возврата результатов и, наконец, в request.py, мы отправим запросы с функциями на сервер и получим результаты.

Приступим к кодированию

  1. model.py

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

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pickle
import requests
import json

Импортируем библиотеки, которые мы собираемся использовать для разработки нашей модели. numpy и pandas для управления матрицами и данными соответственно, sklearn.model_selection для разделения данных на обучающий и тестовый набор и sklearn.linear_model для обучения нашей модели с помощью LinearRegression. pickle для сохранения нашей обученной модели на диск, requests для отправки запросов на сервер и json для печати результата в нашем терминале.

dataset = pd.read_csv('Salary_Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values

Мы импортировали набор данных с помощью панд и отделили функции и метку от набора данных.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.33, random_state = 0)

В этом разделе мы разделили наши данные на тренировку и тест размером 0,67 и 0,33 соответственно, используя train_test_split из sklearn.

regressor = LinearRegression()
regressor.fit(X_train, y_train)
y_pred = regressor.predict(X_test)

Объект создается как регрессор класса LinearRegression () и обучается с использованием X_train и y_train. Прогнозируемые результаты сохраняются в y_pred.

pickle.dump(regressor, open('model.pkl','wb'))

Мы сохраним нашу обученную модель на диск с помощью библиотеки pickle. Pickle используется для сериализации и десериализации структуры объекта Python. В котором объект python преобразуется в поток байтов. Метод dump () выгружает объект в файл, указанный в аргументах.

В нашем случае мы хотим сохранить нашу модель, чтобы ее мог использовать сервер. Поэтому мы сохраним наш объект regressor в файл с именем model.pkl.

Мы можем снова загрузить модель следующим способом:

model = pickle.load(open('model.pkl','rb'))
print(model.predict([[1.8]]))

Метод pickle.load () загружает метод и сохраняет десериализованные байты в модели. Прогнозы можно делать с помощью model.predict ().

Например, мы можем спрогнозировать зарплату сотрудника со стажем 1,8 года.

Здесь наш model.py готов к обучению и сохранению модели. Весь код model.py выглядит следующим образом.

# Importing the libraries
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import pickle
import requests
import json
# Importing the dataset
dataset = pd.read_csv('Salary_Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values
# Splitting the dataset into the Training set and Test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)
# Fitting Simple Linear Regression to the Training set
regressor = LinearRegression()
regressor.fit(X_train, y_train)
# Predicting the Test set results
y_pred = regressor.predict(X_test)
# Saving model to disk
pickle.dump(regressor, open('model.pkl','wb'))
# Loading model to compare the results
model = pickle.load(open('model.pkl','rb'))
print(model.predict([[1.8]]))

2. server.py

В этом файле мы будем использовать веб-фреймворк flask для обработки запросов POST, которые мы получим из request.py.

Импортируем методы и библиотеки, которые мы собираемся использовать в коде.

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

Здесь мы импортировали numpy, чтобы создать массив запрошенных данных, pickle, чтобы загрузить нашу обученную модель для прогнозирования.

В следующем разделе кода мы создали экземпляр Flask () и загрузили модель в модель.

app = Flask(__name__)
model = pickle.load(open('model.pkl','rb'))

Здесь мы ограничили / api с помощью метода pred (). В каком методе прогнозирования получают данные из json-файла, переданного запрашивающей стороной. Метод model.predict () принимает входные данные из json и преобразует их в 2D массив numpy, результаты сохраняются в переменной с именем output и мы возвращаем эту переменную после преобразования ее в объект json с помощью метода flasks jsonify ().

@app.route('/api',methods=['POST'])
def predict():
    data = request.get_json(force=True)
    prediction = model.predict([[np.array(data['exp'])]])
    output = prediction[0]
    return jsonify(output)

Наконец, мы запустим наш сервер, следуя разделу кода. Здесь я использовал порт 5000 и установил debug = True, поскольку, если мы получим какую-либо ошибку, мы сможем ее отладить и решить.

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

Здесь наш сервер готов обслуживать запросы. Вот весь код server.py.

# Import libraries
import numpy as np
from flask import Flask, request, jsonify
import pickle
app = Flask(__name__)
# Load the model
model = pickle.load(open('model.pkl','rb'))
@app.route('/api',methods=['POST'])
def predict():
    # Get the data from the POST request.
    data = request.get_json(force=True)
    # Make prediction using model loaded from disk as per the data.
    prediction = model.predict([[np.array(data['exp'])]])
    # Take the first value of prediction
    output = prediction[0]
    return jsonify(output)
if __name__ == '__main__':
    app.run(port=5000, debug=True)

3. request.py

Как я упоминал ранее, request.py будет запрашивать у сервера прогнозы.

Вот весь код для запроса к серверу.

import requests
url = 'http://localhost:5000/api'
r = requests.post(url,json={'exp':1.8,})
print(r.json())

Мы использовали библиотеку requests для отправки запросов на публикацию. requests.post () принимает URL-адрес и данные, которые должны быть переданы в запросе POST, а возвращенные результаты с серверов сохраняются в переменной r и печатаются r.json ().

Заключение

Мы создали три файла model.py, server.py и request.py для обучения и сохранения модели, обработки запроса и отправки запроса на сервер соответственно.

После кодирования всех этих файлов последовательность для выполнения файлов должна быть model.py, server.py (в отдельном терминале) и в конце запрос .py.

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

Вы можете найти весь код в моем репозитории на Github, flask-salary-predictor.

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

Спасибо :)