2.3 预测器 (Predictor)


文档摘要

2.3 预测器 (Predictor) 本节摘要:预测器是那类会"张嘴给答案"的估计器:它用 fit 从训练数据里学到规律,再用 predict 对新样本输出结果。分类器给类别,回归器给数值。但给结果不止 predict 一种方式——predictproba 输出每个类别的概率,decisionfunction 输出决策函数的原始得分,后者在你想自己定阈值时特别有用。分清这三种"给答案"的方式,你就知道什么时候只看标签、什么时候要看置信度。

2.3 预测器 (Predictor)

本节摘要:预测器是那类会"张嘴给答案"的估计器:它用 fit 从训练数据里学到规律,再用 predict 对新样本输出结果。分类器给类别,回归器给数值。但给结果不止 predict 一种方式——predict_proba 输出每个类别的概率,decision_function 输出决策函数的原始得分,后者在你想自己定阈值时特别有用。分清这三种"给答案"的方式,你就知道什么时候只看标签、什么时候要看置信度。

核心问题

阅读完本节,你应当能够:

  1. 说清预测器与估计器的关系,以及分类器与回归器的差别
  2. 讲明白 predict 的输入输出形状,为什么特征列数必须一致
  3. 区分 predict、predict_proba、decision_function 三者的语义
  4. 理解 predict_proba 返回概率、decision_function 返回得分的用途
  5. 知道 predict 输出的类别是怎么由概率或得分"二选一"决定的

一、从"学规律"到"给答案"

预测器可以比作一个考生。fit 是复习备考——拿着历年真题(特征 X)和标准答案(目标 y)一遍遍刷,把规律内化到脑子里;predict 是上考场——拿到全新的卷子,不再翻书,直接写答案。考得好不好,取决于复习时有没有真学会,而不是把答案背下来。

先看分类器怎么上场:

from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) # 复习:从特征和标签里学规律 y_pred = model.predict(X_test) # 考试:只看特征,输出预测标签 print(y_pred[:5])

分类器输出的是离散的类别——"这朵花是山鸢尾还是变色鸢尾";回归器输出的是连续的数值——"这栋房子值多少钱"。两者都叫预测器,共享 fit 和 predict 的骨架,差别只在"答案的类型"。

回归器的节奏一样,只是答案换成了连续数值:

from sklearn.linear_model import LinearRegression reg = LinearRegression() reg.fit(X_train, y_train) # 复习:从特征学出数值关系 y_pred = reg.predict(X_test) # 考试:输出预测的数值 print(y_pred[:5])

分类和回归共用同一副骨架,差别只在 y 是"类别"还是"数值"。也正因如此,很多工程经验可以在这两者之间通用——评估方式除外,那要分开讲。

预测器严格说是估计器的一个子集。转换器多一个 transform,预测器多一个 predict。而 predict 本身,在分类任务里还有两个"幕后同事"——predict_proba 和 decision_function,它俩才是很多高级用法的真正入口。

二、三种给结果的方式

分类器的 predict 只给一个硬邦邦的标签,但模型内部其实先算出了更丰富的信息,只是 predict 帮我们"拍了板"。把这三层摊开看:

  • predict:直接给标签,省心,适合"给个结果就行"的场景。
  • predict_proba:给每个样本落在每个类别上的概率,加起来等于 1。想量化"模型有多确信",看它。
  • decision_function:给决策函数的原始得分,可正可负,0 通常是分界。想自己调阈值、在精确率和召回率之间做权衡,看它。

拿二分类来说,predict_proba 返回两个数,比如正类的概率是 0.9;predict 默认按 0.5 切一刀,0.9 大于 0.5,于是判成正类。decision_function 给的是另一套尺子上的数,正数倾向正类、负数倾向反类,距离 0 越远越有把握。

三者的关系可以压成一句:predict 是 predict_proba 或 decision_function 的"取极值"简写。 你要的是标签时用 predict,要的是信心或阈值时,就绕过 predict,直接跟前两者打交道。

看看这三个方法在同一批数据上的实际输出,感受它们的差别:

proba = model.predict_proba(X_test) # 每行是各类概率,和为 1 score = model.decision_function(X_test) # 二分类时给一列得分 label = model.predict(X_test) # 直接给标签 print(proba[:2]) # 形如 0.03 与 0.97 print(score[:2]) # 形如 2.1 与 -1.3 print(label[:2]) # 形如 1 与 0

逻辑回归这里,decision_function 给的是对数几率一类的原始得分。你不需要记住每个模型得分的确切含义,只要记住两点:正负对应方向,绝对值对应把握。

回归器没有概率这一说,predict 直接输出数值,也没 predict_proba。这提醒我们:这三个方法是分类器的专利,别想当然地套到所有预测器上。

三、输出形状与对齐:predict 为什么挑剔

predict 有个容易踩的硬约束:输入的特征列数必须和 fit 时一模一样。 模型在 fit 时记住了"每个样本有 N 个特征",predict 时如果新数据只有 N 减 1 列,它无从算起,直接报错;多一列或少一列都不行。样本数倒是随便——一条也能预测,一万条也能。

分类器和回归器在输出上的差异,一张表理清:

输出 分类器 回归器
predict 类别标签(整数或类别名) 连续数值
predict_proba 每个类别的概率,和为 1 无此方法
decision_function 决策得分,可正可负 部分模型有此方法
score 默认值 准确率 决定系数

所以拿到一个新模型,先别急着跑,先确认两件事:它 fit 时见过几列特征,它的 predict 输出的是标签还是数值。这十秒的确认,能省下后面一个小时的排错。

列数对齐这件事,翻车现场通常长这样:训练时用了五个特征,上线时因为某个字段采集不到,只传进来四个,模型当场报错。稳健的做法是,把"该有哪些特征列"固化成一个清单,predict 前先核对,缺列就补、多列就删,而不是等到报错才发现。样本数不一致则完全没关系——这正是模型能批量服务的原因。

另外,预测结果的形状也值得瞄一眼。分类时 predict 返回的是一维标签,长度等于样本数;predict_proba 返回的是二维矩阵,行数等于样本数、列数等于类别数。搞清楚形状,后续算指标、画图才不会对不上号。

四、工程实践要点

predict_proba 和 decision_function 很实用,但别高估它们。

⚠️ 常见坑:把 predict_proba 的概率当成"校准过的真实概率"。不少模型的概率只是相对大小可信,绝对值未必准,比如决策树给出的 0.9 和逻辑回归给出的 0.9,含义并不完全相同。要做概率意义上的决策,得先确认模型是否校准过。另一个坑是类别不平衡时默认的 0.5 阈值——负例占九成时,0.5 一刀切会让大量负例被误判。

💡 关键直觉:默认的 predict 只有一个阈值,现实里阈值该跟着代价走。漏诊的代价远高于误诊时,就该把阈值压低、让模型更愿意喊"阳性";反过来则抬高阈值。这一步靠 decision_function 自己定,而不是改数据。

用 decision_function 自定阈值,是精确率和召回率之间的一次权衡。比如把"判正"的线从默认的 0 挪到 0.8,模型会变得更保守,误报少了、漏报多了:

raw = model.decision_function(X_test) y_pred_strict = (raw > 0.8).astype(int) # 抬高门槛,宁缺毋滥

这就是 predict 背后的真相:它只是帮你把这条线固定在了默认位置。业务上对误报和漏报的代价不同时,这条线就该自己来划。

什么时候该用哪个?我给的判断顺序是:先看任务要不要置信度。不要,直接 predict;要,二分类看 predict_proba 和 decision_function,多分类看 predict_proba。涉及阈值调优、排序、风险评估这些"不仅要知道答案、还要知道有多确定"的场景,就绕开 predict。

最后回到统一接口本身。predict、predict_proba、decision_function 这三个名字,在几百个分类器里含义一致。你搞懂一个逻辑回归怎么用,随机森林、支持向量机的用法就基本到手——这正是第 2 章反复强调的那套接口的价值所在。

三种方式的选用,可以按"要不要置信度"先砍一刀:

你的需求 用哪个方法
只要一个标签或数值 predict
想知道每类的概率、做排序或风险评估 predict_proba
想自己定阈值、调精确率与召回率 decision_function

还有一点:predict 的"默认拍板"规则,本质是把多分类的概率取最大值。知道这一点,你就能理解为什么调阈值时,改的其实是 predict_proba 到 predict 之间的那道坎,而不是模型本身。模型没变,变的只是你决定"多确信才算数"的标准。

五、关于预测器的常见问题

predict_proba 的概率能直接当"真实概率"用吗?
不能直接。它给的是模型的相对信心,很多模型(尤其是决策树、随机森林这类)的概率未经校准,绝对值会偏。要拿它做概率决策,先做校准,或至少在同分布数据上对比相对大小。逻辑回归这类模型的概率通常更接近真实,但也别无条件相信。

多分类时 decision_function 还适用吗?
适用,但输出变成"每类一个得分"的矩阵,而不是一列。多数多分类场景里,predict_proba 更直观;只有当你要对"某一类 vs 其他类"单独定阈值时,decision_function 才更有用。

类别不平衡时,直接 predict 会怎样?
predict 默认按 0.5 切,负例占九成时会把大量样本判成负类,少数类几乎被淹没。这时候要么改阈值,要么看精确率、召回率这些对不平衡更敏感的指标,而不是盯着准确率。

score 和 predict 是什么关系?
没关系。score 不预测,它拿真实标签 y 和模型预测去算一个评估分;predict 只做预测,不给分数。想快速看模型水平,调 score;想要预测结果,调 predict。两者常被新手混用,其实一个面向"评估",一个面向"产出"。

为什么有的分类器没有 predict_proba?
不是所有模型都天然给出概率。支持向量机这类,默认只给决策得分,要概率得额外开一个选项做概率校准,代价是训练更慢。所以用到 predict_proba 前,先确认你选的模型支不支持,别想当然。

fit 之后能一直 predict 新数据吗,需要重新 fit 吗?
不用。fit 一次、predict 多次,正是预测器的常态用法。模型把规律固化在状态里,之后对新样本只做 predict,不再动状态。只有当你拿到新的训练数据、想更新模型时,才需要重新 fit。

predict 返回的标签,和当初 fit 时的 y 是同一套吗?
是同一套,但要小心编码。分类器在 fit 时会把 y 里的类别名(比如"红""绿")映射成内部整数,predict 返回的通常是这套整数或还原后的类别名,取决于具体实现。做评估时,务必确保预测标签和真实标签用的是同一套编码,否则对不上号。

回归器能做分类、分类器能做回归吗?
不能直接互换。回归输出连续值,分类输出离散标签,两者优化的数学目标不同。但有些技巧能搭桥:比如把回归的连续输出压到 0 到 1 之间,再用阈值切成类别;或者用分类器输出的概率去做排序。这些是"借用",不是把两个角色混为一谈。

重点提炼

  • 预测器等于估计器加 predict:它是估计器里负责"给结果"的那一支。
  • predict 给标签或数值:分类器给类别,回归器给数值。
  • predict_proba 给概率:每个类别的概率,和为 1,量化确信程度。
  • decision_function 给得分:可正可负的原始得分,用来自己定阈值。
  • predict 本质是取最大:默认取概率最大的一类或按 0.5 切分,是前两者的简写。
  • 特征列数必须对齐:fit 时几列,predict 时就得几列,样本数不限。
  • 概率未必校准过:相对大小可信,绝对值要谨慎。

到这里,估计器、转换器、预测器三条线已经收拢。但它们单独用还容易出错——模型到底好不好,不是自己说了算。下一节我们进入模型评估,用指标给预测结果打分。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U