混淆矩阵
- | Positive Predictions | Negative Predictions |
Positive Label | TP | FN |
Negative Label | FP | TN |
- Accuracy(准确率)
A C C = T P + T N F P + F N + T P + T N = 预测正确样本数 总样本数 A C C=\frac{T P+T N}{F P+F N+T P+T N}=\frac{\text { 预测正确样本数 }}{\text { 总样本数 }} ACC=FP+FN+TP+TNTP+TN= 总样本数 预测正确样本数 - Precision(精度)
P R E = T P T P + F P = 预测正确的正样本数量 所有豹测为正样本(不论对错 ) 的样本数量 P R E=\frac{T P}{T P+F P}=\frac{\text { 预测正确的正样本数量 }}{ \text { 所有豹测为正样本(不论对错 } ) \text { 的样本数量 }} PRE=TP+FPTP= 所有豹测为正样本(不论对错 ) 的样本数量 预测正确的正样本数量 - Recal(召回率 TPR)
T P R = T P T P + F N = 预测正确的正样本数量 总的正样本数量 T P R=\frac{T P}{T P+F N}=\frac{\text {预测正确的正样本数量 }}{\text { 总的正样本数量 }} TPR=TP+FNTP= 总的正样本数量 预测正确的正样本数量 - FPR(误诊率, 误报率)
F P R = F P F P + T N = 预测错误的负样本数量 总的负样本数量 F P R=\frac{F P}{F P+T N}=\frac{\text { 预测错误的负样本数量 }}{\text { 总的负样本数量 }} FPR=FP+TNFP= 总的负样本数量 预测错误的负样本数量 - FNR(漏报率):
F N R = F N F N + T N = 将正样本错认成负样本的数量 获测成负样本的总数量 F N R=\frac{F N}{F N+T N}=\frac{\text { 将正样本错认成负样本的数量 }}{\text { 获测成负样本的总数量 }} FNR=FN+TNFN= 获测成负样本的总数量 将正样本错认成负样本的数量
各指标的使用分析
- Accuracy:当正负样本数量极度不均衡时, 准确率无法正确的反映出模型的好坏, 当不同类别的样本比例非常不均衡时, 占比大的类别往往成为影响准确率的最主要因素.
- Precision: 在面对正负样本数量极度不均衡时的缺陷: 当负样本数量大幅增加时, FP 也会大幅增加, 这样, 就会使得 Precision 相对降低.
- P-R曲线(Precision — Recall)
- PR曲线的特殊位置:(0,1):Precision = 0,阈值趋向无穷大,全部预测成负样本,召回率:0/0 = 1;(1,0):阈值趋向0,全部预测成正样本,Recall趋向0而不等于0
- PR曲线和分类器择优:① 性能正相关与AUC ② 平衡点 (BEP, 查准率=查全率), BEP 越大越好 ③ F1 度量, F1 越大越好
- ROC曲线:召回率(查全率, TPR)和假正率(误诊率, FPR),
- ROC一定经过(0,0)和(1,1)
- ROC一定在y=x之上,否则反转1-p即可
- ROC曲线如果不光滑判断可能是过拟合;如果是光滑的,AUC (area under curve) 来判断模型的好坏, AUC 越大的模型越好. 因为 AUC 越大, 说明模型可以在较低的误诊率下达到较高的召回率.
- 绘制ROC曲线,设定一系列阈值,得到混淆矩阵,进而得到TPR和FPR。当出现相同的Score时,会出现梯形,否则一般都是矩形!
- ROC的AUC含义:AUC 的值是处于 [0, 1] 区间内的, AUC 可以看做是一个概率值, 当前学习器对正样本的预测值大于负样本的概率, 也就是说当前学习器将这个正样本排在负样本前面的概率.
- AUC计算方法:① 计算各个小矩阵面积 ② 结合AUC的含义,设有样本集N正样本M负样本O(N^2 M^2):
A U C = 正样本得分大于负样本的pair个数 N × M A U C=\frac{\text { 正样本得分大于负样本的pair个数 }}{N \times M} AUC=N×M 正样本得分大于负样本的pair个数
③ 简化第二种方法的复杂度,先对整个样本按照得分大小排序,排列组合方式简化复杂度*(分子中 rank 的值实际上代表了该样本能够产生多少种 前大后小 的组合, 而这些组合中需要减去 N(1+N)2 中 (正样本, 正样本) 的组合情况):
A U C = ∑ i ∈ positive r a n k i − N ( 1 + N ) 2 M × N A U C=\frac{\sum_{i \in \text {positive}} r a n k_{i}-\frac{N(1+N)}{2}}{M \times N} AUC=M×N∑i∈positiveranki−2N(1+N) - ROC和PR曲线的区别:ROC 曲线有一个特点, 那就是当正负样本的分布发生变化时, ROC 曲线的形状能够基本保持不变, 而 PR 曲线的性质一般会发生剧烈的变化. 具体来说就是, Recall 和 FPR 受正负样本数量不均衡问题的影响较小, 而 Precision 受其影响大(负样本数量升高时, Precision 会大幅降低), 所以 PR 曲线会发生剧烈变化
模型评估方法
- Holdout 检验
- S-Fold交叉验证
- 自助法(有放回随机抽样): 有36.8%不会被挑选到(用于训练)
超参数调参
- 网格搜索,先大后小
- 随机搜索
- 贝叶斯估计,先用先验分布构造的搜索函数进行取样,再更新分布 . 缺:容易进入局部最优点
模型比较
三大损失函数
hinge损失:
l
h
i
n
g
e
(
z
)
=
max
(
0
,
1
−
z
)
l_{h i n g e}(z)=\max (0,1-z)
lhinge(z)=max(0,1−z)
指数损失(exponential loss):
l
e
x
p
(
z
)
=
exp
(
−
z
)
l_{e x p}(z)=\exp (-z)
lexp(z)=exp(−z)
对率损失(logistic loss):
l
l
o
g
(
z
)
=
log
(
1
+
exp
(
−
z
)
)
l_{l o g}(z)=\log (1+\exp (-z))
llog(z)=log(1+exp(−z))
线性回归和逻辑回归
- 线性回归解决回归问题,逻辑回归解决分类问题
- 逻辑回归本质上还是线性回归, 只是在特征到结果的映射中加入了一层函数映射, 即先把特征线性求和, 然后使用Sigmoid函数将连续结果值映射到 (0, 1) 之间;逻辑回归实际上也可以看做是对 log p 1 − p \log \frac{p}{1-p} log1−pp的线性回归
逻辑回归和SVM
- 都是分类算法
- 损失函数:前者log函数,后者Hinge loss函数。这两个损失函数的目的都是增加对分类影响较大的数据点的权重, 减少与分类关系较小的数据点的权重.
LR为什么使用对数损失函数?
因为LR是从最大熵模型推出来的:最大熵模型的思想:
① 根据现有观察样本, 计算现有的条件概率分布对应的熵. 条件熵是已知 X 的条件下, Y 的条件概率对应的熵, 如下:
H
(
Y
∣
X
)
=
−
∑
x
,
y
P
(
x
)
P
(
y
∣
x
)
log
P
(
y
∣
x
)
H(Y | X)=-\sum_{x, y} P(x) P(y | x) \log P(y | x)
H(Y∣X)=−x,y∑P(x)P(y∣x)logP(y∣x)
② 让条件熵最大
max
(
H
(
Y
∣
X
)
)
\max (H(Y | X))
max(H(Y∣X)),也可以说是让它的相反数最小
min
(
−
H
(
Y
∣
X
)
)
\min (-H(Y | X))
min(−H(Y∣X))
③ 将最大条件熵转换成一个带约束的最优化问题, 然后用拉格朗日函数转换成对偶问题, 利用极大似然函数进行求解. 其二分类的最终形式与 sigmoid 函数相似, 同时也解释了为什么用极大似然估计来求解 LR.
为什么采用极大似然函数求解LR?
最大熵模型的推导过程就是用的极大似然估计;因为这样构成的损失函数是高阶可导的凸函数, 比较方便用经典的数值优化算法(梯度下降, 牛顿)进行优化.- Logistic: 1 n ∑ i = 1 n − log g ( y i [ w 0 + x i T w 1 ] ) + λ 2 ∥ w 1 ∥ ; g ( z ) = 1 1 + exp ( − z ) \frac{1}{n} \sum_{i=1}^{n}-\log g\left(y_{i}\left[w_{0}+x_{i}^{T} w_{1}\right]\right)+\frac{\lambda}{2}\left\|w_{1}\right\|; g(z)=\frac{1}{1+\exp (-z)} n1i=1∑n−logg(yi[w0+xiTw1])+2λ∥w1∥;g(z)=1+exp(−z)1
- SVM: 1 n ∑ i = 1 n ( 1 − y i [ w 0 + x i T w 1 ] ) + + λ 2 ∥ w 1 ∥ \frac{1}{n} \sum_{i=1}^{n}\left(1-y_{i}\left[w_{0}+x_{i}^{T} w_{1}\right]\right)^{+}+\frac{\lambda}{2}\left\|w_{1}\right\| n1i=1∑n(1−yi[w0+xiTw1])++2λ∥w1∥
- SVM 的处理方法是只考虑支持向量, 也就是和分类最相关的少数点, 去学习分类器. 而逻辑回归通过非线性映射, 大大减小了离分类平面较远的点的权重, 相对提升了与分类最相关的数据点的权重.
- ① 逻辑回归相对来说模型更加简单, 特别是大规模线性分类时比较方便. ② SVM 的实现和优化相对来说复杂一些, 但是 SVM 的理论基础更加牢固, 有一套结构化风险最小化的理论基础, 另外, SVM 转化成对偶问题后, 分类只需要计算与少数几个支持向量的距离即可, 这在进行复杂核函数计算时有时很明显, 能够大大简化模型和计算量
- 逻辑回归产出的是概率值, 而 SVM 只能产出正负类, 因此 LR 的预估结果更容易解释.
- SVM 主要关注的是 “支持向量”, 也就是和分类最相关的少数点, 即关注局部关键信息; 而逻辑回归是在全局进行优化的, 这导致 SVM 天然比逻辑回归有更好的泛化能力, 防止过拟合.
参数模型和非参数模型
- 参数和非参数模型的区别不是模型种是否有参数,而是对问题建模时时候对总体分布已知,是否对总体分布进行假设
- LR是参数,SVM不是参数
参数模型优缺点
- 参数算法包括两部分: (1) 选择目标函数的形式; (2) 从训练数据中学习目标函数的系数. LR 会预先假设目标函数(直线或其他), 因此它是参数模型. 其他参数模型还有: 线性成分分析, 感知机.
- 参数模型的优点:
简单: 理论容易理解, 结果容易解释
快速: 参数模型的学习和训练速度较快
数据更少: 通常不需要大量的数据也可以较好的拟合? - 参数模型的缺点:
约束: 以选定函数形式的方式来学习本身就限制了模型的解空间
有限的复杂度: 通常只能应对简单的问题
拟合度小: 实际中通常无法和潜在的目标函数温和.
非参数模型优缺点
- 对于目标函数的形式不作过多的假设. 当有用许多数据而先验知识很少时, 非参数学习通常很有用, 因为此时不需要关注参数的选取. 常用的非参数算法包括: K 最近邻, 决策树, SVM, 朴素贝叶斯, 神经网络.
- 非参数算法的优点:
可变性: 可以拟合许多不同的函数形式
模型强大: 对于目标函数不作假设或者作微小的假设
表现良好: 对于预测结果表现通常较好 - 非参数算法的局限性:
需要更多数据: 对于拟合目标函数需要更多的训练数据
速度慢: 参数更多, 所以训练通常较慢
SVM和LR的使用场景
令 n=特征数量, m=训练样本数量, 则:
- 如果 n>m, 则使用 LR 或者不带核函数的 SVM, 因为特征数相对于训练样本数已经够大了, 使用线性模型就能取得不错的效果, 不需要过于复杂的模型;
- 如果 n<m, 则使用 SVM(高斯核函数), 因为在训练样本数量足够大而特征数量较小的情况下, 可以通过复杂核函数的 SVM 来获得更好的预测性能, 而且因为训练样本数量并没有达到百万级, 使用复杂核函数的 SVM 也不会导致运算过慢;
- 如果 n<<m, 此时因为训练样本数量特别大, 使用复杂核函数的 SVM 会导致训练过慢, 因此应该考虑通过引入更多特征, 然后使用 LR 或者不带核函数的 SVM 来训练更好的模型
- 在实际使用中, 通常当数据非常非常大(几个 G, 几万维度特征), 跑不动 SVM 时, 用 LR. 如今数据量大幅增加, 相比来说 LR 反而用的更多了.
SVM
如何选取核函数
- 吴恩达观点:① 如果 Feature 的数量很大, 跟样本数量差不多, 这时候可以使用 LR 或者是 Linear Kernel 的 SVM. (因为核函数需要计算内积, 两两样本都得算, 所以样本过多的话时间消耗太大, 很明显高斯核比线性核复杂的多) ② 如果 Feature 的数量比较小, 样本数量一般, 不算大也不算小, 就选用 SVM + Gaussian Kernel ③ 如果 Feature 的数量比较小, 而样本数量比较多, 就需要手工添加一些 feature, 使之变成第一种情况.
为什么说高斯核函数将原始特征空间映射成了无限维空间?
κ
(
x
,
z
)
=
exp
(
−
∥
x
−
z
∥
2
2
σ
2
)
\kappa(x, z)=\exp \left(-\frac{\|x-z\|^{2}}{2 \sigma^{2}}\right)
κ(x,z)=exp(−2σ2∥x−z∥2)
高等数学中, 我们学过, 应用泰勒展开, 有:
e
x
=
1
+
x
1
!
+
x
2
2
!
+
x
3
3
!
+
…
=
∑
n
=
0
∞
x
n
n
!
e^{x}=1+\frac{x}{1 !}+\frac{x^{2}}{2 !}+\frac{x^{3}}{3 !}+\ldots=\sum_{n=0}^{\infty} \frac{x^{n}}{n !}
ex=1+1!x+2!x2+3!x3+…=n=0∑∞n!xn
所以有:
κ
(
x
,
z
)
=
exp
(
−
∥
x
−
z
∥
2
2
σ
2
)
=
exp
[
−
1
2
σ
2
⟨
x
−
z
,
x
−
z
>
]
=
exp
[
−
1
2
σ
2
(
∥
x
∥
2
+
∥
z
∥
2
−
2
x
T
z
)
]
=
exp
(
γ
∥
x
∥
2
)
∗
exp
(
γ
∥
z
∥
2
)
∗
exp
(
−
2
γ
x
T
z
)
,
γ
=
−
1
2
σ
2
\begin{aligned} \kappa(x, z) &=\exp \left(-\frac{\|x-z\|^{2}}{2 \sigma^{2}}\right) \\ &=\exp \left[-\frac{1}{2 \sigma^{2}}\langle x-z, x-z>]\right.\\ &=\exp \left[-\frac{1}{2 \sigma^{2}}\left(\|x\|^{2}+\|z\|^{2}-2 x^{T} z\right)\right] \\ &=\exp \left(\gamma\|x\|^{2}\right) * \exp \left(\gamma\|z\|^{2}\right) * \exp \left(-2 \gamma x^{T} z\right), \gamma=-\frac{1}{2 \sigma^{2}} \end{aligned}
κ(x,z)=exp(−2σ2∥x−z∥2)=exp[−2σ21⟨x−z,x−z>]=exp[−2σ21(∥x∥2+∥z∥2−2xTz)]=exp(γ∥x∥2)∗exp(γ∥z∥2)∗exp(−2γxTz),γ=−2σ21
其中:
exp
(
γ
∥
x
∥
2
)
=
∑
n
=
0
∞
(
γ
∣
∣
x
∣
2
)
n
n
!
=
∑
n
=
0
∞
γ
n
(
x
1
2
+
x
2
+
⋯
x
k
2
)
n
n
!
,
x
=
(
x
1
,
x
2
…
x
k
)
T
\begin{aligned} \exp \left(\gamma\|x\|^{2}\right) &=\sum_{n=0}^{\infty} \frac{\left(\left.\gamma|| x\right|^{2}\right)^{n}}{n !} \\ &=\sum_{n=0}^{\infty} \frac{\gamma^{n}\left(x_{1}^{2}+x_{2}^{+} \cdots x_{k}^{2}\right)^{n}}{n !}, x=\left(x_{1}, x_{2} \ldots x_{k}\right)^{T} \end{aligned}
exp(γ∥x∥2)=n=0∑∞n!(γ∣∣x∣2)n=n=0∑∞n!γn(x12+x2+⋯xk2)n,x=(x1,x2…xk)T
也就是说, exp(
γ
∥
x
∥
2
)
\left.\gamma\|x\|^{2}\right)
γ∥x∥2) 含有了无穷多项的多项式, 对应的映射面数
Φ
(
⋅
)
\Phi(\cdot)
Φ(⋅) 将に維空向映的成了无限维空间, 即:
Φ
:
R
k
→
R
∞
\Phi: R^{k} \rightarrow R^{\infty}
Φ:Rk→R∞
高斯核 δ \delta δ的意义
- σ很小的情况下(狄拉克分布),所有映射后的点彼此之间的距离均相等,即不存在聚类现象(聚类直观上理解就是各个点聚在一起,之间的距离较小)。这样一来每个样本点将被单独形成一个分类。
- σ很大的情况下(均匀分布),两个不同的点经过映射后,成为高维空间上的同一个点(相互之间距离为0)。这样一来,所有的样本点将被划分成同一个类,无法区分开来。
K-Means
实现 anchor 划分
- 实现对 anchor 的 K-Means 聚类算法, 核心思想和常规的聚类实现相同, 不同之处在于 “距离” 的定义, 和更新centers的方式, 具体来说就是:
① 距离的定义: 用1-IOU定义每个框与centers之间的距离, IOU越大, 距离越近
② 聚类点更新: centers更新时, 采用np.median选择当前类中的中位数box作为新的center. 经过实验验证, 使用mean的效果不如使用median. 这里由于我们使用的是median, 也就是众多boxes 中的某一个作为最终的聚类点, 因此我们不设置最大的迭代次数, 而是一直循环到聚类点不再更新为止.
③ 注意, 由于确定 anchor 时, 我们仅仅只需要样本框的宽和高这两个信息即可, 不需要知道样本的具体location, 所以, 在传入boxes时, 我们传入的是 [N, 2] 维度的数据, 其中 N 代表 box 的数量, 2 代表每个 box 的 (w, h)
机器学习算法的使用场景
- 没有最好的算法,只有最合适的算法
- 数据维度越高,随机森林就比AdaBoost强越多,但是整体不及SVM;数据量越大,神经网络就越强。
近邻算法/KNN
- 适用情景:
- 需要一个特别容易解释的模型的时候。
比如需要向用户解释原因的推荐算法。
贝叶斯
典型的例子是Naive Bayes,核心思路是根据条件概率计算待判断点的类型。
是相对容易理解的一个模型,至今依然被垃圾邮件过滤器使用。
- 适用情景:
- 需要一个比较容易解释,而且不同维度之间相关性较小的模型的时候。
- 可以高效处理高维数据,虽然结果可能不尽如人意。
决策时
- 适用情景:因为它能够生成清晰的基于特征(feature)选择不同预测结果的树状结构,数据分析师希望更好的理解手上的数据的时候往往可以使用决策树。
- 同时它也是相对容易被攻击的分类器。这里的攻击是指人为的改变一些特征,使得分类器判断错误。常见于垃圾邮件躲避检测中。因为决策树最终在底层判断是基于单个条件的,攻击者往往只需要改变很少的特征就可以逃过监测。
- 受限于它的简单性,决策树更大的用处是作为一些更有用的算法的基石
随机森林
- 适用情景:
数据维度相对低(几十维),同时对准确性有较高要求时。
因为不需要很多参数调整就可以达到不错的效果,基本上不知道用什么方法的时候都可以先试一下随机森林。
SVM
- 适用情景:
SVM在很多数据集上都有优秀的表现。
相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。
和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法。
逻辑回归
- 适用情景:LR同样是很多分类算法的基础组件,它的好处是输出值自然地落在0到1之间,并且有概率意义。
- 因为它本质上是一个线性的分类器,所以处理不好特征之间相关的情况。虽然效果一般,却胜在模型清晰,背后的概率学经得住推敲。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具
判别分析 (Discriminant analysis)
- 线性判别分析(Linear discriminant analysis):LDA的核心思想是把高维的样本投射(project)到低维上,如果要分成两类,就投射到一维。要分三类就投射到二维平面上。这样的投射当然有很多种不同的方式,LDA投射的标准就是让同类的样本尽量靠近,而不同类的尽量分开。对于未来要预测的样本,用同样的方式投射之后就可以轻易地分辨类别了。
- 判别分析适用于高维数据需要降维的情况,自带降维功能使得我们能方便地观察样本分布。
- 它的正确性有数学公式可以证明,所以同样是很经得住推敲的方式。但是它的分类准确率往往不是很高,所以不是统计系的人就把它作为降维工具用吧。
- 同时注意它是假定样本成正态分布的,所以那种同心圆形的数据就不要尝试了。
神经网络 (Neural network)
- 使用情景:
数据量庞大,参数之间存在内在联系的时候。
当然现在神经网络不只是一个分类器,它还可以用来生成数据,用来做降维,这些就不在这里讨论了。
Boosting
- 使用情景:
好的Boosting算法,它的准确性不逊于随机森林。虽然在[1]的实验中只有一个挤进前十,但是实际使用中它还是很强的。因为自带特征选择(feature selection)所以对新手很友好,是一个“不知道用什么就试一下它吧”的算法。
Bagging
- 使用情景:
相较于经典的必使算法,Bagging使用的人更少一些。一部分的原因是Bagging的效果和参数的选择关系比较大,用默认参数往往没有很好的效果。
虽然调对参数结果会比决策树和LR好,但是模型也变得复杂了,没事有特别的原因就别用它了。
Stacking
- Stacking是Kaggle比赛中常见的集成学习框架。一般来说,就是训练一个多层(一般是两层,本文中默认两层)的学习器结构,第一层(也叫学习层)用n个不同的分类器(或者参数不同的模型)将得到预测结果合并为新的特征集,并作为下一层分类器的输入。一个简单的示意图如下:
- Stacking中的第一层可以等价于神经网络中的前 n-1层,而stacking中的最终分类层可以类比于神经网络中最后的输出层。不同点在于,stacking中不同的分类器通过异质来体现对于不同特征的表示,神经网络是从同质到异质的过程且有分布式表示的特点(distributed representation)。Stacking中应该也有分布式的特点,主要表现在多个分类器的结果并非完全不同,而有很大程度的相同之处。
- 调参算法 …
- 使用情景:没事就别用了,适合竞赛,不适合工程
多专家模型(Mixture of Experts)
隐马尔科夫 (Hidden Markov model)
- 适用场景:
可以用于序列的预测,可以用来生成序列。