在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的REST API。 我们将从创建机器学习模型开始。 然后,我们将看到使用Flask创建API并使用Postman对其进行测试的分步过程。
第1部分:创建机器学习模型
我们需要做的第一件事是导入必要的库。 导入必要的库后,我们将需要导入数据。 在这个项目中,我们将使用Boston Housing数据集,可以从sklearn.datasets
下载。
# importing necessary libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import metrics
# importing dataset from sklearn
from sklearn.datasets import load_boston
boston_data = load_boston()
# initializing dataset
data_ = pd.DataFrame(boston_data.data)
### Top five rows of dataset
data_.head()
当前,我们的数据集没有任何功能名称。 因此,我们将需要为数据集导入特征名称。
# Adding features names to the dataframe
data_.columns = boston_data.feature_names
data_.head()
预处理数据
我们要预测的变量是价格。 因此,我们现在将为我们的机器学习模型创建目标变量。
# Target feature of Boston Housing data
data_[ 'PRICE' ] = boston_data.target
现在,我们将检查我们的任何功能是否为null和分类。 这是因为空值会导致偏差估计,机器学习模型需要数值而不是分类数值。
# checking null values
data_.isnull().sum()
未找到空值,因此按原样保留要素。 现在,让我们检查是否存在任何分类值。
# checking if values are categorical or not
data_.info()
我们可以看到所有特征都是数字。 因此,现在我们将创建模型。
建立模型
首先,我们需要将特征和目标变量分开。 然后将数据集分为训练和测试集。 最后创建一个模型。
# creating feature and target variable
X = data_.drop([ 'PRICE' ], axis= 1 )
y = data_[ 'PRICE' ]
# splitting into training and testing set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size= 0.2 , random_state= 1 )
print( "X training shape : " , X_train.shape )
print( "X test shape : " , X_test.shape )
print( "y training shape :“ , y_train.shape )
print(" y test shape :”, y_test.shape )
# creating model
from sklearn.ensemble import RandomForestRegressor
classifier = RandomForestRegressor()
classifier.fit(X_train, y_train)
现在,让我们评估用于训练和测试集的模型的性能。
# Model evaluation for training data
prediction = classifier.predict(X_train)
print( "r^2 : " , metrics.r2_score(y_train, prediction))
print( "Mean Absolute Error: " , metrics.mean_absolute_error(y_train, prediction))
print( "Mean Squared Error: " , metrics.mean_squared_error(y_train, prediction))
print( "Root Mean Squared Error : " , np.sqrt(metrics.mean_squared_error(y_train, prediction)))
# Model evaluation for testing data
prediction_test = classifier.predict(X_test)
print( "r^2 : " , metrics.r2_score(y_test, prediction_test))
print( "Mean Absolute Error : " , metrics.mean_absolute_error(y_test, prediction_test))
print( "Mean Squared Error : " , metrics.mean_squared_error(y_test, prediction_test))
print( "Root Mean Absolute Error : " , np.sqrt(metrics.mean_squared_error(y_test, prediction_test)))
第2部分:保存和使用机器学习模型
我们将使用pickle
保存模型。 序列化和反序列化机制有助于将机器学习对象模型保存到字节流中,反之亦然。 模型将保存在model
文件夹下。 该项目的工作结构在第3部分中显示。
# saving the model
import pickle
with open( 'model/model.pkl' , 'wb' ) as file:
pickle.dump(classifier, file)
# saving the columns
model_columns = list(X.columns)
with open( 'model/model_columns.pkl' , 'wb' ) as file:
pickle.dump(model_columns, file)
第3部分:使用Flask创建用于机器学习的API
成功创建机器学习模型之后。 我们将需要在Flask中创建一个网络服务器。 Flask是轻量级的Web应用程序,易于使用并可以扩展到复杂的应用程序。 本教程介绍Flask应用程序的基本实现,即制作Web服务器和简单的REST API。
这是整个项目的组织方式:
要使用Flask,请先创建一个文件夹名称webapp,然后在终端中使用以下命令在其内部安装flask。 确保烧瓶位于webapp文件夹中。
>> pip install Flask
使用Flask可以生成最少的Web应用程序。 以下代码将创建一个简单的Web应用程序,该应用程序将重定向到指定的URL以产生给定的结果。
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def main () :
return "Boston House Price Prediction”
if __name__ == " __main__ ":
app.run()
运行应用
要在本地计算机上启动Flask服务器,请导航至webapp文件夹并在终端中运行命令。
>> export FLASK_APP=app.py
>> export FLASK_ENV=development
>> flask run
这将执行应用程序。 现在导航到Web浏览器( localhost:5000 )以查看结果。 最终结果如下所示:
让我们将所有代码放在一起,以检查是否错过了任何内容。 所有文件都分为.py
文件。 因此,完整的app.py
文件应如下所示:
from flask import render_template, request, jsonify
import flask
import numpy as np
import traceback
import pickle
import pandas as pd
# App definition
app = Flask(__name__,template_folder= 'templates' )
# importing models
with open( 'webapp/model/model.pkl' , 'rb' ) as f:
classifier = pickle.load (f)
with open( 'webapp/model/model_columns.pkl' , 'rb' ) as f:
model_columns = pickle.load (f)
@app.route('/')
def welcome () :
return "Boston Housing Price Prediction"
@app.route('/predict', methods=['POST','GET'])
def predict () :
if flask.request.method == 'GET' :
return "Prediction page"
if flask.request.method == 'POST' :
try :
json_ = request.json
print(json_)
query_ = pd.get_dummies(pd.DataFrame(json_))
query = query_.reindex(columns = model_columns, fill_value= 0 )
prediction = list(classifier.predict(query))
return jsonify({
"prediction" :str(prediction)
})
except :
return jsonify({
"trace" : traceback.format_exc()
})
if __name__ == "__main__" :
app.run()
第4部分:在Postman中测试API
为了测试我们的API,我们将需要API客户端,并且我们将使用Postman。 下载Postman后,它应如下所示。
现在,我们将键入URL( localhost:5000 / predict )并在中键入模型所需的功能。 体内的json格式。 并将请求类型更改为POST。 我们的最终结果应如下所示。
摘要
至此,您已经开发了机器学习并使用Flask创建了API,该API可用于预测波士顿的房屋价格。
扩展这项工作
本文重点介绍为机器学习模型创建REST API和在Postman上进行测试。 此外,它可以扩展为制作Web应用程序并在Heroku云平台中进行部署。