我正在尝试使用Iris数据集创建机器学习模型(通过观看教程,完成机器学习和数据科学的新手来实现),到目前为止我已经使用随机森林分类器对其进行了分类,但现在我希望检查我对自定义输入的预测,我的主要分类代码如下:
X= iris.data
y= iris.target
X_train, X_test, y_train, y_test = train_test_split(X,y)
rfc = RandomForestClassifier(n_estimators=100, n_jobs=2)
rfc.fit(X_train, y_train)
print ("Accuracy = %0.2f" % accuracy_score(y_test, rfc.predict(X_test)))
print (classification_report(y_test, rfc.predict(X_test)))
pickle.dump(rfc, open("iris_rfc1.pkl", "wb"))
my_random_forest = pickle.load(open("iris_rfc1.pkl","rb"))
url= "http://localhost:9000/api"
data = json.dumps({'sl':5.8,'sw':4,'pl':2,'pw':9})
r = requests.post(url, data)
print (r.json())
我用来建立连接的Flask文件:
my_random_forest = pickle.load(open('iris_rfc1.pkl','rb'))
app = Flask(__name__)
@app.route('/api', methods=['POST'])
def make_predict():
data = request.get_json(force = True)
predict_request = [data['sl'],data['sw'], data['pl'], data['pw']]
predict_request = np.array(predict_request)
y_hat = my_random_forest.predict(predict_request)
output = [y_hat[0]]
return jsonify(results = output)
if __name__ == '__main__':
app.run(port=9000, debug = True)
但是当我运行程序时,我收到错误“JSONDecodeError:Expecting value:line 1 column 1(char 0)”
其他细节:我正在使用Jupyter Notebook进行预测,使用原子创建烧瓶文件,Pyhton Version 3
答案 0 :(得分:0)
函数make_predict()传递的结果是发生错误的地方。
JSON(Java脚本对象表示法)只能表示/序列化有限的group数据类型,而Numpy对象不属于该组。
查看错误消息,数字0必须是随机森林分类器生成的预测,而RFC只能在Numpy数组上运行。它们的输出也是相同的数据类型。 .json()方法不知道如何序列化numpy对象。
>>>a = rfc.predict(np.array([1,2,3,4]).reshape(1,-1))
>>>a, type(a)
(array([1]), numpy.ndarray)
>>>b = a[0]
>>>b, type(b)
(1, numpy.int32)
>>>c = np.asscalar(b)
>>>c, type(c)
(1, int)
y_hat是一个numpy数组,y_hat(输出变量)的第一个元素是np.int32类型。使用np.asscalar()方法将其转换为int,json()将能够识别它。