Я создал API с использованием Flask, который предоставляет прогнозы с использованием предварительно обученной модели Scikit-learn. API отлично работает на локальном хосте и в локальной сети Heroku, но не удается загрузить модель при ее развертывании. API возвращает прогноз в виде JSON. {"prediction":123}
возвращается при локальном запуске. {"error":"Failed to load model"}
возвращается при развертывании.
Архитектура приложений:
- houseprediction.py
- waitressServer.py
- requirements.txt
- Procfile
- supp-files:
- gbModel.pkl
- model_columns.pkl
- sectorLabels.pkl
houseprediction.py:
from flask import Flask, jsonify, request
from sklearn.externals import joblib
import pandas as pd
import os
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
dir_path = os.path.dirname(os.path.realpath(__file__))
try:
gbModel = joblib.load("{}\\supp-files\\gbModel.pkl".format(dir_path))
except:
return jsonify({'error': 'Failed to load model'})
try:
model_columns = joblib.load("{}\\supp-files\\model_columns.pkl".format(dir_path))
except:
return jsonify({'error': 'Failed to load model columns'})
try:
lbl = joblib.load("{}\\supp-files\\sectorLabels.pkl".format(dir_path))
except:
return jsonify({'error': 'Failed to load sector labels'})
json_ = request.get_json()
query_df = pd.DataFrame(json_, index=[0])
pd.options.display.max_columns = 50
query_df['sector'] = lbl.transform([query_df['sector']])[0]
print(query_df.dtypes)
query = pd.get_dummies(query_df)
for col in model_columns:
if col not in query.columns:
query[col] = 0
print(query_df.shape)
print(query_df.head(1))
prediction = gbModel.predict(query)
print(prediction)
return jsonify({'prediction': prediction[0]})
@app.route('/')
def home():
return "Welcome to House Prediction"
waitress.py:
from waitress import serve
import os
import housepredictionServer
serve(housepredictionServer.app, port=os.environ['PORT'])
Procfile: web: python waitressServer.py
Дайте мне знать, если что-нибудь еще понадобится.