CS229-04--常见模型总结

在机器学习看到一半的过程中,对于之前学习的广义线性模型、高斯判别分析、支持向量机、决策树、多层感知器进行阶段性的总结,并尝试使用过去课程中可能存在例子来进行展示,最后利用Kaggle的实验来进行展示

如有侵权,可以删除;如有错误,欢迎提出

0x01基本模型

1.1 GLM(logistic regression、linear regression、softmax regression)

之前的blog,关于GLM

吐槽:

明明是discriminate的模型,却叫广义线性模型(generative linear model);明明是generative的模型,却叫高斯判别分析(gaussian discriminat analysis)

广义线性模型中的步骤是,对于一群i.i.d(独立同分布)的数据集X,通过学习算法得到一个关于输出预测y的P(y^X)P(\hat y|X),再每次输出中将期望值作为最终的输出,使得其的概率可以最大。其中做出三个基本假设

  1. X~Exponential\ Family(\eta)=b(y)exp(\eta^TT(y)-a(\eta))
  2. 输出的预测值y^=hθ(x)=E(yx)\hat y=h_{\theta}(x)=E(y|x)
  3. 由于是线性模型,最强的假设是η=θTx(i)\eta =\theta^T x^{(i)}

可以从三个例子来看出推导过程:

example01:逻辑回归(y=「0,1」,ps:y=[-1,1]不一样)

GLM分析:

hθ(x)=E(yx,θ)h_{\theta}(x)=E(y|x,\theta),这里的分布假设是Bernoulli(伯努利分布),因此

hθ(x)=ϕ=1/(1+eη)=1/(1+eθTx)h_{\theta}(x)=\phi=1/(1+e^{-\eta})=1/(1+e^{-\theta^Tx})

数据集和假设(x^{(i)},y^{(i)}),y\in\{0,1\},h_{\theta}(x)=g(z),g(z)=\frac{1}{1+e^{-z}}

由此推导得到预测值的输出的损失函数:P(yx)=hθ(x)y(1hθ(x)1yP(y|x)=\prod h_{\theta}(x)^y*(1-h_{\theta}(x)^{1-y}

之后为了利用梯度下降Gradient Descent下降的方式需要计算lθ\frac{\partial l}{\partial\theta},同时为了简便计算

lθ=In(P)θ=Σ(yhθ(x).x)\frac{\partial l}{\partial\theta}=\frac{\partial In(P)}{\partial\theta}=\Sigma (y-h_{\theta}(x).*x)

example02: 线性回归

GLM分析:

hθ(x)=E(yx,θ)h_{\theta}(x)=E(y|x,\theta),这里的分布假设是高斯分布

hθ(x)=ϕ=η=θTxh_{\theta}(x)=\phi=\eta=\theta^Tx

数据集和假设(x^{(i)},y^{(i)}),h_{\theta}(x)=\theta^Tx

由此推导得到预测值的输出的损失函数:P(yx)=N(θTx,σ2)P(y|x)=N(\theta^Tx,\sigma^2)

之后为了利用梯度下降Gradient Descent下降的方式需要计算lossθ\frac{\partial loss}{\partial\theta},同时为了简便计算

In(p)=Σi=1m[In(1σ(2π))+(y^ihθ(X))22σ2]In(p)=\Sigma_{i=1}^m[In(\frac{1}{\sigma*\sqrt(2*\pi)})+-\frac{(\hat y^i-h_\theta(X))^2}{2*\sigma^2}]

等价于loss=Σ(y^ihθ(X))22loss=\Sigma-\frac{(\hat y^i-h_\theta(X))^2}{2}

lossθ=Σ(yhθ(x).x)\frac{\partial loss}{\partial\theta}=\Sigma(y-h_{\theta(x)}.*x)

example03: softmax 回归

GLM分析:

hθ(x)=E(yx,θ)h_{\theta}(x)=E(y|x,\theta),这里我们不知道具体的概率分布是什么,只能假设每一类的输出是ϕk\phi_k,得到概率分布函数

p(y;ϕ)=ϕ11,y=1ϕ21,y=1...ϕk1,y=k=ϕ1T(y)1ϕ2T(y)2...ϕkT(y)k=b(y)exp(ηT(y)a(η))p(y;\phi)=\phi_1^{1,y=1}*\phi_2^{1,y=1}...*\phi_k^{1,y=k}=\phi_1^{T(y)_1}*\phi_2^{T(y)_2*...*\phi_k^{T(y)_k}}=b(y)exp(\eta^T(y)-a(\eta))

经过化简可以得到

η=[log(ϕ1/ϕk),...,log(ϕk1/log(ϕk))]\eta=[log(\phi_1/\phi_k),...,log(\phi_{k-1}/log(\phi_k))]

同时

Σϕj=1\Sigma \phi_j=1

可以得到

ϕk=1/Σeηi=1/ΣeθiTx\phi_k=1/\Sigma e^{\eta_i}=1/\Sigma e^{\theta^T_i x}

因此对于

ϕi=eηi/Σ(eηj)=eθiTx/Σ(eθjTx)\phi_i=e^{\eta_i}/\Sigma(e^{\eta_j})=e^{\theta^T_ix}/\Sigma(e^{\theta_j^T x})

在得到分布函数的基础上,我们就可以计算期望值

hθ(x)=E(yx;θ)=[ϕ1,...,ϕk1]h_{\theta}(x)=E(y|x;\theta)=[\phi_1,...,\phi_{k-1}]

损失函数就是我们最初定义的:

loss=ϕ1T(y)1ϕ2T(y)2...ϕkT(y)kloss=\phi_1^{T(y)_1}*\phi_2^{T(y)_2*...*\phi_k^{T(y)_k}}

1.2 GDA(Gaussian Discriminat Analysis)

与判别式模型(GLM)想比较p(yx)p(y|x),生成式模型generative用于生成p(xy)p(y)p(x|y)p(y)来对每一种类别建模,寻找每个类别的特征,也就是比如输出多种类别,同时假设每个类别都是高斯分布,则可以计算两个类别的高斯分布参数,这样在得到输入可以直接使用分布函数来得到输出

p(xy)=1(2π)n/2Σ1/2exp(1/2(xμT)Σ1(xμ)))p(x|y)=\frac{1}{(2*\pi)^{n/2}*|\Sigma|^{1/2}}*exp(-1/2*(x-\mu^T)\Sigma^{-1}(x-\mu)))

计算就好了蛮

1.3 SVM(Support Vector Machine)

支持向量机是最大边缘方法,允许把模型表示为训练实例的一个子集的影响之和,这些影响用面向应用的相似性核给出,采用:不要在解决实际问题之前把解决一个更复杂的问题作为第一步;在训练过程中希望找到的是那个最佳分离平面hyperplane:wTx+bw^Tx+b中的两个参数

模型的输入是(x(i),y(i)),y{1,+1}(x^{(i)},y^{(i)}),y\in\{-1,+1\},希望找到的是可以讲数据集可以正确区分开的参数w bw\ b

Ps:为了简单起见,可以从线性可分的情况来谈论,再拓展到非线性可分的情况

image-20220311145620775

通过定义functional margin和geometry margin,我们可以建立最符合直觉的模型为:

target:max\ \gamma=min[y^{(i)}(w^Tx^{(i)}+b)]\\ subject\ to:y^{(i)}(w^Tx^{(i)}+b)>\gamma\\ ||w||=1

经过凸优化中的相关变化,使其变成可以求解的形式

min:\frac{1}{2}||w||^2\\ s.t.:y^{(i)}(w^Tx^{(i)}+b)>=1

对于这种类型的凸优化问题,可以采用拉格朗日方法或者其他方法直接进行求解;也可以将其转换为对偶问题dual problem,再利用拉格朗日算法或者其他方法来求解,⚠️我们希望求解的是w和b!!

L=12w2+αi(1y(i)(wTx(i)+b))[α>=0]L=\frac{1}{2}||w||^2+\alpha_i(1-y^{(i)}(w^Tx^{(i)}+b))[\alpha>=0]

对于这个函数求极值,就是希望

Lw\frac{\partial L}{\partial w}Lb\frac{\partial L}{\partial b}等于0

Lw=wΣαiy(i)x(i)\frac{\partial L}{\partial w}=w-\Sigma\alpha_iy^{(i)}x^{(i)}

Lb=Σαiy(i)\frac{\partial L}{\partial b}=\Sigma\alpha_iy^{(i)}

将这个带入到L中,化简得到

L=Σαi1/2ΣΣαiαjy(i)y(j)x(i)x(j)L=\Sigma\alpha_i-1/2\Sigma\Sigma\alpha_i\alpha_jy^{(i)}y^{(j)}x^{(i)}x^{(j)}

构建对偶问题,等价于

max Lmax\ L

s.t. \alpha_i>=0\ 并且 \Sigma\alpha_i*y^{(i)}=0

其中需要满足KKT条件:

  1. αi>=0\alpha_i>=0
  2. y(i)(wTx(i)+b)1>=0y^{(i)}(w^Tx^{(i)}+b)-1>=0
  3. αi(y(i)(wTx(i)+b)1>=0)=0\alpha_i(y^{(i)}(w^Tx^{(i)}+b)-1>=0)=0

通过某种算法SMO可以很轻松的求解上述对偶问题,得到αi\alpha_i并根据KKT条件可以确定支持向量(support vector),由此计算得到w和b,这样就可以判断正例还是反例

  • SMO算法?以后才知道吧

在线性不可分的情况,可以使用核机器(kernel function)来进行重新度量向量之间的非相似性

在间隔划分中,可以通过设置软间隔的方式来允许有部分噪声点发生

同时为了过拟合的风险,依旧可以增加模型复杂程度的项(term)

1.4 CART(Classfication and regression tree)

1.5 ANN(Artificial Neural Network)

对于每个神经元包括两个部分,一个是接受前端的激活权重,另外一方面是自身的激活函数的选取

线性连接:z^i=w^ia^{i-1}+b^i

激活输出:a^i=g(z^i)

image-20220311152827951

假设对于这样的一个函数:

前向传递:

Z1=W1X+b1Z^1=W^1*X+b^1

A1=g(Z1)A^1=g(Z^1)

Z2=W2A1+b2Z^2=W^2*A^1+b^2

A2=g(Z2)A^2=g(Z^2)

Z3=W3A2+b3Z^3=W^3*A^2+b^3

A3=g(Z3)A^3=g(Z^3)

梯度下降来更新参数:

ps:解决问题要从源头一步一步解决

可以选取交叉熵作为误差函数

L=(ylog(y^)+(1y)log(1y^))L=-(ylog(\hat y)+(1-y)log(1-\hat y))

L/W3=L/A3A3/W3=(y^y)A2\partial L/\partial W^3=\partial L/\partial A^3*\partial A^3/\partial W^3=(\hat y-y)A^2

很amazing,在于输出的梯度下降可以和前一个节点的激活有关,如果使用内存把这些记录下来,可以大幅度的降低训练的时间,同时可以并行的计算一些参数

在定义好一个网络结果只是一个基础,还需要确定网络中的激活函数,定义好网络中训练的基本参数初始化、参数的随机选择、以及采用比较好的优化求解算法

激活函数

softmax、tanh、logistic、ReLu等等

参数归一化

min-max归一化、z-score、均值方差归一化

参数初始化

在网络层数变多的情况下,梯度会出现爆炸或者变小的情况,因此可以采用的随机化包括:均值、xvaier initiation、he initialization、np.random .randn(shaope)*np.sgrt(1/n[z-1]) simoid 用1比较好、relu用2比较好等等不知名的参数初始化

优化方法

GD、SGD、BGD、动量算法、Adam、启发式算法(模拟退火、遗传算法)等等

常见的网络

  1. RBF(radial basis function,径向基网络)
  2. ART(adaptive resonance theory,自适应谐振理论)
  3. SOM(self- organizing map ,自组织映射)
  4. CC(cascade- correlation,级联相关网络)
  5. Elamn网络
  6. Boltzmann机

0x02实验

一些比较简单的codebase

GLM

决策树CART在IRIS

tensorflow实现的人工神经网络

支持向量机

0x03Kaggle- Titanic

image-20220311211139656

草率的花了一晚上了解了一下kaggle的流程,有点拉胯,一万多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
01 数据集的导入和基本信息
train数据集中包括的特征有: PassengerId:乘客的编号 Survived:是否存活 Pclass:票的类型,1是最好的、3是最差的 Name:性命 Sex:年龄 Age:年龄 SibSp:相伴的兄弟姐妹以及配偶 Parch:相伴的父母或者孩子 Ticker:乘客的票号 Fare:乘客的票价 Cabin:机舱号码 Embarked:下车地点
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
train_data=pd.read_csv('../titanic/train.csv')
test_data=pd.read_csv('../titanic/test.csv')
train_data.head()
# 和交通数据中一样拿到数据需要考虑数据是否存在缺失、异常、或者是重复等等
train_data.info()
# 可以看出数据中存在缺失的特征包括:Age、Cabin、Embarked
## 缺失值的修补
#Embarked 上船地点中缺少两个数,对于之后并没有太大的影响,可以使用众数进行修补
train_data.Embarked.fillna(value=train_data.Embarked.dropna().mode().values[0])
data_test=test_data.Fare.fillna(value=test_data.Fare.dropna().mean())
test_data.loc[:,'Fare']=data_test
# 从直觉上来看,年龄对于之后是否坠船有相关的影响,因此在这里选择对应的非空特征进行绚练
feature_name=['Pclass','Sex', 'SibSp', 'Parch','Fare','Embarked','Survived']
# cabin 的机场缺失太多,这里就不作为训练来
# 对性别进行编码
train_data_copy=train_data[feature_name]
from sklearn.preprocessing import LabelEncoder
label=LabelEncoder()

train_data_copy.loc[:,'Sex']=label.fit_transform(train_data_copy.Sex)
train_data_copy.loc[:,'Embarked']=label.fit_transform(train_data_copy.Embarked)

test_data.loc[:,'Sex']=label.fit_transform(test_data.Sex)
test_data.loc[:,'Embarked']=label.fit_transform(test_data.Embarked)
## 尝试使用SVM
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.svm import LinearSVC

p_s_c=Pipeline([
('poly_features',PolynomialFeatures(degree=3)),
('scaler',StandardScaler()),
('svm_clf',LinearSVC(C=10,loss='hinge'))
])
p_s_c.fit(train_data_copy.loc[:,('Pclass','Sex', 'SibSp', 'Parch','Fare','Embarked')],train_data_copy.iloc[:,-1])
from sklearn.metrics import accuracy_score
result=p_s_c.predict(test_data.loc[:,('Pclass','Sex', 'SibSp', 'Parch','Fare','Embarked')])
submisstion=pd.DataFrame({
'PassengerId':test_data['PassengerId'],
'Survived':result
})
submisstion.to_csv('submission.csv',index=False)

CS229-04--常见模型总结
https://blog.tjdata.site/posts/61a92f70.html
作者
chenxia
发布于
2022年3月11日
许可协议