为贷款违约预测模型添加数据库后预测结果异常的排查求助
排查思路与解决方案
1. 核对特征列名与模型训练时的一致性
模型训练时使用的特征列名必须和预测时传入的DataFrame列名完全一致(包括大小写、拼写)。
- 你当前代码中列名是
['Age', 'Income', 'Home', ...],请确认训练模型时的特征列名是否完全匹配。如果训练时用的是小写age而非Age,pandas会将这些列视为新特征,模型会因特征缺失返回固定预测结果。 - 验证方法:打印模型预期的特征列名(树模型可通过
model.feature_names_in_查看),和你当前的column_names对比:
# 在模型加载后加入该行代码 print(model.feature_names_in_)
2. 验证输入数据的类型与预处理逻辑
- 检查表单传入的
form.xxx.data类型是否符合模型要求:比如rate应为浮点数、age应为整数,如果表单返回字符串类型,会导致DataFrame的dtype异常,模型无法正确计算。
验证方法:打印data_df.dtypes,和训练时的特征dtype对比。 - 确认预测前是否执行了和训练时完全相同的预处理步骤(如标准化、编码、缺失值填充):之前用数组时可能已完成预处理,但现在直接传入表单原始数据,缺少这一步会导致模型输出固定结果。
3. 确认表单验证是否真正触发
可能form.validate_on_submit()实际未通过,导致prediction_result始终为初始的None或返回旧结果:
- 在
if form.validate_on_submit()分支开头加入打印语句,确认每次提交都进入该分支:
if form.validate_on_submit(): print("表单验证通过,开始预测") # 后续代码...
4. 排查数据库操作的潜在异常
数据库本身不会直接修改模型输入,但可排查以下点:
- 确认
db.session.commit()是否引发异常,导致代码提前终止:
try: db.session.add(new_credit) db.session.commit() print("数据成功写入数据库") except Exception as e: db.session.rollback() print(f"数据库操作出错: {e}")
- 调整
credit模型的prediction_result字段类型:模型输出是整数1/0,数据库中定义为Float虽不影响预测,但改为Integer可避免潜在类型问题。
5. 确认模型加载状态
检查模型是否被正确加载且未被意外修改:
- 在路由函数内打印
model的基本信息(如type(model)、模型参数),确认每次请求时模型都是同一个实例,没有被重置。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

