3.1 分类任务


文档摘要

3.1 分类任务 本节摘要:分类任务是监督学习里最常见的一类,目标是根据特征把样本归到预先定义的离散类别里,比如把邮件分成垃圾和正常、把图片分成猫和狗。本节从一段能直接跑的最小分类代码切入,讲清二分类、多分类、多标签三者的区别,再逐个拆解逻辑回归、SVM、决策树、随机森林的适用边界,最后落到怎么用精确率、召回率、F1、AUC 这些指标判断模型是不是真的好,而不是被准确率骗过去。 学习目标 阅读完本节,你应当能够: 写出一段完整的分类流程:切分数据、标准化、训练、预测、评估 说清二分类、多分类、多标签三者的区别,以及多分类常用的两种拆分策略 根据数据量、线性可分性和解释性需求,从几个主流算法里选一个合适的 用混淆矩阵算出精确率、召回率和 F1,而不是只盯准确率 理解 AUC-ROC

3.1 分类任务

本节摘要:分类任务是监督学习里最常见的一类,目标是根据特征把样本归到预先定义的离散类别里,比如把邮件分成垃圾和正常、把图片分成猫和狗。本节从一段能直接跑的最小分类代码切入,讲清二分类、多分类、多标签三者的区别,再逐个拆解逻辑回归、SVM、决策树、随机森林的适用边界,最后落到怎么用精确率、召回率、F1、AUC 这些指标判断模型是不是真的好,而不是被准确率骗过去。

学习目标

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

  1. 写出一段完整的分类流程:切分数据、标准化、训练、预测、评估
  2. 说清二分类、多分类、多标签三者的区别,以及多分类常用的两种拆分策略
  3. 根据数据量、线性可分性和解释性需求,从几个主流算法里选一个合适的
  4. 用混淆矩阵算出精确率、召回率和 F1,而不是只盯准确率
  5. 理解 AUC-ROC 为什么在类别不平衡时比准确率更可靠

一、先跑起来再说

分类这个词,讲一百遍不如写一遍。我们直接上一段能跑的最小例子,用鸢尾花数据集——它有 150 个样本、4 个特征、3 个类别,是分类任务里的"你好世界"。

from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) print(accuracy_score(y_test, model.predict(X_test)))

这段代码里藏着几个容易忽略的细节。stratify=y 让训练集和测试集里三个类别的比例保持一致——如果某个类别本来就少,随机切分可能把它整个切到一边去,评估结果就失真了。scaler.fit_transform 只在训练集上拟合,测试集只用 transform,这是防止数据泄露的底线。逻辑回归对特征尺度敏感,所以标准化这一步省不掉。

标准流程可以用一张图概括,它贯穿本章每一节:

二、二分类、多分类与多标签

分类任务按输出形态分三种,很多人把它们混着用,差别其实很大。

二分类最简单,输出只有两个值:是或否、正常或异常。多分类输出两个以上的互斥类别,一个样本只能属于其中一个,比如鸢尾花的三种。多标签则允许一个样本同时挂多个标签,一篇新闻可以同时属于财经和科技两个栏目。

多分类在实现上有个关键点:逻辑回归、SVM 这类模型天生是为二分类设计的,怎么处理三个以上的类别?两种策略。一种叫"一对多",为每个类别训练一个二分类器,把"这一类"和"其他所有类"分开,最后选得分最高的那个。另一种叫"一对一",两两配对训练,最后投票。样本多的时候一对多快,类别多的时候一对一更稳。Scikit-learn 里逻辑回归默认会自动处理,一般不用手动干预。

多标签是另一套玩法,常用的做法是把它拆成若干个二分类问题,或者用专门的算法。本节不展开,你只需要记住:它和"一个样本有多个候选类别但只选一个"不是一回事。

三、常用算法怎么选

算法选错了,后面调参都是白费劲。下面这张决策图按三个问题把几个主流分类器串起来:数据大不大、要不要解释性、特征是不是线性可分。

分类算法选择决策

分类算法选择决策

这张图是"第一反应"式的快速选型,不是铁律。下面把每个算法说透。

逻辑回归是线性模型的代表。名字带"回归",干的却是分类的活,输出的是样本属于某个类别的概率。好处是训练快、可解释——每个特征的系数直接告诉你它对预测的贡献方向和大小。代价是假设特征与结果之间是线性关系,遇到非线性边界就力不从心。

SVM 靠"最大间隔"找分界超平面,配合核函数能处理非线性问题。它在小样本、高维的场景特别能打,比如文本分类、基因表达数据。代价是训练慢,而且对参数 C 和核函数敏感,调参成本不低。

决策树把判断过程画成一棵树,每个节点问一个"特征大于某个值吗"的问题。它最大的价值是解释性强,一条路径从头走到尾就是一条规则,业务方看得懂。缺点是单棵树容易过拟合,对数据的小变化很敏感。

随机森林是决策树的集成版,种很多棵树投票。它把单棵树的方差压下去,通常准确率更高、更抗噪,代价是解释性下降、训练更慢。还有一个叫梯度提升的集成方法,用迭代纠错的方式把弱模型串成强模型,是很多竞赛的常客。

算法 训练速度 可解释性 适合场景
逻辑回归 强(看系数) 线性关系、需要概率输出
SVM 小样本高维、非线性
决策树 很强(看规则) 需要向业务解释
随机森林 追求准确率、抗噪

四、评估:别只看准确率

准确率是最直观的指标,但它会骗人。假设一个数据集里 99% 是正常样本、1% 是异常,模型什么都不干、把所有样本都判成正常,准确率也是 99%。这个模型毫无用处,分数却很好看。所以我们还需要精确率、召回率、F1 和 AUC。

先看混淆矩阵。它是一张两行两列的表,横轴是预测值,纵轴是真实值,四个格子分别记下真正例、假正例、真负例、假负例的数量。

预测为正 预测为负
真实为正 真正例 假负例
真实为负 假正例 真负例

精确率回答的是"预测为正的样本里,有多少是真的正"。召回率回答的是"真实为正的样本里,有多少被揪出来了"。这俩经常打架:你把判断标准放严,精确率上去、召回率下来;放松,反过来。F1 是两者的调和平均,用一个数同时兼顾两头。

AUC-ROC 是另一把尺子,它衡量模型把正负样本区分开的能力,跟具体阈值无关,因此在类别不平衡时更稳。AUC 越接近 1 越好,0.5 等于瞎猜。

from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score print(confusion_matrix(y_test, model.predict(X_test))) print(classification_report(y_test, model.predict(X_test)))

分类报告会给出每个类别的精确率、召回率、F1 和支持度,多分类时特别有用。AUC 一般只在二分类上用,多分类要么逐类算再平均,要么用宏观或微观平均。

五、工程实践要点

⚠️ 常见坑:评估前忘了标准化,或者标准化时用整个数据集去 fit,都会让分数失真。前者让逻辑回归和 SVM 表现差,后者把测试集信息泄露进训练,等于考试前偷看了答案。

⚠️ 常见坑:类别不平衡时只盯准确率。前面那个 99% 正常的例子,准确率毫无意义,要用精确率、召回率、F1 和 AUC 组合起来判断。

💡 关键直觉:对特征尺度敏感,是逻辑回归、SVM、KNN 这类距离或梯度模型的共性,树模型基本不受影响。所以决策树可以喂原始数据,逻辑回归必须先标准化。

💡 关键直觉:没有放之四海皆准的最优算法。数据集不同、目标不同,胜出的往往是不同模型。先跑一个简单基线比如逻辑回归,再逐步加复杂度,比一上来就上随机森林靠谱。

六、深入补充与常见问题

多分类的报告怎么读?分类报告里每个类别一行精确率、召回率、F1,最后还有宏平均和加权平均两行。宏平均给每个类别同样的权重,不看样本多少;加权平均按各类样本数加权。类别不平衡时这两行会差很多,读报告先看用的是哪种平均。

梯度提升树,比如 XGBoost、LightGBM 这类实现,在表格数据竞赛里常年霸榜。它的代价是调参空间大、训练慢,适合追求极致性能、能接受黑箱的场景。如果只是要一个能解释、能上线的模型,逻辑回归或决策树往往更划算。

逻辑回归输出的概率能当置信度吗

predict_proba 给出样本属于各类的概率,但逻辑回归本身不保证校准,这个数值不能严格当真实概率读。拿它排序、定阈值通常够用;要严格的概率估计,得再加一层校准。

类别不平衡怎么办

三个手段可以叠加。采样:对少数类过采样或对多数类欠采样。类别权重:很多分类器有 class_weight 参数,把少数类分错的代价调高。换指标:别用准确率,用精确率、召回率、F1、AUC。我的习惯是先换指标,再调权重,最后考虑采样。

默认阈值 0.5 一定对吗

predict 背后其实藏着一个默认动作:概率大于 0.5 就判为正类。这个 0.5 是写死的,不代表适合你的业务。分类错误的两头代价往往不对等——把垃圾邮件漏进收件箱,用户只是烦一下;把正常邮件挡进垃圾箱,可能耽误正事。后一种更贵,我们就该把阈值调低,宁可多拦、也要少漏。反过来,欺诈识别里误伤一个正常用户,客服成本可能比漏掉一笔小欺诈还高,阈值就该往上抬。调阈值不重新训练,只是换个切点,成本几乎为零,值得单独花点功夫。想看全貌就画精确率召回率曲线,观察曲线在哪个阈值附近明显拐弯;要落一个具体数字,就把两类错误按业务代价加权,取总代价最小的那个点。Scikit-learn 里用 predict_proba 拿到概率后自己切,或者对 decision_function 的分数做阈值搜索,都能落地。

KNN 和朴素贝叶斯什么时候用

KNN 简单直观,小样本低维可以当快速基线,但它对尺度敏感、预测阶段慢。朴素贝叶斯在文本分类里几乎是首选——特征独立的假设虽然天真,在高维稀疏的文本上反而很能打,训练极快,值得先试。

标准化一定要做吗

不是所有模型都要。树模型和随机森林对特征尺度不敏感,可以不做;逻辑回归、SVM、KNN 这类基于距离或梯度的模型必须做。拿不准就先做,标准化几乎不会有坏处,顶多白费一点算力。

混淆矩阵四个格子怎么记

横轴预测、纵轴真实,主对角线是判对的,副对角线是判错的。真正例和真负例在对角线上;假正例是把负的判成正,假负例是把正的判成负。记住"正例是少数派关心的那类",方向就不会乱。

分类流程里最容易漏哪一步

最容易漏的是标准化和分层切分。忘了标准化,线性模型和 SVM 直接变差;忘了分层切分,少数类可能在某个切分里消失。这两个都是"能跑但结果不可信"的隐性错误。

一句话总结选型

小样本高维上 SVM,要解释上决策树或逻辑回归,追求准确率且数据够多上随机森林或梯度提升。没把握就先跑逻辑回归当基线。

一节小结

  • 二分类与多分类与多标签:二分类两个值,多分类多个互斥类别,多标签可同时挂多个
  • 多分类拆分:一对多、一对一两种策略,各自适应不同样本和类别规模
  • 逻辑回归:线性、快、可解释、给概率,需标准化
  • SVM:小样本高维、非线性能力强,调参成本高
  • 决策树:解释性最强,易过拟合
  • 随机森林:集成投票,准确率与抗噪好,解释性弱
  • 评估指标:精确率、召回率、F1、AUC 各有分工,不平衡数据别只盯准确率

下一节我们把预测目标从离散类别换成连续数值,看看回归任务怎么挑模型、怎么读它的误差。


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