
小白python入门 - 68. 分类入门0. 写给同学的话前两课解决了「地图」和「怎么干净地喂数据」。这一课进入监督学习里最常见的一类问题分类——预测样本属于哪个类别。我们用两个好懂的算法开胃k 近邻kNN看最近的 k 个邻居怎么投票逻辑回归Logistic Regression名字带「回归」干的却是分类核心是sigmoid把分数压成 0~1 的概率感然后重点学怎么评价分类模型混淆矩阵、精确率、召回率、F1以及「准确率 99% 也可能是垃圾」的陷阱。项目说明本节目标理解 kNN 投票与逻辑回归 sigmoid会读混淆矩阵与 P/R/F1会对比两种模型的 sklearn 代码学完能干什么完成二分类小实验并会用比 accuracy 更完整的指标汇报预计时间阅读 45–70 分钟敲代码 40–50 分钟前置66 划分与 fit67 Pipeline/缩放kNN 强烈建议缩放1. 生活里的例子 / 背景1.1 分类问题长什么样问题类别例子备注邮件是否垃圾是 / 否二分类肿瘤良恶性良性 / 恶性二分类错判代价不对称手写数字0–9多分类课程满意度差 / 中 / 好多分类有时当有序回归 vs 分类再钉一次问「是多少」→ 回归下一课问「是哪一类」→ 分类本课1.2 kNN 的生活版近朱者赤你搬进一个新宿舍楼想猜「隔壁同学爱不爱打篮球」。你观察住得最近的 5 个人里4 个每周打球 → 你猜他也爱打。这就是k 近邻不先学一个复杂公式而是临时查邻居。1.3 逻辑回归的生活版把「倾向分」压成概率老师根据出勤、作业给一个「挂科风险分」分数越高越危险。但业务要的是「挂科概率 0~1」好设定阈值比如 0.5 预警。sigmoid曲线像一个软开关把任意实数压到 (0,1) 之间。1.4 为什么准确率会骗人1000 封邮件里只有 10 封垃圾。模型永远预测「正常」正确 990 封 → 准确率 99%但垃圾一封没抓到 → 对反垃圾系统毫无用处所以分类一定要会看混淆矩阵和精确率/召回率。2. 核心概念白话 表格 相关图2.1 k 近邻k-Nearest Neighbors要点大白话思想新样本的类别 ≈ 特征空间里最近的 k 个训练样本的多数类k看几个邻居k 太小易噪声k 太大易糊成「随大流」距离常用欧氏距离特征量纲差大时必须先缩放见 67 课懒惰学习训练几乎只是「记住数据」计算主要在预测时优点好懂、能做非线性边界、超参少。缺点样本多时预测慢高维距离失效对无关特征和缩放敏感。黑话决策边界平面/空间里「判成 A 还是 B」的分界线超参数不能靠 fit 直接学、要你指定的数如 k2.2 逻辑回归其实是分类器名字历史原因带 Regression任务是分类。核心两步二分类先算线性分(z w_1 x_1 w_2 x_2 \cdots b)再用sigmoid压到 (0,1)(\sigma(z) \dfrac{1}{1e^{-z}})z 很大正σ(z) 接近 1模型更倾向正类z0σ0.5中间地带z 很大负σ 接近 0更倾向负类默认常把概率 ≥ 0.5 判为正类阈值可按业务改。对比kNN逻辑回归在学什么几乎存数据 距离投票学一组权重 w 和偏置 b输出类别也可看邻居比例自然带概率感缩放通常需要建议做便于收敛与解释可解释弱「因为邻居这样」相对强特征权重方向数据很大预测可能慢通常更快2.3 混淆矩阵Confusion Matrix以二分类、正类「有病/是垃圾/会流失」为例预测负预测正真实负TN 真负FP 假正误报真实正FN 假负漏报TP 真正符号英文大白话TPTrue Positive真有问题也抓对了TNTrue Negative真没事也放对了FPFalse Positive没事却报警狼来了FNFalse Negative有事却漏了漏诊2.4 精确率、召回率、F1、准确率用 TP/FP/FN 定义先抓直觉公式为辅指标公式直觉大白话在意谁准确率 Accuracy全体对的比例整体蒙对多少类别均衡时还行精确率 PrecisionTP / (TPFP)你报「正」的里面有多少真是正讨厌误报时召回率 RecallTP / (TPFN)所有真正的正里抓回多少讨厌漏报时F1精确率与召回的调和平均两者平衡的一个分数综合看业务口诀垃圾邮件有时宁可多进垃圾箱召回高或宁可少误杀精确高——产品定癌症筛查通常更怕FN 漏诊→ 重视召回广告投放「高意向」更怕FP 浪费预算→ 重视精确2.5 准确率陷阱再强调场景瞎猜策略Accuracy是否有用99% 负类全猜负~99%常没用均衡 50/50全猜一类~50%基线参考汇报建议至少同时给混淆矩阵 precision/recall/F1类别不均衡时优先看后者或使用class_weight、重采样等后文进阶。3. 算法 / 流程用图说清楚3.1 kNN 预测一步步1. 准备训练集已缩放重要 2. 来一个新点 x 3. 算 x 到所有训练点的距离 4. 取最近的 k 个点 5. 看这 k 个点的标签多数表决 → 预测类别 也可看各类占比当「软」结果3.2 逻辑回归训练与预测直觉版训练 反复调整 w, b 让「预测概率」更贴近真实标签 内部用优化算法本课不展开公式推导 预测 z w·x b p sigmoid(z) 若 p 阈值默认 0.5→ 正类否则负类3.3 本课实验总流程加载二分类数据乳腺癌 → train_test_split分层 stratify → Pipeline(StandardScaler 模型) → fit 训练集 → 测试集accuracy / 混淆矩阵 / classification_report → 对比 kNN vs 逻辑回归4. 手把手环境与代码4.1 安装pipinstall-Uscikit-learn pandas numpy4.2 数据乳腺癌二分类sklearn 自带特征是细胞核相关测量值标签恶性/良性。仅作教学不能当真实医疗结论。fromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.pipelineimportPipelinefromsklearn.neighborsimportKNeighborsClassifierfromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimport(accuracy_score,confusion_matrix,classification_report,precision_score,recall_score,f1_score,)dataload_breast_cancer()X,ydata.data,data.targetprint(特征维度:,X.shape)print(类别:,list(zip([0,1],data.target_names)))print(各类数量:,{data.target_names[i]:int((yi).sum())foriin[0,1]})X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.25,random_state42,stratifyy)预期输出形态形状约(569, 30)两类名称与计数恶性/良性数量不完全相等。stratifyy分层抽样让训练/测试里正负比例接近总体避免「测试集碰巧几乎全是一类」。4.3 kNN 完整评估pipe_knnPipeline([(scaler,StandardScaler()),(clf,KNeighborsClassifier(n_neighbors5)),])pipe_knn.fit(X_train,y_train)pred_knnpipe_knn.predict(X_test)print( kNN )print(Accuracy:,round(accuracy_score(y_test,pred_knn),4))print(Confusion matrix:\n,confusion_matrix(y_test,pred_knn))print(classification_report(y_test,pred_knn,target_namesdata.target_names))预期Accuracy 通常较高玩具数据混淆矩阵 2×2report 里有 precision/recall/f1。读矩阵confusion_matrix默认行真实、列预测与 sklearn 文档一致。先确认再解读 TP/FP。4.4 逻辑回归完整评估 概率pipe_lrPipeline([(scaler,StandardScaler()),(clf,LogisticRegression(max_iter5000)),])pipe_lr.fit(X_train,y_train)pred_lrpipe_lr.predict(X_test)proba_lrpipe_lr.predict_proba(X_test)[:,1]# 正类概率print( Logistic Regression )print(Accuracy:,round(accuracy_score(y_test,pred_lr),4))print(Confusion matrix:\n,confusion_matrix(y_test,pred_lr))print(classification_report(y_test,pred_lr,target_namesdata.target_names))print(前 5 个样本的正类概率:,[round(p,3)forpinproba_lr[:5]])print(前 5 个预测标签:,pred_lr[:5])print(前 5 个真实标签:,y_test[:5])预期概率是 0~1 小数阈值 0.5 时概率高的对应预测 1。4.5 并排对比同一划分、同一套指标defsummarize(name,y_true,y_pred,pos_label1):print(f\n{name})print( acc ,round(accuracy_score(y_true,y_pred),4))print( precision ,round(precision_score(y_true,y_pred,pos_labelpos_label),4))print( recall ,round(recall_score(y_true,y_pred,pos_labelpos_label),4))print( f1 ,round(f1_score(y_true,y_pred,pos_labelpos_label),4))print( cm \n,confusion_matrix(y_true,y_pred))summarize(kNN k5,y_test,pred_knn)summarize(LogReg,y_test,pred_lr)怎么读结果不必纠结谁高 0.01关注流程是否正确、指标是否全面。换random_state或 k名次可能对调。4.6 改 k 看趋势小实验forkin[1,3,5,15,33]:pipePipeline([(scaler,StandardScaler()),(clf,KNeighborsClassifier(n_neighborsk)),])pipe.fit(X_train,y_train)accaccuracy_score(y_test,pipe.predict(X_test))print(fk{k:2d}test_acc{acc:.4f})预期趋势直觉k1 可能波动大k 过大可能变钝。具体数字自己跑。4.7 准确率陷阱人造不均衡数据importnumpyasnpfromsklearn.dummyimportDummyClassifier rngnp.random.RandomState(0)n1000# 95% 为类别 0y_imbal(rng.rand(n)0.95).astype(int)X_imbalrng.randn(n,5)Xtr,Xte,ytr,ytetrain_test_split(X_imbal,y_imbal,test_size0.3,random_state0,stratifyy_imbal)dummyDummyClassifier(strategymost_frequent)dummy.fit(Xtr,ytr)pred_ddummy.predict(Xte)print(多数类瞎猜 Accuracy:,round(accuracy_score(yte,pred_d),4))print(混淆矩阵:\n,confusion_matrix(yte,pred_d))print(classification_report(yte,pred_d,zero_division0))预期Accuracy 可以很高但少数类 recall 经常是 0。这就是「准确率陷阱」的数字版。4.8 阈值不是只能 0.5开拓视野# 以逻辑回归概率为例把阈值改成 0.3更易判成正类 → 召回往往升、精确往往降thr0.3pred_thr(proba_lrthr).astype(int)print(f阈值{thr})print(classification_report(y_test,pred_thr,target_namesdata.target_names))业务若更怕漏报可降低正类阈值在验证集上选不要只在测试集上反复抠——71 课再系统讲。5. 常见坑大白话坑现象正确直觉kNN 不缩放距离被大数值特征绑架Pipeline 加StandardScaler只报 Accuracy不均衡时自我感觉良好看 cm P/R/F1搞反 precision/recall和业务对着干精确报得准召回抓得全混淆矩阵行列搞反故事讲反先查文档行真实、列预测逻辑回归没max_iter够收敛警告加大max_iter或先缩放把逻辑回归当「因果解释」权重当因果相关预测 ≠ 因果测试集上疯狂调 k/阈值测试分泄漏式虚高验证集或交叉验证71多分类仍用二分类口径乱讲指标对不上多分类看 macro/weighted 等平均方式医疗/金融直接上线玩具模型伦理与合规风险教学数据 ≠ 生产决策6. 对照表、小结6.1 算法速查kNN逻辑回归核心邻居投票线性分 sigmoid关键超参k、距离正则强度 C 等后文概率间接predict_proba自然缩放重要建议6.2 指标速查指标一句话Accuracy总体对了多少Precision报正里有多少真对Recall真正当中抓回多少F1精确与召回的平衡混淆矩阵TP/FP/FN/TN 一张表看清6.3 本节三句话分类猜「哪一类」kNN 靠邻居逻辑回归靠加权分 sigmoid。类别不均衡时准确率可以很好看却没用。汇报请带上混淆矩阵和 precision/recall/F1并对齐业务更怕误报还是漏报。7. 小练笔由易到难题 1用食堂例子解释 k1 和 k9 可能有什么不同邻居太少 vs 太多。题 2sigmoid 输入从 -10 变到 10输出大概从什么范围变到什么范围是否可能等于 0 或 1题 3某混淆矩阵TP40, FP10, FN20, TN930。手算 Accuracy、Precision、Recall正类。体会准确率为何仍可能「看起来不错」。题 4代码在乳腺癌数据上比较n_neighbors1与n_neighbors25的测试 F1并打印两张混淆矩阵。题 5反垃圾邮件系统领导说「不能漏掉垃圾邮件」产品说「千万别把重要邮件丢进垃圾箱」。更该优先盯 precision 还是 recall两者冲突时你怎么跟领导用混淆矩阵沟通参考思路1 k1 跟最近点走噪点敏感k9 更平滑但可能模糊。2 从接近 0 到接近 1一般达不到绝对 0/1。3 Acc(40930)/10000.97P40/500.8R40/60≈0.67。4 自跑。5 不漏 → 重视召回不误杀 → 重视精确用 FP/FN 代价谈阈值。8. 下一课预告69. 回归入门分类问「是哪一类」回归问「是多少」。下一课用线性回归预测连续值认识 MAE/RMSE/R²并初步碰到多项式过拟合与 Ridge/Lasso 正则化——和 66 课的过拟合地图对上号。引用与参考scikit-learn 监督学习总览https://scikit-learn.org/stable/supervised_learning.htmlKNeighborsClassifierhttps://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.htmlLogisticRegressionhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html分类指标https://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics混淆矩阵https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.htmlBreast cancer 数据集https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.htmlWikipedia - k-nearest neighbors algorithmhttps://en.wikipedia.org/wiki/K-nearest_neighbors_algorithmWikipedia - Logistic regressionhttps://en.wikipedia.org/wiki/Logistic_regressionGoogle MLCC - 分类https://developers.google.com/machine-learning/crash-course/classification再讲一个完整小故事指标怎么选学校心理中心做一个粗筛问卷分数预测「是否需要人工回访」。若召回率低真正需要帮助的人被漏掉 → 风险大。若精确率低大量健康同学被误报 → 人工忙不过来同学也被吓到。这时你不会只说「准确率 95% 真棒」而会问漏掉一个代价是什么误报一个代价是什么默认阈值 0.5 要不要调低一点宁可多回访分类课的毕业标准你会看混淆矩阵会用大白话解释精确率/召回率会在业务场景里做取舍——而不是只会打印 accuracy。课堂讨论题可分组 10 分钟如果老板只要一个数字「准确率」你怎么用两分钟说服他看混淆矩阵数据只有 80 条你还上机器学习吗为什么你更愿意维护100 条清晰业务规则还是一个 90 分但没人能解释的模型把讨论结论写在笔记里——比多抄 50 行 API 更接近真实工作。自我检测不看稿口头答我能不看笔记讲清本课最重要的一张图在说什么我能指出一段「错误代码」错在哪我能举一个生活例子对应本课任务类型我知道下一课大概要解决什么痛点全部打勾再进入下一课效率更高。附录给大一的 FAQ本课补充下面这些问题是第一次学本课内容时最容易卡住的地方。用白话再过一遍。Q1我是不是一定要背公式不必先背公式。你要先会讲故事输入是什么、输出是什么、模型在怕什么过拟合、泄漏、指标骗人。公式是为了精确表达故事故事通了公式只是翻译。Q2代码跑不通怎么办按这个顺序排查虚拟环境激活了吗提示符前有没有 .venv包装了吗python -c “import sklearn; print(sklearn.version)”报错最后一行是什么把Error 类型 最后一行记下来再搜路径、文件名、中文引号有没有混用仍不行换一个最小例子本课最前面的 10 行代码确认环境 OKQ3我和同学分数差很多是不是我很差不一定。可能是andom_state 不同、数据划分不同、指标不同、甚至泄漏导致虚高。先对齐评估协议再比分数。Q4这课和「人工智能 / ChatGPT」是什么关系ChatGPT 一类是很大的深度学习系统偏语言与对话。本课练的是表格/经典机器学习基本功分类、回归、评估、Pipeline。基本功会了你以后学深度学习或用大模型 API才知道自己在解决什么问题、如何公平比较。Q5我需要买 GPU 吗本阶段不需要。sklearn 在普通笔记本 CPU 上就够。GPU 主要是深度学习训练时才刚需。Q6作业要做到什么程度算合格最低标准能用自己的话讲清本课 3 个核心概念能跑通本课主线代码并看懂输出含义能指出至少 2 个常见坑小练笔完成一半以上鼓励全做Q7我想继续深入课外看什么优先官方文档对应章节见文末引用其次 ISLR 中文/英文入门章节。别一上来就啃很厚的证明书——容易劝退。本课概念速记卡可抄笔记本我用大白话怎么说对应术语用历史数据猜新情况机器学习 / 预测拿来学的那部分数据训练集假装是新客户的那部分测试集背答案背过头过拟合笨到学不会欠拟合偷看了考题数据泄漏步骤焊成一条龙Pipeline建议学习节奏时间做什么第 1 小时只读例子与图不写代码第 2 小时抄跑主线代码改一个参数观察变化第 3 小时做小练笔 写 5 句笔记之后隔一天不看稿子复述一遍记住大一阶段「讲清楚 跑得通 知道坑」比「一次记住全部 API」重要得多。