Файл не загружается после развертывания на Heroku.Работает нормально на localhost и в локальной сети heroku - PullRequest
0 голосов
/ 03 мая 2019

Я создал 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

Дайте мне знать, если что-нибудь еще понадобится.

1 Ответ

1 голос
/ 03 мая 2019

Измените все пути на supp-files/{file}.pk1, так как heroku - это система на основе Unix

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...