人工智能之核心基础 机器学习
第三章 线性回归与逻辑回归
文章目录
- [人工智能之核心基础 机器学习](#人工智能之核心基础 机器学习)
- [3.1 线性回归(Linear Regression)](#3.1 线性回归(Linear Regression))
- [📌 模型原理:用一条"直线"预测数值](#📌 模型原理:用一条“直线”预测数值)
- [🔧 假设函数(Hypothesis Function)](#🔧 假设函数(Hypothesis Function))
- [⚖️ 损失函数:平方损失(Mean Squared Error, MSE)](#⚖️ 损失函数:平方损失(Mean Squared Error, MSE))
- [🔍 参数求解方法](#🔍 参数求解方法)
- [方法1:正规方程(Normal Equation)](#方法1:正规方程(Normal Equation))
- [方法2:梯度下降(Gradient Descent)](#方法2:梯度下降(Gradient Descent))
- [🧪 Python代码实现(Scikit-learn)](#🧪 Python代码实现(Scikit-learn))
- [3.2 线性回归的优化与正则化](#3.2 线性回归的优化与正则化)
- [⚠️ 问题:多重共线性(Multicollinearity)](#⚠️ 问题:多重共线性(Multicollinearity))
- [🔒 L2正则化:Ridge回归](#🔒 L2正则化:Ridge回归)
- [🔪 L1正则化:Lasso回归](#🔪 L1正则化:Lasso回归)
- [🧪 正则化代码对比](#🧪 正则化代码对比)
- [3.3 逻辑回归(Logistic Regression)](#3.3 逻辑回归(Logistic Regression))
- [📌 模型原理:把线性回归"掰弯"成概率](#📌 模型原理:把线性回归“掰弯”成概率)
- [⚖️ 损失函数:交叉熵损失(Cross-Entropy Loss)](#⚖️ 损失函数:交叉熵损失(Cross-Entropy Loss))
- [🧪 逻辑回归代码(垃圾邮件识别)](#🧪 逻辑回归代码(垃圾邮件识别))
- [3.4 逻辑回归的扩展:多分类](#3.4 逻辑回归的扩展:多分类)
- 方法1:One-vs-Rest(OvR)
- [方法2:Softmax 回归(多项逻辑回归)](#方法2:Softmax 回归(多项逻辑回归))
- [3.5 实战案例总结](#3.5 实战案例总结)
- [🎯 本章要点回顾](#🎯 本章要点回顾)
- 资料关注
3.1 线性回归(Linear Regression)
📌 模型原理:用一条"直线"预测数值
目标 :根据输入特征(如房屋面积、房间数)预测一个连续值(如房价)。
✅ 核心思想 :假设输出和输入之间存在线性关系
例如:房价 ≈ 面积 × 权重 + 房间数 × 权重 + 偏置
🔧 假设函数(Hypothesis Function)
对于有 n n n 个特征的样本,模型形式为:
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ + θ n x n h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \dots + \theta_n x_n hθ(x)=θ0+θ1x1+θ2x2+⋯+θnxn
- x i x_i xi:第 i i i 个特征(如面积)
- θ i \theta_i θi:对应的权重(模型要学的参数)
- θ 0 \theta_0 θ0:偏置项(截距)
向量形式更简洁:
h θ ( x ) = θ T x h_\theta(x) = \theta^T x hθ(x)=θTx
💡 通俗理解:就像做菜------每个食材(特征)放多少(权重),最后味道(预测值)就出来了。
⚖️ 损失函数:平方损失(Mean Squared Error, MSE)
我们希望预测值越接近真实值越好。于是定义损失函数衡量误差:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
- m m m:样本数量
- y ( i ) y^{(i)} y(i):第 i i i 个样本的真实值
- 平方 → 惩罚大误差;除以 2 m 2m 2m → 方便求导
🎯 目标:找到一组 θ \theta θ,让 J ( θ ) J(\theta) J(θ) 最小
🔍 参数求解方法
方法1:正规方程(Normal Equation)
直接解出最优参数:
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)−1XTy
✅ 优点:一步到位,无需迭代
❌ 缺点:当特征很多(>10,000)时,矩阵求逆太慢甚至不可行
方法2:梯度下降(Gradient Descent)
像下山一样,一步步调整参数,使损失变小:
θ j : = θ j − α ∂ J ( θ ) ∂ θ j \theta_j := \theta_j - \alpha \frac{\partial J(\theta)}{\partial \theta_j} θj:=θj−α∂θj∂J(θ)
其中:
- α \alpha α:学习率(步长)
- 偏导数: ∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} ∂θj∂J(θ)=m1∑i=1m(hθ(x(i))−y(i))xj(i)
✅ 优点:适合大规模数据
❌ 缺点:需要调学习率,可能陷入局部最小(但MSE是凸函数,无此问题)
🧪 Python代码实现(Scikit-learn)
python
# 线性回归:房价预测示例
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import pandas as pd
# 加载数据(以波士顿房价为例,注意:新版sklearn已移除,可用California Housing)
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()
X, y = data.data, data.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练模型
model = LinearRegression()
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 评估
print("R²:", r2_score(y_test, y_pred))
print("RMSE:", mean_squared_error(y_test, y_pred, squared=False))
3.2 线性回归的优化与正则化
⚠️ 问题:多重共线性(Multicollinearity)
当两个或多个特征高度相关(如"房屋面积"和"房间数"),会导致:
- 参数估计不稳定(微小数据变化 → 权重剧烈波动)
- 模型泛化能力差
🛠️ 解决方案:正则化(Regularization)------给损失函数加"惩罚项"
🔒 L2正则化:Ridge回归
在损失函数中加入权重的平方和:
J ( θ ) = MSE + α ∑ j = 1 n θ j 2 J(\theta) = \text{MSE} + \alpha \sum_{j=1}^n \theta_j^2 J(θ)=MSE+αj=1∑nθj2
- α \alpha α 越大,权重越小 → 模型更简单(防过拟合)
- 所有权重都会被缩小,但不会变为0
✅ 适合特征都重要但怕过拟合的场景
🔪 L1正则化:Lasso回归
加入权重的绝对值之和:
J ( θ ) = MSE + α ∑ j = 1 n ∣ θ j ∣ J(\theta) = \text{MSE} + \alpha \sum_{j=1}^n |\theta_j| J(θ)=MSE+αj=1∑n∣θj∣
- 特点:能将不重要的特征权重压缩到0 → 自动特征选择
- 适合高维稀疏数据(如文本)
🧪 正则化代码对比
python
from sklearn.linear_model import Ridge, Lasso
# Ridge 回归
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print("Ridge R²:", r2_score(y_test, ridge.predict(X_test)))
# Lasso 回归
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)
print("Lasso R²:", r2_score(y_test, lasso.predict(X_test)))
# 查看哪些特征被Lasso"淘汰"了(权重为0)
print("非零特征数:", sum(lasso.coef_ != 0))
3.3 逻辑回归(Logistic Regression)
❗ 注意:虽然叫"回归",但它是分类算法 !主要用于二分类
📌 模型原理:把线性回归"掰弯"成概率
线性回归输出任意实数,但分类需要输出 0 或 1 。
→ 引入 Sigmoid 函数,把线性输出映射到 (0,1) 区间:
h θ ( x ) = σ ( θ T x ) = 1 1 + e − θ T x h_\theta(x) = \sigma(\theta^T x) = \frac{1}{1 + e^{-\theta^T x}} hθ(x)=σ(θTx)=1+e−θTx1
-
输出可解释为:属于正类的概率
-
若 h θ ( x ) > 0.5 h_\theta(x) > 0.5 hθ(x)>0.5 → 预测为 1;否则为 0

图:Sigmoid函数将任意实数压缩到0~1之间
⚖️ 损失函数:交叉熵损失(Cross-Entropy Loss)
不能用平方损失!因为:
- 分类问题不是连续值
- 平方损失在逻辑回归中是非凸的,梯度下降可能卡住
正确损失函数(对单个样本):
Loss = { − log ( h θ ( x ) ) if y = 1 − log ( 1 − h θ ( x ) ) if y = 0 \text{Loss} = \begin{cases} -\log(h_\theta(x)) & \text{if } y = 1 \\ -\log(1 - h_\theta(x)) & \text{if } y = 0 \end{cases} Loss={−log(hθ(x))−log(1−hθ(x))if y=1if y=0
合并写法:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log h_\theta(x^{(i)}) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
✅ 这个函数是凸函数,梯度下降能保证找到全局最优!
🧪 逻辑回归代码(垃圾邮件识别)
python
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
import pandas as pd
# 示例数据(实际可用SMS Spam Collection数据集)
data = [
("Free money!!!", 1),
("Hey, how are you?", 0),
("Win a million dollars!", 1),
("Meeting at 3pm", 0)
]
df = pd.DataFrame(data, columns=["text", "label"])
# 构建文本处理 + 逻辑回归管道
pipeline = Pipeline([
('tfidf', TfidfVectorizer()),
('clf', LogisticRegression())
])
X = df['text']
y = df['label']
# 训练
pipeline.fit(X, y)
# 预测
preds = pipeline.predict(["Congratulations! You won!"])
print("预测结果:", "垃圾邮件" if preds[0] == 1 else "正常邮件")
3.4 逻辑回归的扩展:多分类
逻辑回归天生只能做二分类,但可通过以下策略扩展:
方法1:One-vs-Rest(OvR)
- 对每个类别 k k k,训练一个二分类器:类别 k k k vs 其他所有类别
- 预测时,选概率最高的类别
✅ Scikit-learn 默认使用 OvR
方法2:Softmax 回归(多项逻辑回归)
- 直接输出 K 个类别的概率分布
- 损失函数用多类交叉熵
📌 在
LogisticRegression中设置multi_class='multinomial'即可启用 Softmax
python
# 多分类示例(鸢尾花)
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(multi_class='multinomial', solver='lbfgs')
clf.fit(X, y)
print("预测类别:", clf.predict([[5.1, 3.5, 1.4, 0.2]])) # 输出: [0]
3.5 实战案例总结
| 任务 | 模型 | 数据特点 | 关键指标 |
|---|---|---|---|
| 房价预测 | 线性回归 / Ridge / Lasso | 连续目标值,数值特征 | R², RMSE |
| 疾病诊断(是否患病) | 逻辑回归 | 二分类,医疗指标 | 准确率、召回率(别漏诊!) |
| 垃圾邮件识别 | 逻辑回归 + TF-IDF | 文本分类 | 精确率、F1值 |
🎯 本章要点回顾
- 线性回归:预测连续值,用平方损失,可用正规方程或梯度下降求解
- 正则化:Ridge(L2)防过拟合,Lasso(L1)还能自动选特征
- 逻辑回归:用 Sigmoid 把线性输出转为概率,用交叉熵损失做二分类
- 多分类:通过 One-vs-Rest 或 Softmax 扩展
- 代码核心 :Scikit-learn 的
LinearRegression,Ridge,Lasso,LogisticRegression一行搞定!
💡 建议:先掌握线性/逻辑回归的直觉和代码,再深入数学细节。它们是理解更复杂模型(如神经网络)的基石!
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》