【吴恩达机器学习】监督学习:回归与分类
目录
(二)无监督学习(Unsupervised learning)
梯度下降的一种替代方法——正规方程(Normal Equation)
3.4.2 均值归一化(Mean normalization)
3.4.3 Z-分数归一化(Z - score normalization)
1 机器学习

监督学习与无监督学习
(一)监督学习(Supervised learning)
监督学习是在已知正确答案(标签)的数据集上进行训练的学习方式。其主要任务分为回归和分类。
回归:预测连续型数值。例如,根据房屋的各种特征(面积、房间数量等)预测房价,这里房价是一个连续的数值。

分类:预测离散型类别。比如,根据肿瘤的大小判断其是良性还是恶性,结果只有 “良性” 和 “恶性” 两种类别。

(二)无监督学习(Unsupervised learning)
无监督学习是在没有预先标注标签的数据集上进行学习。它旨在发现数据中的内在结构和模式。无监督学习不需要预先知道数据的类别,能够帮助我们从复杂的数据中挖掘出有价值的信息。
聚类:将相似的数据点归为一组,实现对数据的分类整理。在新闻领域,可把主题相同的新闻文章归在一起;在客户数据分析中,依据客户的特征和行为,划分不同的市场细分群体。
降维:用较少的数据表示原有数据,降低数据维度,去除冗余信息,在不损失关键信息的前提下简化数据,提升处理效率。
异常检测:找出数据集中与其他数据差异较大、不符合常规模式的异常点。在网络安全监测、设备故障检测等方面有重要应用,及时发现异常情况,保障系统正常运行。
2 一元线性回归(单变量线性回归)
2.1 线性回归模型
2.1.1 认识数据集

2.1.2 公式
通过训练数据集来调整 \(w\) 和 \(b\) 的值,使得模型能够尽可能准确地预测目标值。
2.2 成本函数(代价函数)
2.2.1 公式
成本函数衡量模型预测值与真实值的差距,目标是找到使成本最小的 w 和 b。
一个变量的成本方程式是:
m是数据集中的训练实例的数量
计算成本的函数如下:
def compute_cost(x, y, w, b):
"""
Computes the cost function for linear regression.
Args:
x (ndarray (m,)): Data, m examples
y (ndarray (m,)): target values
w,b (scalar) : model parameters
Returns
total_cost (float): The cost of using w,b as the parameters for linear regression
to fit the data points in x and y
"""
# number of training examples
m = x.shape[0] #通过x数组的形状获取训练样本的数量m
cost_sum = 0
for i in range(m):
f_wb = w * x[i] + b
cost = (f_wb - y[i]) ** 2
cost_sum = cost_sum + cost
total_cost = (1 / (2 * m)) * cost_sum
return total_cost
2.2.2 直观理解

2.3 梯度下降
2.3.1 原理
梯度下降通过迭代更新参数,逐步逼近成本函数的最小值:

2.3.2 直观理解

2.3.3 学习率


2.3.4 线性回归的梯度下降
梯度的定义为:
计算梯度公式:
def compute_gradient(x, y, w, b):
"""
Computes the gradient for linear regression
Args:
x (ndarray (m,)): Data, m examples
y (ndarray (m,)): target values
w,b (scalar) : model parameters
Returns
dj_dw (scalar): The gradient of the cost w.r.t. the parameters w
dj_db (scalar): The gradient of the cost w.r.t. the parameter b
"""
# Number of training examples
m = x.shape[0]
dj_dw = 0
dj_db = 0
for i in range(m):
f_wb = w * x[i] + b
dj_dw_i = (f_wb - y[i]) * x[i]
dj_db_i = f_wb - y[i]
dj_db += dj_db_i
dj_dw += dj_dw_i
dj_dw = dj_dw / m
dj_db = dj_db / m
return dj_dw, dj_db
3 多元线性回归 (多变量线性回归)
3.1 多变量的模型预测
3.1.1 多类特征

3.1.2 公式

3.2 用多个变量计算成本
有多个变量的成本方程式是:
其中
和
是支持多个特征的向量而不是标量。
def compute_cost(X, y, w, b):
"""
compute cost
Args:
X (ndarray (m,n)): Data, m examples with n features
y (ndarray (m,)) : target values
w (ndarray (n,)) : model parameters
b (scalar) : model parameter
Returns:
cost (scalar): cost
"""
m = X.shape[0]
cost = 0.0
for i in range(m):
f_wb_i = np.dot(X[i], w) + b #(n,)(n,) = 标量 (见 np.dot)
cost = cost + (f_wb_i - y[i])**2 #标量
cost = cost / (2 * m) #标量
return cost
3.3 多元线性回归的梯度下降
多变量的梯度下降:
其中,n是特征的数量
def compute_gradient(X, y, w, b):
"""
Computes the gradient for linear regression
Args:
X (ndarray (m,n)): Data, m examples with n features
y (ndarray (m,)) : target values
w (ndarray (n,)) : model parameters
b (scalar) : model parameter
Returns:
dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w.
dj_db (scalar): The gradient of the cost w.r.t. the parameter b.
"""
m,n = X.shape #(例子的数量,特征的数量)
dj_dw = np.zeros((n,)) #初始化 dj_dw 为一个长度为 n 的零向量,用于存储关于 w 的梯度
dj_db = 0. #初始化 dj_db 为 0.(浮点数),用于存储关于 b 的梯度
for i in range(m):
err = (np.dot(X[i], w) + b) - y[i]
for j in range(n):
dj_dw[j] = dj_dw[j] + err * X[i, j]
dj_db = dj_db + err
dj_dw = dj_dw / m
dj_db = dj_db / m
return dj_db, dj_dw
梯度下降的一种替代方法——正规方程(Normal Equation)
-
用途:
-
只适用于线性回归。
-
直接求解参数 w 和 b,无需迭代。
-
-
缺点:
-
不适用于其他学习算法。
-
当特征数量较大(超过10,000)时,计算速度较慢。
-

3.4 特征缩放
特征缩放,基本上是将每个特征除以一个用户选择的值,以导致-1和1之间的范围。


通过将特征缩放到同一尺度,可以显著提高梯度下降的收敛速度和稳定性,从而提高模型训练的效率和效果。
3.4.1 除以最大值

3.4.2 均值归一化(Mean normalization)

3.4.3 Z-分数归一化(Z - score normalization)

3.5 检查梯度下降是否收敛
3.5.1 观察学习曲线
绘制每次迭代后的损失函数值,观察曲线的变化趋势:
- 如果曲线持续下降且最终趋于平缓,则说明梯度下降正在收敛。
- 如果曲线在某一点之后不再显著下降,则说明可能已经收敛。
3.5.2 使用自动收敛测试
- 设定一个阈值 ϵ(epsilon,例如
)。
- 计算连续两次迭代之间的损失函数值差。
- 如果这个差值小于或等于 ϵ,则认为梯度下降已经收敛。

3.6 学习率的选择
一个正确实现梯度下降的调试技巧,以足够小的学习速度,成本函数应该在每一次迭代中降低。
如果梯度下降不起作用,通常将学习率设置为非常小,看看这是否会导致每次迭代的成本降低,如果J不会在每次迭代中减小,大概率就是代码出现了问题。

从小的值每次乘以三倍逐渐增加,找到最大合理值或比最大合理值略小的值。

3.7 特征工程
特征工程是利用直觉,通过对原始特征进行转换或组合来设计新特征的过程。

在该例子中,就是基于房屋面积的计算逻辑,将临街宽度和深度这两个原始特征组合成新的面积特征,以期望模型能够更好地捕捉数据中的信息,提升模型的性能。
3.8 多项式回归
多项式回归是一种用于描述和分析数据之间非线性关系的回归分析方法。它通过增加独立变量的幂次项,将原本可能不符合线性模型的数据拟合成一个多项式函数的形式。

特征缩放变得更加重要,需要将特征转换为可比的值的范围

4 逻辑回归 (logistic regression)
4.1 分类——逻辑回归
4.1.1 二元分类问题
逻辑回归是机器学习中经典的分类算法,尽管名称中有“回归”二字,但它广泛用于二分类任务,这类问题的输出结果只有两个类别。像判断一封邮件是否为垃圾邮件、一笔交易是否欺诈、肿瘤是良性还是恶性等。在数学表示上,通常用 0 和 1 来代表这两个类别 ,不过要注意,这里的 0 和 1 不代表数值大小,只是类别标识。

4.1.2 线性回归对于分类问题的局限性
线性回归输出范围不受限(可能超出[0,1]),无法直接表示概率。
当新增极端数据点时,线性回归的阈值分类效果变差。

4.1.3 Sigmoid 函数
为了让模型输出符合分类需求,逻辑回归引入了逻辑函数,也就是 sigmoid 函数

def sigmoid(z):
return 1 / (1 + np.exp(-z))
4.1.4 决策边界
逻辑回归通过决策边界将特征空间划分为不同类别区域。


4.2 逻辑回归的代价函数
将线性回归的损失函数用到逻辑回归中得到的是非凸函数,成本函数会有很多个局部最小值点,不利于模型训练。

单个训练例子中的损失loss:
f总是在0到1之间,因为逻辑回归的输出总是在0到1之间,当f的预测值越接近y的真实标签时,损失函数最低,当f的预测值越远离y的真实标签时,损失函数越高。

损失函数的第一部分,如上图,真实标签为1,如果算法预测的概率接近1,则损失很小,接近于0;如果算法预测的概率接近0,则损失很大,接近于无穷,所以当预测值接近1时,损失是最低的。

损失函数的第二部分,如上图,真实标签为0,如果算法预测的概率接近0,则损失很小,接近于0;如果算法预测的概率接近1,则损失很大,接近于无穷,所以当预测值接近0时,损失是最低的。
简化版代价函数

maximum likelihood 最大似然估计
def compute_cost_logistic(X, y, w, b):
"""
Computes cost
Args:
X (ndarray (m,n)): Data, m examples with n features
y (ndarray (m,)) : target values
w (ndarray (n,)) : model parameters
b (scalar) : model parameter
Returns:
cost (scalar): cost
"""
m = X.shape[0]
cost = 0.0
for i in range(m):
z_i = np.dot(X[i],w) + b
f_wb_i = sigmoid(z_i)
cost += -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)
cost = cost / m
return cost
4.3 逻辑回归的梯度下降
梯度下降算法,和线性回归一样:
其中:
def compute_gradient_logistic(X, y, w, b):
"""
Computes the gradient for linear regression
Args:
X (ndarray (m,n): Data, m examples with n features
y (ndarray (m,)): target values
w (ndarray (n,)): model parameters
b (scalar) : model parameter
Returns
dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w.
dj_db (scalar) : The gradient of the cost w.r.t. the parameter b.
"""
m,n = X.shape
dj_dw = np.zeros((n,)) #(n,)
dj_db = 0.
for i in range(m):
f_wb_i = sigmoid(np.dot(X[i],w) + b) #(n,)(n,)=scalar
err_i = f_wb_i - y[i] #scalar
for j in range(n):
dj_dw[j] = dj_dw[j] + err_i * X[i,j] #scalar
dj_db = dj_db + err_i
dj_dw = dj_dw/m #(n,)
dj_db = dj_db/m #scalar
return dj_db, dj_dw
4.4 过拟合问题
高偏差(High Bias)——欠拟合
高偏差指模型过于简单,无法捕捉数据中的基本规律,导致在训练集和测试集上表现均较差。
高方差(High Variance)——过拟合
高方差指模型过于复杂,过度拟合训练数据中的噪声和细节,导致在测试集上泛化能力差。


4.5 解决过拟合
4.5.1 收集更多的训练数据

4.5.2 减少特征,进行“特征选择”

4.5.3 正则化(Regularization)

正则化代价函数
\(\frac{1}{2m}\sum_{i = 1}^{m}(f_{\vec{w},b}(\vec{x}^{(i)}) - y^{(i)})^2\) 是均方误差项,用于衡量模型预测值 \(f_{\vec{w},b}(\vec{x}^{(i)})\) 与真实值 \(y^{(i)}\) 之间的误差,目的是让模型拟合数据(fit data);\(\frac{\lambda}{2m}\sum_{j = 1}^{n}w_j^2\) 是正则化项,\(\lambda\) 是正则化参数,\(n\) 是特征数量,该项的作用是使权重 \(w_j\) 保持较小(Keep \(w_j\) small)。

正则化参数的作用
\(\lambda = 0\)起到平衡上述两个目标的作用。如果\(\lambda = 0\),则正则化项不起作用,模型可能会出现过拟合,如图中左侧蓝色曲线所示,过于拟合训练数据中的噪声和细节。如果选择\(\lambda = 10^{10}\) ,即\(\lambda\)非常大,那么正则化项的惩罚力度很强,会使得权重\(w_1\)、\(w_2\)、\(w_3\)、\(w_4\)等都趋近于 0(\(\approx 0\)),此时模型就近似为\(f(x)=b\) ,过于简单,可能导致欠拟合。
正则化线性回归

代价函数
def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):
"""
Computes the cost over all examples
Args:
Args:
X (ndarray (m,n): Data, m examples with n features
y (ndarray (m,)): target values
w (ndarray (n,)): model parameters
b (scalar) : model parameter
lambda_ (scalar): Controls amount of regularization
Returns:
total_cost (scalar): cost
"""
m,n = X.shape
cost = 0.
for i in range(m):
z_i = np.dot(X[i], w) + b #(n,)(n,)=scalar, see np.dot
f_wb_i = sigmoid(z_i) #scalar
cost += -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i) #scalar
cost = cost/m #scalar
reg_cost = 0
for j in range(n):
reg_cost += (w[j]**2) #scalar
reg_cost = (lambda_/(2*m)) * reg_cost #scalar
total_cost = cost + reg_cost #scalar
return total_cost
梯度函数
def compute_gradient_linear_reg(X, y, w, b, lambda_):
"""
Computes the gradient for linear regression
Args:
X (ndarray (m,n): Data, m examples with n features
y (ndarray (m,)): target values
w (ndarray (n,)): model parameters
b (scalar) : model parameter
lambda_ (scalar): Controls amount of regularization
Returns:
dj_dw (ndarray (n,)): The gradient of the cost w.r.t. the parameters w.
dj_db (scalar): The gradient of the cost w.r.t. the parameter b.
"""
m,n = X.shape #(number of examples, number of features)
dj_dw = np.zeros((n,))
dj_db = 0.
for i in range(m):
err = (np.dot(X[i], w) + b) - y[i]
for j in range(n):
dj_dw[j] = dj_dw[j] + err * X[i, j]
dj_db = dj_db + err
dj_dw = dj_dw / m
dj_db = dj_db / m
for j in range(n):
dj_dw[j] = dj_dw[j] + (lambda_/m) * w[j]
return dj_db, dj_dw
正则化逻辑回归

代价函数
def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):
"""
Computes the cost over all examples
Args:
Args:
X (ndarray (m,n): Data, m examples with n features
y (ndarray (m,)): target values
w (ndarray (n,)): model parameters
b (scalar) : model parameter
lambda_ (scalar): Controls amount of regularization
Returns:
total_cost (scalar): cost
"""
m,n = X.shape
cost = 0.
for i in range(m):
z_i = np.dot(X[i], w) + b #(n,)(n,)=scalar, see np.dot
f_wb_i = sigmoid(z_i) #scalar
cost += -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i) #scalar
cost = cost/m #scalar
reg_cost = 0
for j in range(n):
reg_cost += (w[j]**2) #scalar
reg_cost = (lambda_/(2*m)) * reg_cost #scalar
total_cost = cost + reg_cost #scalar
return total_cost
梯度函数
def compute_gradient_logistic_reg(X, y, w, b, lambda_):
"""
Computes the gradient for linear regression
Args:
X (ndarray (m,n): Data, m examples with n features
y (ndarray (m,)): target values
w (ndarray (n,)): model parameters
b (scalar) : model parameter
lambda_ (scalar): Controls amount of regularization
Returns
dj_dw (ndarray Shape (n,)): The gradient of the cost w.r.t. the parameters w.
dj_db (scalar) : The gradient of the cost w.r.t. the parameter b.
"""
m,n = X.shape
dj_dw = np.zeros((n,)) #(n,)
dj_db = 0.0 #scalar
for i in range(m):
f_wb_i = sigmoid(np.dot(X[i],w) + b) #(n,)(n,)=scalar
err_i = f_wb_i - y[i] #scalar
for j in range(n):
dj_dw[j] = dj_dw[j] + err_i * X[i,j] #scalar
dj_db = dj_db + err_i
dj_dw = dj_dw/m #(n,)
dj_db = dj_db/m #scalar
for j in range(n):
dj_dw[j] = dj_dw[j] + (lambda_/m) * w[j]
return dj_db, dj_dw
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)