使用 FastAPI 为使用 pycaret 生成的分类模型构建 API
Build API using FastAPI for Classification Model produced using pycaret
我正在使用 pycaret 作为我的 ML 工作流程,我尝试使用 FastAPI 创建一个 API。这是我第一次进入生产级别,所以我对 API
有点困惑
我有 10 个特征;年龄:float,live_province:str,live_city:str,live_area_big:str,live_area_small:str,性别:float,婚姻:float,银行:str,薪水: float, amount: 浮点数和一个包含二进制值(0 和 1)的标签。
这是我构建 API
的脚本
from pydantic import BaseModel
import numpy as np
from pycaret.classification import *
import uvicorn
from fastapi import FastAPI
app = FastAPI()
model = load_model('catboost_cm_creditable')
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
input_dict = Data
@app.post("/predict")
def predict(model, input_dict):
predictions_df = predict_model(estimator=model, data=input_dict)
predictions = predictions_df['Score'][0]
return predictions
当我尝试 运行 uvicorn script:app
并查看文档时,我找不到我的功能的参数,参数只显示模型和 input_dict
如何将我的功能添加到 API 中的参数中?
您的问题出在 API 函数的定义上。您为数据输入添加了一个参数,但没有告诉 FastAPI 它的类型。
此外,我假设您不是要使用全局加载的模型而不是将其作为参数接收。此外,您不需要为输入数据创建全局实例,因为您希望从用户那里获取它。
因此,只需将函数的签名更改为:
def predict(input_dict: Data):
并删除行:
input_dict = Data
(这只是为您的 class Data
创建一个名为 input_dict
的别名)
你最终会得到:
app = FastAPI()
model = load_model('catboost_cm_creditable')
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
@app.post("/predict")
def predict(input_dict: Data):
predictions_df = predict_model(estimator=model, data=input_dict)
predictions = predictions_df['Score'][0]
return predictions
此外,我建议将 class Data
的名称更改为更清晰易懂的名称,我认为 DataUnit
会更好,因为 [=13] =]太笼统了。
您需要 Type-hint 您的 Pydantic 模型才能与您的 FastAPI 一起使用
想象一下,当您需要记录该功能时,您真的在使用标准 Python,
def some_function(price: int) ->int:
return price
使用 Pydantic 与上面的示例没有什么不同
你的 class Data
实际上是 python @dataclass
和 super-powers(来自 Pydantic)
from fastapi import Depends
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
@app.post("/predict")
def predict(data: Data = Depends()):
predictions_df = predict_model(estimator=model, data=data)
predictions = predictions_df["Score"][0]
return predictions
有一个小技巧,使用 Depends,你会得到一个单独的查询,就像你单独定义每个字段时一样。
取决于
不依赖
我正在使用 pycaret 作为我的 ML 工作流程,我尝试使用 FastAPI 创建一个 API。这是我第一次进入生产级别,所以我对 API
有点困惑我有 10 个特征;年龄:float,live_province:str,live_city:str,live_area_big:str,live_area_small:str,性别:float,婚姻:float,银行:str,薪水: float, amount: 浮点数和一个包含二进制值(0 和 1)的标签。
这是我构建 API
的脚本from pydantic import BaseModel
import numpy as np
from pycaret.classification import *
import uvicorn
from fastapi import FastAPI
app = FastAPI()
model = load_model('catboost_cm_creditable')
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
input_dict = Data
@app.post("/predict")
def predict(model, input_dict):
predictions_df = predict_model(estimator=model, data=input_dict)
predictions = predictions_df['Score'][0]
return predictions
当我尝试 运行 uvicorn script:app
并查看文档时,我找不到我的功能的参数,参数只显示模型和 input_dict
如何将我的功能添加到 API 中的参数中?
您的问题出在 API 函数的定义上。您为数据输入添加了一个参数,但没有告诉 FastAPI 它的类型。 此外,我假设您不是要使用全局加载的模型而不是将其作为参数接收。此外,您不需要为输入数据创建全局实例,因为您希望从用户那里获取它。
因此,只需将函数的签名更改为:
def predict(input_dict: Data):
并删除行:
input_dict = Data
(这只是为您的 class Data
创建一个名为 input_dict
的别名)
你最终会得到:
app = FastAPI()
model = load_model('catboost_cm_creditable')
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
@app.post("/predict")
def predict(input_dict: Data):
predictions_df = predict_model(estimator=model, data=input_dict)
predictions = predictions_df['Score'][0]
return predictions
此外,我建议将 class Data
的名称更改为更清晰易懂的名称,我认为 DataUnit
会更好,因为 [=13] =]太笼统了。
您需要 Type-hint 您的 Pydantic 模型才能与您的 FastAPI 一起使用
想象一下,当您需要记录该功能时,您真的在使用标准 Python,
def some_function(price: int) ->int:
return price
使用 Pydantic 与上面的示例没有什么不同
你的 class Data
实际上是 python @dataclass
和 super-powers(来自 Pydantic)
from fastapi import Depends
class Data(BaseModel):
age: float
live_province: str
live_city: str
live_area_big: str
live_area_small: str
sex: float
marital: float
bank: str
salary: float
amount: float
@app.post("/predict")
def predict(data: Data = Depends()):
predictions_df = predict_model(estimator=model, data=data)
predictions = predictions_df["Score"][0]
return predictions
有一个小技巧,使用 Depends,你会得到一个单独的查询,就像你单独定义每个字段时一样。