本文为Datawhale组队学习项目——集成学习的作业Task
作业
1分类与回归问题
输入变量与输出变量均为连续变量的预测问题是回归问题 , 例如给你一组数据要你预测明天的温度
输出变量为有限个离散变量的预测问题为分类问题,例如预测明天是否有雨,这只有两种状态:有或者没有。
如何用回归理解分类:如果我们把回归问题中的输出变量划分为不同的区间,就将回归问题转变为分类问题,例如按照年龄划分儿童、青少年、成年、老年。
2分类问题的损失函数
交叉熵的表达式如下:
C
E
L
=
1
N
∑
i
L
i
=
−
1
N
∑
i
∑
c
=
1
M
y
i
c
log
(
p
i
c
)
CEL = \frac{1}{N}\sum_{i} L_i = - \frac{1}{N}\sum_{i} \sum_{c=1}^My_{ic}\log(p_{ic})
CEL=N1i∑Li=−N1i∑c=1∑Myiclog(pic)
其中:
- M M M:类别的数量
- y i c y_{ic} yic:符号函数( 0 或 1),如果样本 i i i的真实类别等于 c c c 取 1 1 1,否则取 0 0 0
- p i c p_{ic} pic :观测样本 i i i属于类别 c c c的预测概率
对比均方误差:
M
S
E
=
1
n
∑
i
n
(
y
i
^
−
y
i
)
2
MSE=\frac{1}{n}\sum_i^n(\hat{y_i}-y_i)^2
MSE=n1i∑n(yi^−yi)2
在分类问题中,训练的模型通常会用到 s i g m o i d sigmoid sigmoid或 s o f t m a x softmax softmax这样的激活函数,设采用的模型为 z ( x ) z(x) z(x),激活函数为 σ ( z ) \sigma(z) σ(z),则预测值 y ^ \hat{y} y^通常为如下表达式: y ^ = σ ( z ) \hat{y}=\sigma(z) y^=σ(z)。
对交叉熵和均方误差分别进行求导:
交
叉
熵
:
∂
C
∂
w
=
x
⋅
(
σ
(
z
)
−
y
)
交叉熵:\frac{\partial{C} }{\partial{w}}=x{\cdot}(\sigma(z)-y)
交叉熵:∂w∂C=x⋅(σ(z)−y)
均
方
误
差
:
∂
M
∂
w
=
x
⋅
(
σ
(
z
)
−
y
)
⋅
σ
(
z
)
′
均方误差:\frac{\partial{M} }{\partial{w}}=x{\cdot}(\sigma(z)-y)\cdot \sigma(z)^{'}
均方误差:∂w∂M=x⋅(σ(z)−y)⋅σ(z)′
使用梯度下降,对比所求导数可知,交叉熵比均方误差少了
σ
(
z
)
′
\sigma(z)^{'}
σ(z)′,
σ
(
z
)
′
\sigma(z)^{'}
σ(z)′,也就是相比于交叉熵,均方误差还多了激活函数的梯度来影响收敛速度,而部分激活函数的梯度会在值较大是接近0,使得收敛速度下降,所以为了保证收敛速度,采用交叉熵。
3 线性判别分析与逻辑回归的异同点
相同点:都是生成模型,不是将数据确定的划分,线性判别分析与逻辑回归都基于如下的逻辑,将 P ( Y = y ∣ X = x ) P(Y=y|X=x) P(Y=y∣X=x)作为目标函数,计算使得 P ( Y = y ∣ X = x ) P(Y=y|X=x) P(Y=y∣X=x)最大的参数。
不同点:逻辑回归基于的是极大似然估计,而线性判别分析则是基于贝叶斯估计,所以计算 P ( Y = y ∣ X = x ) P(Y=y|X=x) P(Y=y∣X=x)的方式不同。
4 推导支持向量机
完整推导太长,可参考以下资料
参考文献:
https://blog.imfing.com/2020/06/svm-explained/
https://blog.imfing.com/2020/06/svm-explained/
https://zhuanlan.zhihu.com/p/31652569
5 三种算法的联系与区别
联系:三种算法都是基于计算 P ( Y = y ∣ X = x ) P(Y=y|X=x) P(Y=y∣X=x)的生成模型,且均采用的是贝叶斯估计。
区别:在统计学中,协方差用来描述维度间关系,三种模型对于协方差的假设不同
- 线性判别分析假设每种分类类别下的特征遵循同一个协方差矩阵,每两个特征之间是存在协方差的,因此在线性判别分析中各种特征是不是独立的。
- 朴素贝叶斯算法对线性判别分析作进一步的模型简化,它将线性判别分析中的协方差矩阵中的协方差全部变成0,只保留各自特征的方差,也就是朴素贝叶斯假设各个特征之间是不相关的。
- 二次判别分析,对比线性判别模型,区别在于假设不同的类的协方差矩阵不同。
6 逻辑回归实现
逻辑回归一般用于二分类问题
逻辑回归方程:
y
=
s
i
g
m
o
i
d
(
z
)
=
1
1
+
e
−
z
y=sigmoid(z)=\frac{1}{1+e^{-z}}
y=sigmoid(z)=1+e−z1
z
=
w
T
⋅
x
+
b
z=w^T\cdot x+b
z=wT⋅x+b
将上式转换一下形式:
l n y 1 − y = w T x + b ln \frac{y}{1−y} = w^{T}x + b ln1−yy=wTx+b
假设
P
(
Y
=
1
∣
x
)
a
m
p
;
=
p
(
x
)
P
(
Y
=
0
∣
x
)
a
m
p
;
=
1
−
p
(
x
)
\begin{aligned} P(Y=1|x) &= p(x) \\ P(Y=0|x) &= 1- p(x) \end{aligned}
P(Y=1∣x)P(Y=0∣x)amp;=p(x)amp;=1−p(x)
逻辑回归的损失函数为:
J
(
w
)
=
−
1
n
(
∑
i
=
1
n
(
y
i
l
n
(
p
(
x
i
)
)
+
(
1
−
y
i
)
l
n
(
1
−
p
(
x
i
)
)
)
J(w) = -\frac{1}{n}(\sum_{i=1}^n(y_iln(p(x_i))+(1-y_i)ln(1-p(x_i)))
J(w)=−n1(i=1∑n(yiln(p(xi))+(1−yi)ln(1−p(xi)))
使用梯度下降法,则梯度下降公式为:
w
i
k
+
1
=
w
i
k
−
α
(
p
(
x
i
)
−
y
i
)
x
i
w^{k+1}_i=w^k_i-\alpha (p(x_i)-y_i)x_i
wik+1=wik−α(p(xi)−yi)xi
其中,k为迭代次数,
α
\alpha
α为超参数
代码:
import matplotlib.pyplot as plt
import numpy as np
# 激活函数
def sigmoid(X):
return 1 / (1 + np.exp(-X))
# 损失函数计算
def lossfunc(X, Y, W):
n = len(Y)
return (-1 / n) * np.sum(Y * np.log(sigmoid(np.matmul(X, W))) + (1 - Y) * np.log((1 - sigmoid(np.matmul(X, W)))))
# 梯度下降
def gradient_descent(X, Y, learningrate=0.001, trainingtimes=500):
m = len(X)
n = len(X[0])
b = np.ones((1, m))
W = np.ones((1, n + 1))[0]
X_1 = np.concatenate((X, b.T), axis=1)
# 根据指定训练次数训练
loss_Trace = []
for i in range(trainingtimes):
g = (sigmoid(np.matmul(X_1, W)) - Y)
W = W - (learningrate / m) * np.dot(g, X_1)
# 收集损失,查看训练效果
if 0 == i % 1000 or (100 > i and 0 == i % 2):
loss_Trace.append(lossfunc(X_1, Y, W))
return W, loss_Trace
if __name__ == '__main__':
x = [[1, 0], [2, 1], [3, 2], [1, 4], [2, 6], [7, 9], [8, 9], [9, 2], [10, 9]]
y = [0, 0, 0, 0, 1, 1, 1, 1, 1]
train_X = np.asarray(x, dtype=np.float64)
train_Y = np.asarray(y, dtype=np.float64)
final_W, loss = gradient_descent(train_X, train_Y, 0.3, 100000)
plt.plot([i for i in range(len(loss))], loss)
7 各种算法
参考最优化方法的内容:【上海交大】最优化方法 18讲视频教程
参考链接
https://baike.baidu.com/item/交叉熵