机器学习课程复习笔记

1. 绪论

机器学习的概念

不需要确定性编程就可以赋予机器某项技能

Performance Task Experience,程序使用E在T上获得了P的提升,就是学习

按照任务种类分:回归、分类、聚类、降维

按照学习方式分:有监督、无监督、强化学习

2. 模型的评估与选择

重点章节 各种评价指标,包括写代码、调用库函数

例题如协方差矩阵、查准、混淆矩阵、ROC曲线

基本知识点如过拟合问题与解决方案

经验误差empirical error:在训练集上的误差(训练误差)

泛化误差generalization error:在未来样本上的误差

泛化误差越小越好,但经验误差并不是。

评估方法

留出法hold-out

X_train,X_test,y_train,y_test=train_test_split()

  • 保持数据分布一致
  • 多次随机划分、重复实验取平均值
  • 合适的测试集比例

交叉验证法cross validation

先将数据集划分为k个大小相同的互斥子集,保证每个子集的数据分布一致,在选取k-1个子集作为训练集,余下的作为测试集。这样就可以获得k组训练/测试集,可进行k次训练和测试。

image.png

1
2
3
4
5
6
7
model = linear_model.Lasso()
cv_results = sklearn.model_selection.cross_validate(model,X,y,cv=3)
# 第二种
kf = KFold(3)
for train_idx,test_idx iin kf.split(X):
	X_train,X_test = X[train_idx],X[test_idx]
	y_train,y_test = y[train_idx],y[test_idx]

特别地,如果$k=m$则交叉验证变为留一法Leave One Out

  • 不受随机样本划分方式的影响,因为只有一种划分方式——每个子集一个样本;
  • 训练集包含了尽可能多的样本,使得实际被评估的模型与期望评估的模型很相似;
  • 训练开销大
  • 估计结果也不一定比其它评估方法准确

自助法bootstrap

使用有放回重复采样构建数据集,会有$\frac{1}{e} = 0.368$的原始数据永远不会被采样,这一部分就作为测试集。

性能度量

$$MSE = \frac{1}{m}\sum_{i=1}^{m}(f(x_i)-y_i)^2$$ $$MAE = \frac{1}{m}\sum_{i=1}^{m}\vert f(x_i)-y_{i}\vert$$ image.png image.png image.png image.png

ROC曲线横轴是假负例率,纵轴是真正例率,围成的面积为AOC,越大越好。

比较检验

在测试集上的性能不能反映模型的真正性能,需要进行统计假设检验,推断在统计意义上是否更优。原因:

  • 测试性能不等于泛化性能
  • 测试性能随测试集的变化而变化
  • 机器学习算法本身就有一定的随机性 偏差与方差 对回归任务,泛化误差可以分解为偏差bias、方差variance、噪声之和。 $$E(f;D)= bias^{2}(x)+var(x)+ \epsilon^2 $$ image.png

在训练的过程中,一般逐渐从偏差主导转向方差主导。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//留出法
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25)
//k折交叉验证
kf=KFold(n_split=3)
//重复p次k折交叉验证
rkf=RepeateKFold(n_split=3,n_repeats=2)
//分层k折交叉验证
skf=StratifiedKFold(n_split=4)
//留一法
loo=LeaveOneOut()
//性能度量
metrics.mean_squared_error(y_true,y_pred)
np.sqrt(metrics.mean_squared_error(y_true,y_pred))
metrics.mean_absolute_error(y_true,y_pred)
//混淆矩阵
confusion_matrix(y_true,y_pred,labels=[0,1,2])
//绘制P-R图
precision, recall, thresholds = precision_recall_curve(y_true, y _pred)
plt.plot(recall, precision)

3. 线性模型

梯度(协方差)的概念、计算、求解(手工、代码)

最小二乘法:对损失函数求导,令导数=0,解得: $$w= \frac{\sum\limits_{i=1}^{m}y_{i}(x_{i}-\bar x)}{\sum\limits_{i=1}^{m}x_{i}^{2}-\frac{1}{m}(\sum\limits_{i=1}^{m}x_{i})^2}$$ $$b = \frac{1}{m}\sum\limits_{i=1}^{m}(y_{i}- wx_{i})$$ 对数几率回归:利用线性模型做分类任务,对数几率函数(sigmoid)

线性判别分析LDA: 给定训练样例集,设法将样例投影到一条直线上,使得同类点尽可能接近、异类点尽可能远离,通过协方差,优化目标为最大化瑞利商。

多分类学习:一对一($\frac{n*(n-1)}{2}$)个分类器、一对其余(n个分类器)、多对多(ECOC)

1
2
3
4
5
6
7
8
9
def train(epoches = 1 ,l r = 0.01):
	for epoch in range(epoches):
		# 前向传播
		output = inputs.mv(w) # 计算输出y'=wx
		loss = (target - output).pow(2).sum()
		loss.backward()
		w.data -=  lr* w.grad
		w.grad.zero_()
sklearn.linear_model.LinearRegression()

梯度下降:$w^{t+1} = w^{t} - \eta \frac{\partial L}{\partial w}$ $$Conv(x,y) = \frac{\sum_{i=1}^{n} (x_{i}-\bar x)(y_{i} - \bar y)}{n-1}$$ $$Conv(x,y) = Conv(y,x)$$ $$Conv(x,x) = Var(x)$$

1
2
3
4
a = np.array([1,3,4,5])
b = np.array([2,6,2,2])
z = np.stack((a,b))
np.cov(z)

4. 神经网络

重点章节

BP推导、计算、误差计算、算法

感知机

原始形式

image.png

其中$L(w,b)$即是损失函数,它与所有误分类的点到超平面的距离有关,训练的过程就是使损失函数收敛的过程。 感知机算法是收敛的:当数据线性可分时,感知机经过有限次的搜索可以找到将训练数据完全正确分开的分离超平面。

对偶形式

image.png

神经网络

反向传播

算法步骤:初始化-前向计算样本输出-计算输出层梯度$g$-计算隐层梯度$e$-更新连接权值与阈值

前向计算:偏置值是要减去的

反向传播:输出层节点的梯度:

$$ g = \hat y_{j}(1- \hat y_{j})(y_{j}- \hat y_j) $$ 其中$\hat y_j$是计算的输出值,而$y_{j}$是期望值(真实值、标签)

隐层的节点梯度:

$$e = b_n(1-b_n)\sum_{j=1}^{l}w_{hj}g_{j}$$ image.png image.png

过拟合

应对策略:早停与正则化

早停

  • 训练误差连续几轮的变化较小,则停止训练
  • 使用验证集:若训练误差降低但验证误差升高,则停止训练

正则化

在误差目标函数中增加一项描述网络的复杂度,使网络偏好较小的连接权值和阈值,使网络的输出更加平滑。

Local minima

模拟退火、随机扰动、遗传算法、动量机制….

激活函数

作用是增加网络的非线性表达能力。 要求:

  • 连续并可导的非线性函数
  • 函数及导数要尽可能简单,利于计算
  • 导数的值域应该位于合适的区间,否则会影响训练的效率与稳定性 $$sigmoid = \frac{1}{1+e^{-x}}$$

5. 最优化理论与方法

证明凸集、凸函数,图解法,对偶问题

引言

凸集:n维欧式空间内,如果任意两点的连线都仍然位于此空间内,则为凸集。形式化描述为$\lambda x_{1}+ (1-\lambda) x_{2} \in S$

凸函数: 在定义域内,对任意的$x$都有$f(\lambda x_{1}+ (1-\lambda ) x_{2}) <= \lambda f(x_{1}+ (1- \lambda)f(x_2))$ 为凸函数,凸函数是凹的,凹函数是凸的。 Hesse矩阵半正定,函数为凸函数,正定为严格凸函数。

凸规划:求解凸函数在凸集上的极小点。凸规划的局部极小点就是全局极小点,且极小点的集合是凸集。目标函数是严格凸函数+极小点存在=极小点唯一。

线性规划

线性规划的标准形式为: $$
\begin{align*} min \quad cx \ s.t. \quad Ax = b, \ x \geq 0, \end{align*} $$

  1. 图解法
  2. 基本性质
  • 线性规划的可行域是凸集
  • 若存在最优解,一定在极点取到
  1. 可行解 在线性规划的标准形式中,设矩阵A的秩为m,又假设$A=[B,N]$ ,其中B是m阶可逆矩阵,则 $$ x= \begin{bmatrix} x_{B} \ x_{N} \end{bmatrix} = \begin{bmatrix} B^{-1}b \ 0 \end{bmatrix} $$ $$$$ 是一个基本解。B是基矩阵,其分量为基变量,若基本解中不含负数,则为基本可行解。例题可以方便理解。

6. 支持向量机

重点章节 核函数、函数间隔、几何间隔、支持向量、三种形式与对偶问题 sklearn调用支持向量机

函数间隔: $\hat \gamma_i = y(wx_i+b)$ 超平面关于所有训练集的函数间隔,是与所有样本点的函数间隔的最小值。 几何间隔: $\gamma = \frac{\hat \gamma_{i}}{\vert \vert w \vert \vert}$

线性可分SVM

image.png image.png

线性SVM

image.png image.png

非线性SVM-核技巧

image.png

支持向量

image.png

SVM特性

■优点

  • 具有较好的泛化能力,特别是在小样本训练集上能够得到比其他算法好很多的结果。这是因为其优化目标是结构风险最小,而不是经验风险最小,因此通过margin,可以得到对数据分布的结构化描述,从而降低了数据规模和数据分布的要求。
  • 具有较强的数学理论支撑,基本不涉及概率测度和大数定律等。
  • 引入核函数可以解决非线性分类问题。 ■缺点
  • 不方便解决多分类问题。
  • 存在对结果影响较大的超参数,比如采用rbf核函数时,惩罚项C和核参数gamma,只能通过穷举或经验推测获得。
1
2
3
4
5
6
7
8
9
import numpy as np
from sklearn.svm import SVC

x = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])  # 自变量
y = np.array([1, 1, 2, 2])  # 因变量
model = SVC()  # 定义模型
model.fit(x, y)  # 根据数据训练模型
pred = model.predict([[-0.8, -1]])  # 预测x=[-0.8,-1]的结果
print(pred)  # 输出y=[1]

7. 集成学习

Adaboost算法

输入训练集$D= {(x_1,y_1),(x_2,y_2),…,(x_m,y_{m})} \quad y={-1,1}$ ,输出最终分类器$H(x)$,具体步骤如下:

  1. 设定弱分类器数目为$T$,令$t=1$,使用均匀分布初始化的训练集样本权重分布,令$m$维向量$D_1$ 表示第一次需要更新的样本权重,$D_1$的初始值设为 $$D_{t} = (\frac{1}{m},\frac{1}{m},…,\frac{1}{m})^T $$
  2. 使用权重分布为$D_t$的训练样本集$D$学习到第$t$个弱分类器$h_t$
  3. 计算$h_t$在训练样本集$D$上的错误分类率$\epsilon_t$ ,如果$\epsilon_t>0.5$则丢弃
  4. 确定弱学习器$h_t$的组合权重$\alpha_t$ ,错误率越小的$h_t$,其权重$\alpha_t$应该越大,有 $$\alpha_t = \frac{1}{2}ln\frac{1-\epsilon_t}{\epsilon_{t}}$$
  5. 依据弱分类器$h_t$对训练样本集的分类错误率$\epsilon_t$,更新样本权重: $$D_{t+1}= \frac{D_{t,i}exp(-\alpha_{t} y_{i}h_{t}(x_{i}))}{Z_{t}}$$
  6. 若$t<T$,令$t= t+1$ ,并返回步骤2,否则执行步骤7
  7. 对$T$个分类器$h_1,h_2,…,h_T$分别按照每个权重$\alpha_t$进行组合,得到最终分类器 $$H(x) = sign(\sum_{t=1}^{t}\alpha_{t}h_{t}(x))$$

Bagging算法步骤

image.png

多样性增强方式

  • 数据样本扰动 通常基于采样法,如Bagging使用自助采样,AdaBoost采用序列采样

  • 输入属性扰动 随机子空间:从初始属性集中抽取若干个属性子集,再基于每个属性子集训练一个基学习器

  • 输出表示扰动 对输出表示进行操纵可以增强多样性。 翻转法:随机改变一些训练样本的标记对输出表示进行转化 输出调制法:分类输出转换为回归输出,构建个体学习器求解子任务 ECOC法:利用纠错输出码将多分类任务拆解为一系列二分类来训练基学习器

  • 算法参数扰动 随机设置不同的参数。 负相关法:显示地通过正则化项来强制个体神经网络使用不同的参数。

参考

参考笔记一 代码向

20级真题

一、10分

显示图片需要化学的网络环境

中科院研究生考试原题,两问共10分

二、10分

  1. 什么是留一法?
  2. 给出如下数据,使用线性模型$y=wx+b$ ,用留一法计算(总体)均方误差。
    x y
    0 2
    1 1
    2 2

(反正是三组,但具体数据可能不是这个)

三、判断下面的是否是凸函数 10分

(1) $ax_{1}^{2} + bx_{2}^{2} + cx_{1}x_{2} +dx_{1} +ex_2$ (2) $ax_{1}^{2} + bx_{2}^{2} + cx_{1}x_{2} +dx_{1} +ex_2$ (都是这种形式,具体数字不记得了)

四、证明凸集 10分

已知$p \in C$,$C$是$R^p$上的凸集,现有$S = {x \vert x=A\rho ,\rho \in C}$ 其中$A$是$n \times p$ 的矩阵,证明$S$为凸集。

五、图解法求线性规划最小值。10分

六、写出极小问题的对偶形式。10分

七、 15分

  1. 描述AdaBoost算法
  2. 描述Bagging算法
  3. 简述多样性增强的方式

八、 25分 给一个神经网络,$d$维输入$x = [x_{1},…,x_{d}]$,单隐层共$p$个隐层节点,输出层$l$个节点,输出为$y = [\hat y_{1}^{k},…,\hat y_{l}^{k}]$

  1. 写出隐层的输入和输出层的输入
  2. 写出均方损失函数$E_{k}$
  3. 给定学习率$\eta$ ,求$\frac{\partial E_{k}}{w_{hj}}$(体现出推导过程)
  4. 给出反向传播的伪代码
  5. 解释梯度下降与一些常见的变种,并比较他们的不同
Buy me a coffee~
Tim 支付宝支付宝
Tim 贝宝贝宝
Tim 微信微信
0%