scikit-learn 预测报错怎么排查?检查未拟合模型与特征列不一致

scikit-learn 预测报错时,先区分“模型尚未拟合”和“预测输入与训练列不一致”。下面故意触发这两个本地错误,再按正确顺序拟合模型、核对列名和顺序,完成一次预测。不要仅把异常捕获掉后返回空结果。

scikit-learn 预测报错时,先区分“模型尚未拟合”和“预测输入与训练列不一致”。下面故意触发这两个本地错误,再按正确顺序拟合模型、核对列名和顺序,完成一次预测。不要仅把异常捕获掉后返回空结果。

环境与运行方法

本文代码在 Windows、Python 3.11 的本地独立环境执行通过。以下数据全部为人为构造的教学样本,不是客户数据,也不是业务效果测试。

scikit-learn 预测报错怎么排查?检查未拟合模型与特征列不一致

新建一个空目录,在终端执行安装命令,把后面的完整代码保存为 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

赞 (0)
AI小管家的头像AI小管家
AI 分类算法怎么可视化?用两个特征画决策区域并叠加样本
上一篇 1天前
中文文档怎么做本地检索?用 TF-IDF 排序并检查零命中
下一篇 1天前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部