首页 > 解决方案 > 错误:TypeError:“int64”类型的对象不是 JSON 可序列化和 json.decoder.JSONDecodeError:预期值:第 1 行第 1 列(字符 0)

问题描述

我正在尝试使用 Flask 部署我的 ML 模型。但我收到了上述错误。下面的代码是鸢尾花数据集上的随机森林分类器。

import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

加载数据集

iris = load_iris()
X = iris.data
y = iris.target

拆分数据集

X_train, X_test, y_train, y_test = train_test_split(X, y , 
random_state = 1)

构建模型

clf = RandomForestClassifier(n_estimators=100,n_jobs=2)

训练分类器

clf.fit(X_train, y_train)

预测物种

predicted = clf.predict(X_test)
print(predicted)

检查准确性

print(accuracy_score(predicted, y_test))

import pickle as pickle
pickle.dump(clf,open("rfc.pkl","wb"))
my_rfc = pickle.load(open("rfc.pkl","rb"))

import requests
import json

url="http://127.0.0.1:8000/api"
data=json.dumps({'sl':5.5,'sw':3.2,'pl':3.7,'pw':1.2})
r=requests.post(url,data)

print (r.json())

烧瓶代码:

import numpy as np 
from flask import Flask
from flask import abort
from flask import jsonify
from flask import request
import pickle as pickle

my_rfc = pickle.load(open("rfc.pkl","rb"))

app=Flask(__name__)

@app.route('/')
def index():
    return "Iris prediction"

@app.route('/api',methods=['POST'])

def make_predict():

 data=request.get_json(force=True)
 data_request = [[data['sl'],data['sw'],data['pl'],data['pw']]]
 data_request = np.array(data_request).reshape(1,4)
 y_hat=my_rfc.predict(data_request)
 output=[y_hat[0]]
 return jsonify(results=output)


if __name__ == '__main__':
  app.run(port=8000,debug=True)

错误:

回溯(最后一次调用):文件“new1.py”,第 40 行,打印中(r.json())文件“/home/saurabh/anaconda3/lib/python3.6/site-packages/requests/models. py”,第 896 行,在 json 中返回 complexjson.loads(self.text, **kwargs) 文件“/home/saurabh/anaconda3/lib/python3.6/json/init .py ”,第 354 行,在负载中返回 _default_decoder .decode(s) File "/home/ line 357, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

标签: pythonjsonflaskscikit-learn

解决方案


如果 JSON 解码失败,r.json()则会引发异常。例如,如果响应得到 204(无内容),或者如果响应包含无效的 JSON,则尝试r.json()引发 ValueError: No JSON object could be decoded。

需要注意的是,调用成功r.json()并不代表响应成功。某些服务器可能会在失败的响应中返回 JSON 对象(例如 HTTP 500 的错误详细信息)。这样的 JSON 将被解码并返回。要检查请求是否成功,请使用r.raise_for_status()或检查r.status_code您所期望的。

所以检查你的状态码如果它是 200 那么它应该解析 json 如果它是 204 那么 URL 有问题。检查它使用

print(r.status_code)

有关更多信息,请参阅此链接


推荐阅读