监督学习
linear regression model 线性回归模型
线性回归模型是一种通过线性方程描述自变量与因变量之间关系的统计分析方法,用于预测或解释变量间的定量依赖关系。
分类: 一元线性回归模型、多元线性回归模型。
训练集:假设呢,我这边就是一个一元的回归模型。(x,y) x表示的是输入的一个特征,y表示预测的一个结果。
y
−
=
f
(
x
)
\overset{-}{y} = f(x)
y−=f(x)
y
−
表示的是预测出来的一个结果值
\overset{-}y \text{表示的是预测出来的一个结果值}
y−表示的是预测出来的一个结果值
f
w
,
b
(
x
)
=
w
x
+
b
f_{w, b}(x) = wx + b
fw,b(x)=wx+b
w表示的是权重,b表示一个偏置。偏置允许神经元学到更灵活的映射关系
避免过拟合的问题。增强模型的一个鲁棒性。
线性回归模型的代价函数
m个测试集
J
w
,
b
=
1
2
m
∑
i
=
1
m
(
y
−
(
i
)
−
y
(
i
)
)
2
J_{w,b} = \frac{1}{2m} \sum_{i=1}^{m} (\overset{-}y^{(i)} - y^{(i)})^2
Jw,b=2m1i=1∑m(y−(i)−y(i))2
y
−
表示的是预测出来的一个结果值
y
表示的是实际的值
\overset{-}y \text{表示的是预测出来的一个结果值}y \text{表示的是实际的值}
y−表示的是预测出来的一个结果值y表示的是实际的值
思考:
为什么是
1
2
m
呢?
\text{为什么是}\frac{1}{2m}\text{呢?}
为什么是2m1呢?
为了在求导的时候方便计算。
为什么要有(代价函数)这个的存在?
后期可以通过梯度下降的方法,更新权重w 和偏置b,进而求得最优解。这个章节会有代码。
梯度下降
梯度下降是一种用于优化算法的迭代方法,广泛应用于机器学习和深度学习中,用于最小化(或最大化)一个目标函数(通常是损失函数或成本函数)。通过逐步调整模型参数,梯度下降能够找到函数的最优解,通常用于寻找神经网络或其他模型中的最优参数。
核心思想:
通过计算目标函数(如损失函数)的梯度,沿着梯度的反方向调整参数,从而逐步减小目标函数的值,直到收敛到一个最小值(或最大值)。
具体来说:
梯度(Gradient):是目标函数相对于参数(如权重、偏置等)的偏导数,表示函数在某一点上变化的最快方向。
下降(Descent):沿着梯度的反方向调整参数,从而使目标函数的值变小。
学习率概念
学习率(Learning Rate,简称 α)是梯度下降算法中的一个重要超参数,它决定了每次更新参数时步长的大小。简单来说,学习率控制着在每次参数更新时,模型如何快速或缓慢地调整其参数。
初始学习率通常设置在
0.01
0.01,
0.001
0.001,
0.0001
0.0001 等
尽量选取不要太大也不要太小的,太大的会导致来回波动,太小最终会得到一个结果,但是呢,收敛太慢了。
一般从0.001 开始。
如何自动选取呢?
Adam 或 RMSprop 优化器。 具体可以自行查看,这边不赘述,后面可能会写。
梯度下降的步骤(附代码)
目的:
min
J
w
,
b
=
1
2
m
∑
i
=
1
m
(
y
−
(
i
)
−
y
(
i
)
)
2
情况下求的w和b?
\min{J_{w,b}} = \frac{1}{2m} \sum_{i=1}^{m} (\overset{-}y^{(i)} - y^{(i)})^2\text{情况下求的w和b?}
minJw,b=2m1i=1∑m(y−(i)−y(i))2情况下求的w和b?
步骤呢?从逻辑上我们应该这么做
step1: 设置初始w、b 为0
step2:改变参数w,b,用以尝试最小化代价的目的。(repeat 的一个阶段,直到 达到我们的目的或者这次更新的w值等于上一次更新的w值的时候,stop)
如何改变w和b呢?
w
=
w
−
α
d
d
w
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
x
注: α是学习率
w= w - α\frac{d}{dw}J_{(w,b)} = \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y) x\text{ 注: α是学习率}
w=w−αdwdJ(w,b)=m1i=1∑m(y−−y)x 注: α是学习率
b
=
b
−
α
d
d
b
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
注: α是学习率
b= b - α\frac{d}{db}J_{(w,b)}= \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y)\text{ 注: α是学习率}
b=b−αdbdJ(w,b)=m1i=1∑m(y−−y) 注: α是学习率
场景:
我们有一个列表x 和y,x 表示输入值,y表示的是输出值。如何求取w和b?
import numpy as np
#初始化我们的一个学习率
alpha = 0.001
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 2, 1.3, 3.75, 2.25])
#初始化参数w 和b
w = 0
b = 0
#设置我们的一个训练次数,假设是1000次
iterations = 1000
decay_rate = 0.9 # 学习率衰减
m = len(x)
for _ in range(iterations):
y_pred = w * x + b #表示预测
dw = (1 / m) * np.sum((y_pred - y) * x)
db = (1 / m) * np.sum(y_pred - y)
w = w - alpha * dw
b = b - alpha * db
#alpha = alpha * decay_rate if _ % 100 == 0 else alpha
if _ % 100 == 0:
cost = (1 / 2 * m) * (np.sum(y_pred - y) ** 2)
print(f"interations:{_} cost: {cost} w: {w} b : {b}")
print(f"after {iterations} loop ,get w :{w} b : {b}")
多元的一个线性回归
跟上面比起来的话,多元的定义就是x 是一个矢量,而非一个标量,其中w也是一个矢量
f
w
,
b
=
w
∗
x
+
b
f_{\mathbf{w},b} = \mathbf{w} * \mathbf{x} + b
fw,b=w∗x+b
什么叫矢量呢?
就是x 不是一个简单的数值,而是由很多个种类组成的一组输入,比如房价跟面积大小,房间数量以及地段有关,这几个数据加起来构成x ,也就是一个矢量。
拓展: 如何在python中做快速的矢量化运算
w = np.array([0.8,1.5,2.3])
x = np.array([100,2,3])
我们如何计算w*x 一个一个算吗?
在numpy中有个dot 函数,其可以并行的执行多个,函数原型
res = np.dot(w,x) + b
特征缩放
假设呢: 房价y = w1* x1 + w2* x2 + w3* x3 + …+ wn* xn
结论:当一个变量range 很大时,选择一个较小的参数,当一个变量range 很小时,选择一个较大的参数。
①
假设呢x1 的取值是
300
≤
x
1
≤
2000
300 \le x_{1} \le2000
300≤x1≤2000
x2 的取值是
0
<
x
2
<
5
0 < x_{2} < 5
0<x2<5
则w1 和w2 的区间是
30
2000
≤
x
1
≤
2000
2000
=w1
\frac{30} {2000} \le x_{1}\le \frac{2000}{2000} \text{=w1}
200030≤x1≤20002000=w1
0
5
≤
x
1
≤
5
5
=w2
\frac{0} {5} \le x_{1}\le \frac{5}{5} \text{=w2}
50≤x1≤55=w2
② 均值归一化
w
1
=
x
1
−
u
1
x
m
a
x
−
x
m
i
n
u1 是x 所有样本的一个均值
w_{1} = \frac{x_{1} - u_{1}} {x_{max} - x_{min}} \text{u1 是x 所有样本的一个均值}
w1=xmax−xminx1−u1u1 是x 所有样本的一个均值
③ z-score
步骤:
1.
先计算均值和标准差,假设均值
u
1
,
标准差
σ
1
\text {先计算均值和标准差,假设均值} u_{1},标准差\sigma_{1}
先计算均值和标准差,假设均值u1,标准差σ1
2.
x
1
=
x
1
−
u
1
σ
1
x_{1} = \frac {x_{1} - u_{1}} {\sigma_{1}}
x1=σ1x1−u1
3. 计算公式得到理想的特征缩放值。
如何判断梯度下降是否是收敛的
J
w
,
b
=
1
2
m
∑
i
=
1
m
(
y
−
(
i
)
−
y
(
i
)
)
2
J_{w,b} = \frac{1}{2m} \sum_{i=1}^{m} (\overset{-}y^{(i)} - y^{(i)})^2
Jw,b=2m1i=1∑m(y−(i)−y(i))2
w
=
w
−
α
d
d
w
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
x
注: α是学习率
w= w - α\frac{d}{dw}J_{(w,b)} = \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y) x\text{ 注: α是学习率}
w=w−αdwdJ(w,b)=m1i=1∑m(y−−y)x 注: α是学习率
b
=
b
−
α
d
d
b
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
注: α是学习率
b= b - α\frac{d}{db}J_{(w,b)}= \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y)\text{ 注: α是学习率}
b=b−αdbdJ(w,b)=m1i=1∑m(y−−y) 注: α是学习率
画一下哪个损失函数的一个曲线,如果说它是一个平稳下降的一个过程。并且越来越小。最后趋于稳定的话,则可有认为这次训练是有效的。
特征工程
定义:特征工程就是“教会模型看数据”,把数据变聪明,模型才能更聪明。
操作类型 | 举例说明 |
---|---|
归一化/标准化 | 把房价从几万到几百万缩放到 0~1 之间 |
缺失值填充 | 用平均值或中位数填补缺失的年龄 |
离散化(分箱) | 年龄转成“少年”“青年”“中年”“老年” |
独热编码(One-hot) | 性别 → 男:[1,0];女:[0,1] |
构造交叉特征 | 身高 × 体重,组合成 BMI |
日志变换 | 收入太悬殊 → 用对数压缩尺度 |
Logistics 回归
通过一定的算式,算出一个值,如果说这个值在某个特定的范围的话,则认为其属于哪一类。
范围:
0
<
g
(
z
)
<
1
\text{范围:} 0 < g(z) < 1
范围:0<g(z)<1
g
(
z
)
=
1
1
+
e
−
z
sigmod函数
g(z) = \frac{1}{1+ e ^ {-z}} \text{sigmod函数}
g(z)=1+e−z1sigmod函数
f
w
,
b
=
g
(
w
∗
x
+
b
)
=
1
1
+
e
−
(
w
T
∗
x
(
i
)
+
b
)
f_{\mathbf{w} ,b } = g(\mathbf{w}* \mathbf{x}+b) = \frac{1}{1+ e ^ -({\mathbf{wT}*\mathbf{x(i)} +\mathbf{b}})}
fw,b=g(w∗x+b)=1+e−(wT∗x(i)+b)1
决策边界
在机器学习中,决策边界是指在特征空间中,将不同类别的样本分开的边界。在分类问题中,模型通过学习特征与类别之间的关系来划分不同的类别,而决策边界正是划分这些类别的“分界线”。
对于二分类问题,决策边界将特征空间划分为两部分,每一部分对应着一个类别。
对于多分类问题,决策边界可能是一个复杂的面或多条线。
本质:
假设有一个线性模型
f
(
x
)
=
w
∗
x
+
b
f(x) = \mathbf{w} * \mathbf{x} + \mathbf{b}
f(x)=w∗x+b
决策边界就是寻找出一条线,满足
0
=
w
∗
x
+
b
0 = \mathbf{w} * \mathbf{x} + \mathbf{b}
0=w∗x+b
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
# 创建一个简单的分类数据集
X, y = make_classification(
n_samples=100,
n_features=2,
n_informative=2,
n_redundant=0,
n_repeated=0,
n_classes=2,
random_state=42
)
# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X, y)
# 获取权重和偏置
w = model.coef_[0]
b = model.intercept_[0]
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
# 计算决策边界:w1*x1 + w2*x2 + b = 0 => x2 = (-w1*x1 - b) / w2
x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x1_values = np.linspace(x1_min, x1_max, 100)
x2_values = (-w[0] * x1_values - b) / w[1]
# 绘制决策边界
plt.plot(x1_values, x2_values, color='black', label='决策边界')
# 显示图形
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.legend()
plt.show()
逻辑回归的代价函数
J
(
w
,
b
)
=
−
1
m
∑
i
=
1
m
[
y
(
i
)
log
(
y
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
]
J(w, b) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right]
J(w,b)=−m1i=1∑m[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]
Loss
(
i
)
=
−
[
y
(
i
)
log
(
y
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
]
\text{Loss}^{(i)} = -\left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right]
Loss(i)=−[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]
如何解决过拟合的问题
方法1: 增大数据量
方法2:减少使用的特征数量
x
1
,
x
2
.
.
.
x
n
x_{1},x_{2}...x_{n}
x1,x2...xn,那些无关紧要的去掉它
方法3:减少使用参数的数量
w
1
,
w
2
.
.
.
w
n
w_{1},w_{2}...w_{n}
w1,w2...wn
L2 正则化方式:
第一部分是 交叉熵损失,用于衡量模型预测与实际标签之间的差异。
第二部分是 L2 正则化(也叫 Ridge 正则化),用于惩罚大权重,减少过拟合。
J
(
w
,
b
)
=
1
2
m
∑
i
=
1
m
[
y
(
i
)
log
(
y
^
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
]
+
λ
∑
j
=
1
n
w
j
2
J(w, b) = \frac{1}{2m} \sum_{i=1}^{m} \left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right] + \lambda \sum_{j=1}^{n} w_j^2
J(w,b)=2m1i=1∑m[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]+λj=1∑nwj2
正则化的线性回归与logistics更新
J ( w , b ) = 1 2 m ∑ i = 1 m [ y ( i ) log ( y ^ ( i ) ) + ( 1 − y ( i ) ) log ( 1 − y ^ ( i ) ) ] + λ 2 m ∑ j = 1 n w j 2 J(w, b) = \frac{1}{2m} \sum_{i=1}^{m} \left[ y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)}) \right] + \frac{\lambda}{2m} \sum_{j=1}^{n} w_j^2 J(w,b)=2m1i=1∑m[y(i)log(y^(i))+(1−y(i))log(1−y^(i))]+2mλj=1∑nwj2
-
更新 (w_j):
w j = w j − α ( 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) x j ( i ) + λ m w j ) w_j = w_j - \alpha \left( \frac{1}{m} \sum_{i=1}^{m} \left( \hat{y}^{(i)} - y^{(i)} \right) x_j^{(i)} + \frac{\lambda}{m} w_j \right) wj=wj−α(m1i=1∑m(y^(i)−y(i))xj(i)+mλwj) -
更新 (b):
b = b − α ⋅ 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) b = b - \alpha \cdot \frac{1}{m} \sum_{i=1}^{m} \left( \hat{y}^{(i)} - y^{(i)} \right) b=b−α⋅m1i=1∑m(y^(i)−y(i))