拓冰建站拓冰建站
首页 / 资讯中心 / 正文

分类与回归的边界:从逻辑回归到决策树,解开机器学习任务的模糊真相

写这篇东西的起因特别简单我前几天和一个做广告投放的朋友聊模型他说线上跑的核心模型是逻辑回归任务听起来特别明确——“预测用户点不点”。二分类嘛教科书里写得清清楚楚。结果我多问了两句发现他们线上真正用来排序的是模型输出的那个连续概率值而不是类别标签。朋友自己也愣了一下“这么算的话我做的到底是分类还是回归”这不是抬杠。分类和回归在绝大多数入门教材里被当成机器学习的两个基本任务前者输出离散类别后者输出连续数值看起来泾渭分明。但我在实际项目里泡得越久越发现越是贴近业务的地带这两个任务之间的边界就越虚。决策树可以同一套代码做分类树也可以做回归树逻辑回归挂着“回归”的名字干着分类的活目标检测框的坐标偏移是回归、框里目标的类别是分类却共享同一个特征提取器。这类例子多得数不过来。这篇文章我想把这两种任务拆开揉碎聊一聊它们到底差在哪、为什么说界限不明确、以及我们在做技术选型和模型设计时可以怎么利用这种“模糊性”。1. 从数学定义看分类和回归本来就是同一个问题的两种切法1.1 一个映射函数的两副面孔很多人一上来就背定义分类是预测离散标签回归是预测连续数值。这句话没错但只看到了输出层面的区别没看到模型内部到底在做什么。不管分类还是回归模型的本质都是学一个函数f(x)输入是特征向量输出是一个数值、一组数值或一个分布。以最简单的一维输出为例回归模型输出的是某个连续值比如房价 250 万、温度 31.5 度、用户未来 30 天消费金额 1200 元。分类模型在绝大多数神经网络和树模型实现里输出的也是一个连续值只不过这个连续值被解读成“属于某个类别的概率”或“置信度分数”再做 argmax 或阈值化才得到离散标签。换句话说很多分类模型在最后一层之前和回归模型几乎没有任何区别。神经网络的分类任务常见做法是输出层接 softmax把网络输出变成一组和为 1 的概率回归任务则通常不接激活函数直接输出神经元的值。但特征提取层、隐藏层、优化器的选择全都共用同一套技术栈。这里有个很有意思的点如果某个分类模型只输出 0 和 1 两个值梯度几乎是零模型完全没法训练。所以即使是二分类模型内部学的也必然是一个连续的“概率回归”过程最后才用阈值 0.5 切成两个类别。可以这么理解分类是回归结果的 discretization离散化回归则可以被看成分类的连续化表达。1.2 输出空间的性质决定了任务的“软硬”程度那是不是说两者完全一样也不是。区别主要在于输出空间的拓扑性质和模型要优化的目标。回归问题的输出空间是一个有序的、有距离度量的实数空间。两个输出值之间可以算差值差值的平方可以直接作为损失函数。分类问题的输出空间是离散的类别集合多数情况下类别之间没有天然顺序比如猫、狗、鸟这三类不能说猫和狗离得更近、鸟离得更远。可一旦类别本身带顺序分类问题就隐隐有回归的味道了。比如电商评价的 1 到 5 星年龄段分组少年、青年、中年、老年疾病严重程度轻、中、重。这类任务叫有序分类ordinal classification本质上就夹在分类和回归中间如果当成纯分类会丢掉顺序信息如果当成纯回归又会假设类别之间的间距是相等的、可加性的这在很多场景下并不严格成立。实操里我见过太多人在这类问题上站队有人坚持当分类做有人直接当回归做。我的看法是当类别有顺序时回归往往是个不错的基线因为它能利用顺序信息训练更平稳但如果业务上必须输出唯一的离散档次最终还是要靠阈值映射回到类别。2. 同一套算法家族里的左右手以决策树、随机森林和梯度提升为例2.1 决策树分裂时的“同源不同表”热词里几乎同时出现了“决策树进行鸢尾花分类”“回归树 CART 与模型树 M5”“随机森林回归预测模型”。这不是偶然因为树模型天生就是分类回归通吃的。以最经典的 CART 树为例。分类树在分裂时默认用 Gini 不纯度回归树在分裂时默认用均方误差MSE。乍一看两个准则完全不一样但仔细想Gini 不纯度衡量的是“节点内部类别混乱程度”MSE 衡量的是“节点内部数值离散程度”。本质上它们都在做同一件事——让分裂后的子节点比分裂前更“纯”。所以把树模型从分类换到回归逻辑上只需要替换分裂准则、叶子节点的输出方式和损失函数。sklearn 里就是DecisionTreeClassifier和DecisionTreeRegressor两个类的事大多数参数结构都几乎一致。换成 LightGBM、XGBoost 更直接训练时传一个objective参数binary还是regression同一套梯度提升框架就能切换。我在实际项目中甚至遇到过这种情况同一个二分类问题把 objective 从binary:logistic换成reg:squarederror再把输出做阈值化效果居然也说得过去——虽然这种做法不太主流但它从侧面印证了树模型视角下分类和回归的边界有多模糊。2.2 随机森林的“换头术”和它的实战价值随机森林是 Bagging 思想的代表它的核心是靠多棵树投票或取平均来降低方差。这个“投票”和“取平均”本身就跨越了分类和回归分类任务里每棵树投一个类别票回归任务里每棵树给一个数值预测最终汇总。如果只是做算法演示这件事没什么好展开的。但在真实项目里随机森林的这套机制经常被用来做跨界操作。举一个我自己的例子有个项目要预测用户流失业务上想要的是“用户会流失 / 不会流失”这个分类结果但运营团队又希望能根据流失风险做资源倾斜排序。我当时的做法很直接训练一个随机森林分类器不取最终的 0/1 标签而是直接取每个用户属于正类的概率均值再按这个分数排序。本质上我是在用分类模型输出一个连续回归值然后把它当排序工具用。反过来也一样。机器学习竞赛里经常有人把回归目标分箱转成多分类任务来做最后再映射回数值。比如房价预测如果把价格按区间切成 10 个桶用一个 10 分类模型去做有时反而能避免回归模型被极端值带偏。这种转换在工程上很常见原理并不高深就是利用了分类模型对局部模式更敏感的特性。2.3 梯度提升里的损失函数选择才是真正的“开关”到了 XGBoost、LightGBM、CatBoost 这一代分类和回归的融合程度更高了。它们都是梯度提升框架理论上一阶导和二阶导只和损失函数有关所以理论上任何可微损失函数都能塞进去。这意味着**分类问题和回归问题在梯度提升框架里只差一个损失函数声明。**你不需要换算法不需要换数据结构甚至特征工程都可以完全复用。热词里的“xgboost 回归预测模型”“xgboost 回归模型”满天飞恰恰说明大家已经默认这个东西两种任务都能干。当然损失函数不同对样本的敏感度也不同。MSE 对离群点极其敏感二分类对数损失对置信度错误的惩罚更结构化。日常调参时我会额外留意一个细节如果训练集里标签噪声很大分类任务可以适当降低正样本权重回归任务可以考虑换成 Huber 损失。但这些都是同一个模型框架下的“配置问题”而不是“算法选择问题”。3. “回归”这个名字骗过所有人逻辑回归、SVM 与 softmax 的身份错位3.1 逻辑回归干分类的活却起了一个回归的名字热词里“逻辑回归”出现了很多次这绝对是最能说明标题观点的一个概念。逻辑回归这个名字害人不浅。新学者第一次听到“逻辑回归”第一反应都是这应该是个回归算法。结果翻开书发现它做的是二分类整个人都懵了。为什么叫回归这事得从统计学历史说起。逻辑回归的原始形式是用线性模型去拟合事件发生概率的对数几率log odds也就是 logit 函数。因为拟合的目标是“对数几率”这个连续值所以从建模过程来看它是一个实数回归问题但最终输出经过 sigmoid 变换后落在 0 到 1 之间刚好可以当成概率再通过阈值决策变成类别。所以逻辑回归的真实身份是**回归到概率的模型被用来做分类的决策。**在实际代码里我们通常取predict_proba()的分数做排序或阈值化很少直接看它输出的 0/1 标签因为标签是后处理带来的模型本身并没有真正输出“类别”这个量。理解了这一层就不会再纠结它到底算哪一边了——它就是界限模糊的一个活证据。3.2 支持向量机与支持向量回归同一套几何思想的分类镜像和回归镜像热词里既有“支持向量机用于鸢尾花分类”又有“支持向量回归”。SVM 和 SVR 的关系比逻辑回归更直观它们都建立在间隔最大化的几何思想上。SVM 在分类任务里找的是能让两类样本距离最大化的分离超平面。SVR 的思路则反过来它不再要求样本被正确分类而是在一个容忍带epsilon 不敏感区间内允许预测值和真实值之间存在一定偏差只要偏差在带宽内就不计损失。本质上SVR 是在用 SVM 的几何思想解决连续值拟合问题。同一个出发点两个看似不同的任务最后长成了两棵不同的树但根是连在一起的。我在早期的项目里老有一个误区以为 SVR 就是换一个损失函数的 SVM但实际上 SVR 对特征量纲和核函数的选择更敏感调参难度比 SVM 高一个量级。不过这不是重点重点在于这个例子告诉我们一个算法的设计思想可以同时支撑分类和回归两套应用算法本身并不天然属于某一类任务。3.3 softmax 回归神经网络里的“回归式分类”再提一个名字容易绕晕的东西softmax 回归。它常被叫做多项式逻辑回归是逻辑回归在多分类上的推广。但很多人不知道在早期文献里它也被直接叫作“softmax regression”。如果我们把网络最后一层的输出看成一个连续向量softmax 对向量做归一化让它变成一个概率分布那么这整个计算过程确实是“把线性回归的输出压缩成概率分布”的过程。也就是说一个做多分类的模型从数学过程看是一连串回归操作的组合。这个视角对理解神经网络特别有帮助分类头、回归头、多任务头之间的差别不过就是最后一层怎么算损失、怎么解读输出而已。4. 实战中的互换分类转回归、回归转分类的典型操作4.1 分类转回归用概率分数换排序能力和细粒度评估先看分类转回归。几乎所有带概率输出的分类器比如随机森林、XGBoost、逻辑回归、神经网络都可以直接输出“概率估计值”这个连续量。这个连续量可以直接用来排序把候选对象按风险或优先级排序比如流失风险排序、样本异常程度排序。校准把概率分数和真实频率对齐比如预测 0.8 的样本里真实正例比例接近 80%。精细决策业务上可以设多个阈值比如分数大于 0.8 走 A 策略大于 0.5 走 B 策略而不是一刀切。垃圾邮件分类这个场景就很典型。朴素贝叶斯模型用于垃圾邮件分类模型本身输出的是“这封邮件是垃圾邮件的概率”。如果你只需要一个粗分类结果取 0.5 阈值但如果垃圾邮件被误判的代价很高你会希望把阈值调高只有概率高于 0.9 才直接进垃圾箱。这个调阈值的过程本质上就是在分类任务的壳里做回归式的精细控制。另外有一个容易被忽视的点分类模型输出的概率分数并不天然代表真实概率。尤其当训练数据和线上数据分布不一致时分数会偏移。所以有些团队会专门加一个“概率校准”步骤用 Platt 缩放或 Isotonic 回归把分数重新映射成更准确的概率。这一步操作的名字里也带了“回归”但它服务的是一个分类系统。4.2 回归转分类分箱让模型更好学也让业务更好解释回归转分类最经典的做法是分箱binning。把连续目标切成几段每一段作为一个类别。这种操作有几个现实理由目标值本身带有噪声连续回归对噪声更敏感分箱后模型更容易学到稳定规律。业务侧更关心区间而不是精确值比如信用评分只关心你属于“低风险、中风险、高风险”中的哪一级。分箱后可以使用分类模型家族里的评估指标比如混淆矩阵、F1对非技术同事解释成本更低。热词里“年龄预测”和“年龄段分类”其实就是这种场景的常见对比。如果业务部门说“我们只要知道用户是 20 到 30 岁还是 30 到 40 岁”那你去训练一个回归模型预测精确年龄既吃力又不一定讨彩。直接做有序分类模型简单解释也顺。但注意分箱会丢失目标值内部的信息。箱子切得越细越接近回归切得越粗分类误差越大。我的建议是先跑一个回归模型看误差分布集中在哪些区间如果误差集中在边界附近说明分箱边界本来就是模糊地带这类样本被分错是正常的不要过度追求分类准确率。4.3 情感分析案例一个项目里同时用上两种任务的思维方式热词里有“疫情微博情绪分类”“文本分类推荐”。文本情感分类是一个特别典型的、可以用分类和回归双视角解析的任务。传统做法是标注“积极、中性、消极”三类就是一个三分类任务。但实际标注过程中你会发现标注员经常犹豫“这句话到底是有点消极还是很消极”这说明情感本身是连续量只是我们强行把它切成了离散类别。我在一个文本项目里试过另一种做法让标注员直接给每句话打一个 -1 到 1 的连续情感分然后训练一个回归模型。得到的模型不仅可以直接输出情感强度还可以通过两个阈值映射回积极、中性、消极三个类别。效果上这样训练出来的模型比直接训练三分类模型更稳定因为标注里的顺序信息被充分利用了。这就是把分类任务“改造成”回归任务带来的收益。当然这种做法要求标注规范和模型评估方式都要跟着调整。如果评估必须用分类准确率回归得分也要通过阈值转回类别再算指标不能直接用 MSE 向业务汇报否则容易对不上业务方的预期。5. 多任务模型里的“同一滴血”分类头与回归头为什么总是一起出现5.1 目标检测里的跨界同时输出类别和坐标偏移热词里有一条“ue 坐标轴回归物体中心的方法”这条词本身挺技术流的但恰好可以带出一个非常能说明问题的领域目标检测。以 Faster R-CNN 为例。这个模型同时完成两件事判断框里是什么物体这是一个分类任务。预测修正后的边界框坐标偏移量这是一个回归任务。这两个任务共用一个 backbone 和 RPN 网络只在最后的输出层分叉成两个头。模型训练时总损失是分类损失和回归损失的加权和。这种现象在深度学习里叫多任务学习。多任务学习之所以有效本质上是因为分类和回归底层的特征表示是共享的。一个区域是猫还是狗和它的边界框往左偏几个像素这两个问题都依赖于同一个特征提取器对图像内容的抽象理解。如果分类和回归之间的边界真的像教科书里那样泾渭分明共享参数的多任务模型就不会有这么大的效果提升。5.2 视频动作分类里的连续分数与离散标签热词里还有一条“ucf101 数据集实战如何用 pytorch 提升视频动作分类准确率”。UCF101 是视频动作识别领域最经典的分类数据集之一。但即便在这样标准的分类任务里模型内部也有大量的连续化操作。一个视频动作分类模型通常会对每个动作类别输出一个“行动分数”或概率。动作之间有相似性比如“打高尔夫”和“挥棒球棍”动作接近模型输出的分数向量里这两个类别的概率往往都比较高。这种类别间的模糊性说明分类边界即使在一个标注明确的数据集里也有连续过渡带的影子。工程上有一种做法叫“标签平滑”把 one-hot 的 0/1 标签替换成平滑后的软标签比如正类 0.9、负类 0.05。这么做本质上是在告诉模型别把分类边界学得太硬留一点连续的空间。这个技巧在视频分类、图片分类里都被验证能提升泛化能力它是人们在“分类任务必须输出离散标签”的教条之外主动引入回归式思维的典型操作。5.3 开集分类率分类永远面临“未知”的回归式妥协热词里的“oscr 开集分类率”是一个相对小众但很值得聊的概念。传统分类叫闭集分类训练集和测试集的类别完全一致模型只需要区分已知类别。但真实世界不是这样的摄像头拍到的东西、工控系统里出现的日志模式、社交平台上的新话题都可能不属于训练集里的任何一类。开集分类要做的就是让模型既能识别已知类别又能对未知样本说“我不认识”。这里的关键问题是怎么判断一个样本属于已知类别还是未知类别主流做法不是让模型多输出一个“未知”类而是利用分类模型输出的置信度分数——如果最大概率只有 0.3那这个样本很可疑。这不就是回归思维吗用一个连续分数做阈值化判断。分类任务的终点在开集场景下被重新引回到回归的框架里。所以你看分类和回归这个边界不仅在模型训练层面模糊在评测指标层面也存在一个“打分再切阈值”的统一范式。6. 落地的取舍遇到一个新问题到底按分类做还是按回归做6.1 三种强特征分清任务的真实需求聊了这么多理论和案例最后回到最务实的问题我接到一个新需求怎么判断该按分类做还是按回归做我自己的经验主要看三个维度第一**业务要什么输出。**如果业务方说“我要知道这个人买还是不买”那就按分类做如果他们说“我要给每个用户算一个购买意愿分数然后按分数从上到下排”这本质是回归或排序需求你要优先保证分数的单调性和分辨力。第二**标签本身的性质。**如果标签是离散的、无顺序的比如图片类别、故障类型那就老老实实做分类。如果标签是一个连续量比如金额、时长、距离分类只在你有明确分箱需求和业务解释需求时才值得考虑。第三**评估指标和交付形式。**分类任务里大家习惯看准确率、召回率、F1、AUC回归任务里习惯看 R2、MAE、RMSE。如果你发现团队讨论的时候业务方更关心“分错哪一类”说明你在交付时要准备分类维度如果更关心“预测得偏多少”那说明回归维度更贴合需求。热词里“tensorflow 回归模型 r2 系数”“lasso 回归”“岭回归”被大量检索说明很多人都在用回归模型做预测但 R2 到底什么时候用、什么时候不能用却很少有人讲清楚。R2 高不代表模型好它只说明模型解释了目标方差的比例在业务波动本身很大的场景下R2 可能一直上不去但模型的排序能力其实已经够用了。那时就不必死磕 R2可以把预测分数当成排序工具去看分组后的人群是否真的呈现梯度差异——这又回到了“连续分数优先”的思路。6.2 一个项目里的两阶段验证法先按回归验证再按分类交付如果实在拿不准我推荐一个我自己常用的两阶段验证法。第一阶段先把问题当成回归问题做一轮快速探索。不管标签原来是 0/1 还是连续值都先看特征和标签的相关性、分布形态、可预测性。0/1 标签在这种探索里也能当连续值用你可以看预测分数的分布是否能把正负两类拉开。第二阶段根据探索结果决定交付形式。如果正负样本的分数分布分得很开分类边界清晰那就做二分类交付如果两个分布叠得厉害更可能是分数界限天然模糊那么就算硬做分类线上的表现也不会太好反而应该把连续分数作为主交付物让业务方自己定阈值。这个方法谈不上多高深但它有一个好处它强迫你先想清楚问题背后的数学结构而不是一上来就套一个“这是分类问题”的帽子。很多时候分类和回归的选择不是靠理论推出来的而是靠数据本身告诉你哪一个更贴近现实。6.3 关于阈值、校准和一些不成文的习惯最后补三个实际经验一是阈值校准永远在模型训练之后做。不要先定阈值再训练模型阈值是后验的最优决策应该根据验证集上的代价分析来选。二是分类模型的概率分数如果有偏移别急着加特征或调参先检查一下分布漂移。线上数据和训练数据分布不一致时所有概率分数都会失真这跟模型本身没关系。三是不要迷信算法名。热词里“支持向量回归”“Lasso 回归”“岭回归”“逻辑回归”这些名字混在一起时真正重要的不是它叫回归还是分类而是它输出的东西能不能直接满足业务需求。名字只是命名任务才是本质。我自己做了这么多年模型最大的体会是教科书把分类和回归分开讲是为了教学方便给新手一个清晰的起点。可一旦进了真实业务所有任务都会回到同一个底层逻辑我们都是在学一个从输入到输出的映射然后根据业务需要决定怎么解读这个输出——切成离散的类别也好保留连续的数值也好。把这一层想透了就不会再被“分类还是回归”这个问题困住设计模型时的自由度也会大很多。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门