2017-04-04 125 views
0

我试图创建一个使用Iris数据集的机器学习模型(通过观看教程,完成机器学习和数据科学的新手),到目前为止,我还使用随机森林分类划分,但现在我想检查我对自定义输入的预测,我的分类主要代码如下:JSONDecodeError:期望值:Iris数据集第1行第1列(char 0)

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()) 

我使用,使连接烧瓶文件:

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) 

但是当我运行该程序时,我得到错误“JSOND ecodeError:期待值:第1行第1列(CHAR 0)”

的附加细节:我使用Jupyter笔记本制作预测和原子用于创建烧瓶文件,Pyhton 3版

回答

0

结果通过所递送的函数make_predict()是发生错误的地方。

JSON(Java Script Object Notation)只能表示/序列化数据类型的有限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()将能够识别它。

相关问题