在烧瓶中调用我的预测API时,我遇到了批量预测问题。以下是预测方法,数据和对api的调用的示例。
我将以下内容用于预测
header = {'Content-Type': 'application/json', \
'Accept': 'application/json'}
resp = requests.post("http://0.0.0.0:9099/predict", \
data = json.dumps(data),\
headers = header)
print(resp.status_code)
resp.json()
被调用以进行预测的“数据”如下所示:
[{'z0': -5.256496418,
'z1': 9,
'z2': -6.89507801,
'z3': 41632,
'z4': 1.111277867,
'z5': -7.535017925,
'z6': -7.53415977,
'z7': 20.97768985,
'z8': -0.17019232,
'z9': 0.553848225,
...
'z120': 0.456848224},
{'z0': -3.256456418,
'z1': 2,
'z2': -7.89977801,
'z3': 49031,
'z4': 1.139677866,
'z5': -3.095179245,
'z6': -9.096615932,
...
'z120': 0.235225674}]
我不习惯烧瓶,但是我希望从预测调用中得到的模型是为每个特征集{z0,z1,z2..z120}返回类[0,1]和相应的“概率”值来自json对象中的每个字典。
预测方法:
@app.route('/predict', methods=['POST'])
def predict():
if rfc:
try:
json_ = request.json
print(json_)
json_ = json.dumps(json_)
query = pd.get_dummies(pd.DataFrame([pd.read_json(json_, typ='series')]))
query = query.reindex(columns=model_columns, fill_value=0)
predicted_class = rfc.predict(query)
probabilities = rfc.predict_proba(query)
return jsonify({'class': rfc.classes_.tolist(), 'probabilities': probabilities[0].tolist()})
except:
return jsonify({'trace': traceback.format_exc()})
else:
print ('Train the model first')
if __name__ == '__main__':
port = int(os.getenv("PORT", 9099))
rfc = joblib.load("rfc_model.pkl")
print ('Model loaded!')
model_columns = joblib.load("model_cols.pkl")
print ('Model columns loaded!')
输出:
{'class': [0.0, 1.0],
'probabilities': [0.8488858872836712, 0.1511141127163287]}
期待这样的事情:
{'class': [0.0, 1.0, 0.0, 1.0, 0.0, 1.0],
'probabilities': [0.8488858872836712, 0.1511141127163287, 0.683927135621122, 0.1911441223163237,
0.8235758172236725, 0.1212134577890257]}
尽管理想情况下输出为:
[{"class": 0.0, "probability": 0.8488858872836712},
{"class": 1.0, "probability": 0.1511141127163287},
...
{"class": 1.0, "probability": 0.1212134577890257}]
[找出解决方法,以防其他人发现此问题有用
json_ = request.get_json()
test = json.loads(json_)
for i in test:
t = pd.get_dummies(pd.DataFrame(test))
r = t.reindex(columns=model_columns, fill_value=0)
predicted_class = rfc.predict(r)
probabilities = rfc.predict_proba(r)
# Prepare response
res = {'class': predicted_class.tolist(), 'probabilities': probabilities.tolist()}
content = [dict(zip(res.keys(), i)) for i in zip(*res.values())]