FastAPI本身不构建模型,仅提供API接口层;需用scikit-learn等库完成训练与推理,FastAPI负责接收JSON特征、校验结构(BaseModel)、调用预加载模型(startup事件)、转为DataFrame输入predict,确保维度、dtype、列序与训练一致。

FastAPI 本身不构建数据分析模型,它只提供高性能的 API 接口层;模型训练、推理逻辑必须由你自己用 scikit-learn、pytorch 或 pandas 等库完成,FastAPI 负责接收请求、调用模型、返回结果。
如何定义 FastAPI 路由接收结构化数据(如 CSV 行或 JSON 特征)
用户常误以为可以直接上传整个 CSV 文件再在接口里读取——这会阻塞主线程、拖慢响应。更合理的是:前端预处理成特征向量,以 JSON 发送;后端用 pydantic 模型校验结构。
- 用
BaseModel定义输入 schema,字段类型要和模型训练时的特征顺序、类型严格一致(比如float不能传str) - 避免在
POST路由中调用pandas.read_csv()——除非你明确做了异步封装或移到后台任务 - 示例输入模型:
class PredictionInput(BaseModel):<br> sepal_length: float<br> sepal_width: float<br> petal_length: float<br> petal_width: float
怎样安全加载已训练的模型(.pkl / .joblib)并避免重复反序列化
每次请求都 joblib.load() 会导致严重性能下降,且可能引发并发读取冲突。模型应只加载一次,在应用启动时注入到全局状态或依赖中。
- 用
@app.on_event("startup")钩子加载模型到app.state.model,而不是放在路由函数内部 - 确保路径是绝对路径,避免因工作目录变化导致
FileNotFoundError: [Errno 2] No such file or directory - 如果模型含自定义类(如继承
sklearn.base.BaseEstimator的类),需保证该类定义在加载时可 import,否则反序列化失败
为什么 predict() 报错 "Expected 2D array, got 1D array"?
这是 scikit-learn 模型最常见报错,根源在于 FastAPI 解析后的输入是 dict 或 Pydantic 对象,直接传给 model.predict() 会被当成单个样本的 1D 特征,而 sklearn 要求二维数组(即使只预测一个样本)。
立即学习“Python免费学习笔记(深入)”;
- 正确做法:用
np.array([data.dict().values()])或pd.DataFrame([data.dict()])包一层 - 更稳妥:统一用
pd.DataFrame构造输入,既兼容缺失值填充逻辑,也避免 dtype 不一致(例如训练时是float64,而 API 输入被解析为float32) - 不要依赖
model.predict([x])自动升维——部分老版本 sklearn 不支持,行为不可靠
模型输入维度、dtype、列名顺序,和训练时完全一致,才是接口不出错的前提;这些细节不会在 FastAPI 文档里体现,但会在第一次真实请求时立刻暴露。


















