Как новичку в машинном обучении, любому может быть легко получить достаточно ресурсов обо всех алгоритмах машинного обучения и глубокого обучения, но когда я начал искать ссылки для развертывания модели машинного обучения в производственной среде, я не нашел действительно хороших ресурсов, которые может помочь мне развернуть мою модель, так как я новичок в этой области. Итак, когда мне удалось развернуть мою модель с использованием Flask в качестве API, я решил написать статью, чтобы помочь другим просто развернуть свою модель. Я надеюсь, что это помогает:)
В этой статье мы собираемся использовать простой алгоритм линейной регрессии с scikit-learn для простоты, мы будем использовать Flask, поскольку это очень легкий веб-фреймворк. Мы создадим три файла,
- model.py
- server.py
- request.py
В файле model.py мы разработаем и обучим нашу модель, в файле server.py мы запишем код для обработки запросов POST и возврата результатов и, наконец, в request.py, мы отправим запросы с функциями на сервер и получим результаты.
Приступим к кодированию
- 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.
Не стесняйтесь делиться своими идеями в разделе комментариев ниже.
Спасибо :)