我想用FastAPI测试我的管道,但是我在代码中找不到错误。当我使用Visual代码(使用print()语句)测试它时,它可以工作。但是,当我尝试通过浏览器访问端点时,我得到了Internal Server Error。当我返回其他东西作为预测结果(例如,一些字符串),而不是实际的预测结果时,它可以工作。
这是我的代码:
class FraudDetection333(BaseModel):
"""
Input features validation for the ML model
"""
user_id: int
signup_day: int
signup_month: int
signup_year: int
purchase_day: int
purchase_month: int
purchase_year: int
purchase_value: float
source: str
browser: str
sex: str
age: int
@api.post("/predictions_test",tags=['DecisionTreeClassifier'])
def predictions_test(fraud:FraudDetection333):
"""
:param:input data from the post request
:return predicted type
"""
features = [[
fraud.user_id,
fraud.signup_day,
fraud.signup_month,
fraud.signup_year,
fraud.purchase_day,
fraud.purchase_month,
fraud.purchase_year,
fraud.purchase_value,
fraud.source,
fraud.browser,
fraud.sex,
fraud.age
]]
rf_model = joblib.load('./rf_model.pkl')
new = (pd.DataFrame(features, index = ['0'], columns = ['user_id','signup_day',
'signup_month', 'signup_year',
'purchase_day', 'purchase_month', 'purchase_year','purchase_value',
'source','browser','sex','age']))
new_prediction = rf_model.predict(new)
return {
"Predicted transaction(1 - fraud, 0 - not fraud)": new_prediction
}如果我尝试以下操作(使用print()语句),它将输出预期的结果:
featuress={
"user_id": 22058,
"signup_day": 24,
"signup_month": 2,
"signup_year": 2015,
"purchase_day": 18,
"purchase_month": 4,
"purchase_year": 2015,
"purchase_value": 34,
"source": "SEO",
"browser": "Chrome",
"sex": "M",
"age": 39
}
rf_model = joblib.load('./rf_model.pkl')
new = (pd.DataFrame(featuress, index = ['0'], columns = ['user_id','signup_day',
'signup_month', 'signup_year',
'purchase_day', 'purchase_month', 'purchase_year','purchase_value',
'source','browser','sex','age']))
new_prediction = rf_model.predict(new)
print(new)
print(new_prediction)如果我输入return {"Predicted transaction(1 - fraud, 0 - not fraud)": 'Hi'},它也能工作。图像这里。
发布于 2022-06-25 15:33:49
model.predict()函数返回一个numpy.ndarray (您可以使用print(type(new_prediction))验证这一点)。您不能只以这种格式返回它;因此,Internal Server Error。
选项1只是简单地退出并返回numpy数组的第一个元素:
return {'prediction': new_prediction[0]}选项2是使用.tolist()方法将numpy数组转换为.tolist()列表。
return {'prediction': new_prediction.tolist()}https://stackoverflow.com/questions/72754217
复制相似问题