课程承诺1 个核心概念逻辑回归1 个核心思想概率预测与决策边界1 段完整分类项目代码。学完你能解决所有二分类问题彻底搞懂分类任务的评估体系亲手写出第一个实用的 AI 分类器。本节课目标从 预测连续值回归升级到 预测类别分类用逻辑回归实现一个能自动识别垃圾邮件的 AI理解为什么分类问题不能用线性回归以及如何正确评估分类模型的好坏。 先回答上一课的思考题除了正则化解决过拟合的方法还有增加训练数据量最根本的方法降低模型复杂度比如把 9 次多项式改成 3 次早停训练过程中当测试集误差开始上升时就停止训练集成学习多个弱模型组合成一个强模型比如随机森林L1 正则化Lasso和 L2 正则化Ridge的区别L2让所有参数都变小但不会变成 0L1会让很多不重要的参数直接变成 0自带特征选择功能 第一个核心概念逻辑回归Logistic Regression先澄清一个最大的误区逻辑回归不是回归算法是分类算法回归预测连续值房价、分数、温度分类预测离散类别是 / 不是垃圾邮件、是 / 不是癌症、猫 / 狗为什么不能用线性回归做分类我们用一个最简单的例子说明判断是不是垃圾邮件标签0 正常邮件1 垃圾邮件特征邮件中包含 免费 这个词的次数如果用线性回归我们会得到一条直线y w*x b当 x0 时y≈0.1 → 预测正常邮件当 x5 时y≈0.9 → 预测垃圾邮件看起来没问题但如果有一个极端的垃圾邮件包含了 100 个 免费线性回归会预测 y≈10 → 远远大于 1完全无法解释为概率核心问题线性回归的输出是 (-∞, ∞)而我们需要的是 [0,1] 之间的概率。 第一个核心思想Sigmoid 函数与概率预测神奇的 Sigmoid 函数我们需要一个 转换器把任意实数映射到 (0,1) 区间这个转换器就是Sigmoid 函数σ(z) 1 / (1 e^(-z))它的图像是一个完美的 S 形曲线当 z0 时σ(z)0.5当 z→∞时σ(z)→1当 z→-∞时σ(z)→0逻辑回归的完整公式先用线性回归计算出一个分数 zz w1*x1 w2*x2 ... b把 z 输入 Sigmoid 函数得到概率 pp σ(z)这个 p 就是 样本属于正类的概率决策边界有了概率之后我们就可以做预测了如果 p 0.5 → 预测为正类1垃圾邮件如果 p 0.5 → 预测为负类0正常邮件这个 0.5 就是我们的决策阈值它对应的那条线就叫决策边界。重要提示0.5 不是固定的我们可以根据业务需求调整阈值这是分类问题最灵活也最有价值的地方。 代码实战亲手写一个垃圾邮件分类器我们将训练一个 AI根据邮件中是否包含 5 个关键词自动判断是不是垃圾邮件。完整代码复制粘贴就能运行python运行import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, confusion_matrix, classification_report # 1. 准备数据集 # 特征[包含免费, 包含中奖, 包含点击, 包含领取, 包含紧急] # 1包含该词0不包含 X np.array([ [0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [0,0,1,0,0], [0,1,0,0,0], [1,0,0,0,0], [1,1,0,0,0], [1,0,1,0,0], [1,0,0,1,0], [1,1,1,0,0], [1,1,0,1,0], [1,1,1,1,0], [1,1,1,1,1], [0,1,1,1,1], [0,0,1,1,1], [0,0,0,1,1], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,0,0,0] ]) # 标签0正常邮件1垃圾邮件 y np.array([0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0]) # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 3. 创建并训练逻辑回归模型 model LogisticRegression() model.fit(X_train, y_train) # 4. 查看每个关键词的权重 print(各关键词对垃圾邮件的影响权重) keywords [免费, 中奖, 点击, 领取, 紧急] for word, coef in zip(keywords, model.coef_[0]): print(f{word}: {coef:.2f}) print(f截距{model.intercept_[0]:.2f}\n) # 5. 模型预测 y_pred model.predict(X_test) y_pred_proba model.predict_proba(X_test)[:, 1] # 得到是垃圾邮件的概率 # 6. 模型评估 print(*50) print(f模型准确率{accuracy_score(y_test, y_pred):.2f}) print(\n混淆矩阵) print(confusion_matrix(y_test, y_pred)) print(\n详细分类报告) print(classification_report(y_test, y_pred)) # 7. 测试新邮件 print(*50) test_emails [ [1,1,0,0,0], # 免费中奖快来参与 [0,0,0,0,0], # 明天下午开会 [1,0,0,1,1], # 免费领取紧急通知 [0,1,0,0,0] # 恭喜你中奖了 ] for i, email in enumerate(test_emails): prob model.predict_proba([email])[0][1] result 垃圾邮件 if prob 0.5 else 正常邮件 print(f测试邮件{i1}是垃圾邮件的概率{prob:.2f} → {result}) 逐行解读核心知识点1. 权重的意义你会看到类似这样的输出plaintext各关键词对垃圾邮件的影响权重 免费: 1.23 中奖: 1.15 点击: 0.98 领取: 0.87 紧急: 0.72 截距: -2.34权重越大说明这个词越能说明邮件是垃圾邮件免费 和 中奖 是垃圾邮件最明显的特征截距为负说明默认情况下一封邮件更可能是正常邮件2. 分类问题最重要的评估指标准确率Accuracy预测正确的样本占总样本的比例优点简单直观缺点在样本不平衡的情况下完全失效比如 1000 封邮件里只有 1 封垃圾邮件全预测为正常邮件准确率也有 99.9%混淆矩阵表格预测为正常预测为垃圾实际正常真阴性 (TN)假阳性 (FP)实际垃圾假阴性 (FN)真阳性 (TP)精确率Precision预测为垃圾邮件的邮件中真正是垃圾邮件的比例意义不误删正常邮件召回率Recall所有真正的垃圾邮件中被正确识别出来的比例意义不漏掉垃圾邮件黄金法则精确率和召回率是此消彼长的关系你永远不可能同时提高两者。垃圾邮件过滤优先保证精确率宁愿漏过垃圾邮件也不要误删正常邮件癌症诊断优先保证召回率宁愿误诊正常人也不要漏掉癌症患者3. 调整决策阈值这是本节课最有价值的技巧我们可以通过修改阈值来平衡精确率和召回率python运行# 把阈值从0.5改成0.3提高召回率不漏掉垃圾邮件 y_pred_low_threshold (y_pred_proba 0.3).astype(int) print(阈值0.3时的分类报告) print(classification_report(y_test, y_pred_low_threshold)) # 把阈值改成0.8提高精确率不误删正常邮件 y_pred_high_threshold (y_pred_proba 0.8).astype(int) print(阈值0.8时的分类报告) print(classification_report(y_test, y_pred_high_threshold))运行后你会清楚地看到阈值降低 → 召回率上升精确率下降阈值升高 → 精确率上升召回率下降✨ 神奇的实验可视化决策边界我们用两个特征来可视化逻辑回归的决策边界直观感受它是怎么划分两类数据的。python运行import matplotlib.pyplot as plt # 只用免费和中奖两个特征 X_2d X[:, :2] model_2d LogisticRegression() model_2d.fit(X_2d, y) # 生成网格点 x1_min, x1_max X_2d[:,0].min()-0.5, X_2d[:,0].max()0.5 x2_min, x2_max X_2d[:,1].min()-0.5, X_2d[:,1].max()0.5 xx1, xx2 np.meshgrid(np.arange(x1_min, x1_max, 0.02), np.arange(x2_min, x2_max, 0.02)) # 预测网格点的类别 Z model_2d.predict(np.c_[xx1.ravel(), xx2.ravel()]) Z Z.reshape(xx1.shape) # 画图 plt.figure(figsize(8,6)) plt.contourf(xx1, xx2, Z, alpha0.3, cmapplt.cm.Spectral) plt.scatter(X_2d[:,0], X_2d[:,1], cy, s100, edgecolorsk, cmapplt.cm.Spectral) plt.xlabel(包含免费) plt.ylabel(包含中奖) plt.title(逻辑回归决策边界) plt.show()你会看到一条直线把平面分成了两部分直线左边是正常邮件右边是垃圾邮件。这就是逻辑回归的线性决策边界。 本节课总结核心概念逻辑回归是二分类算法不是回归算法输出是样本属于正类的概率核心思想用 Sigmoid 函数把线性回归的输出映射到 (0,1) 区间通过决策阈值进行分类核心评估分类问题不能只用准确率要结合精确率和召回率根据业务需求调整决策阈值你已经做到了写出了第一个实用的 AI 分类器能根据业务需求优化模型性能 课后作业必须做运行上面的所有代码观察不同阈值下精确率和召回率的变化自己添加几个新的关键词和邮件样本重新训练模型看看效果思考如果有三个类别正常邮件、垃圾邮件、广告邮件逻辑回归怎么处理尝试用逻辑回归解决鸢尾花分类问题scikit-learn 自带的经典数据集