scikit-learn 预测报错时,先区分“模型尚未拟合”和“预测输入与训练列不一致”。下面故意触发这两个本地错误,再按正确顺序拟合模型、核对列名和顺序,完成一次预测。不要仅把异常捕获掉后返回空结果。
环境与运行方法
本文代码在 Windows、Python 3.11 的本地独立环境执行通过。以下数据全部为人为构造的教学样本,不是客户数据,也不是业务效果测试。

新建一个空目录,在终端执行安装命令,把后面的完整代码保存为 demo.py,再执行 python demo.py。文件输出均保存在运行目录,请先在空目录练习。
python -m pip install pandas==3.0.6 scikit-learn==1.9.1
检查模型是否已经拟合
只创建 LogisticRegression() 对象没有训练。check_is_fitted 可以检查拟合状态,未通过时会抛出 NotFittedError。应找到真实训练数据调用 fit,或正确加载已经拟合的对象,而不是在异常处理里随便拿请求数据重新训练。
教学代码先捕获这个预期异常并打印错误类型,再用两个明确特征和二分类标签拟合。正式接口若没有可用模型应明确失败,不能把默认类别冒充模型预测。
列集合与顺序都要保持一致
本例训练列为 age、income。少 income 的请求先被本地输入校验拒绝;列集合正确但顺序相反时,先按训练列顺序重新排列,再预测。仅保证列数等于2不够,交换两个数值列可能让结果失真。
还应核对列单位、类型、缺失值处理与训练期一致。如果转换为 NumPy 后丢掉列名,这些检查尤其容易遗漏。生产系统可以保存输入 schema,并在转换前执行校验;不要只在预测异常时补救。
可复制的完整代码
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.utils.validation import check_is_fitted
from sklearn.exceptions import NotFittedError
model = LogisticRegression()
try:
check_is_fitted(model)
except NotFittedError as exc:
print("before_fit", type(exc).__name__)
else:
raise AssertionError("unfitted model accepted")
X = pd.DataFrame({"age": [20, 25, 40, 45], "income": [2, 3, 8, 9]})
model.fit(X, [0, 0, 1, 1]); check_is_fitted(model)
expected = model.feature_names_in_.tolist()
def align(frame):
if len(frame.columns) != len(expected) or set(frame.columns) != set(expected):
raise ValueError("input_columns_mismatch")
return frame.loc[:, expected]
try:
align(pd.DataFrame({"age": [30]}))
except ValueError as exc:
print("missing_column", str(exc))
else:
raise AssertionError("missing column accepted")
request = pd.DataFrame({"income": [4], "age": [30]})
aligned = align(request)
print("aligned_columns", aligned.columns.tolist())
print("prediction", model.predict(aligned).tolist())
assert aligned.columns.tolist() == ["age", "income"]
运行结果与核对方法
下面是本文教学代码在上述本地环境中的实际输出。浮点数末位可能随依赖版本变化。
before_fit NotFittedError
missing_column input_columns_mismatch
aligned_columns ['age', 'income']
prediction [0]
确认 before_fit 为 NotFittedError,少列请求被标为 input_columns_mismatch;正确请求重新排列为 [age,income] 后得到一个预测。修复真实问题时先核对模型版本与训练 schema,再检查输入,不能仅以“不再报错”当作预测正确。
使用边界与常见问题
代码只覆盖未拟合与列集合、顺序问题,数值错类型、单位变化、空值和额外异常还需另查。四条教学训练记录没有性能代表性,预测结果不用于实际业务判断。
把列名都删掉就不会报列名错了吗?
可能隐藏检查,不能修复数据含义。模型依然要求与训练时相同的特征顺序和单位;应先正确对齐,再决定是否转换成数组。
官方资料
接口与参数依据以下官方资料核对(2026年10月1日)。示例验证只覆盖本文输入和步骤。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30788.html