模型评估与选择
文章目录
二分类问题的泛化误差上界
T={(xi,yi)} 来自于联合概率分布 P(X,Y) 且有 X∈Rn,Y∈{−1,+1} ,而且 F={f1,...,fn} , 损失函数为 0−1 损失
则关于 f 的期望风险与经验风险为
R(f)=E[L(Y,f(X))]
R^(f)=N1i=1∑NL(yi,f(xi))
则经验风险最小化函数为
f^=argf∈FminR^(f)
fN的泛化能力为
R(f^)=E[L(Y,f^(X))]
则对于任意一个函数,以概率 1−δ 有
R(f)≤R^(f)+ϵ(d,N,δ)
其中 ϵ(d,N,δ)=2N1(logd+logδ1)
Hoeffding 不等式:
P(ESn−Sn≥t)≤exp(∑i=1n(bi−a1)2−2t2),∀t>0
其中 Sn=∑i=1nXi是独立随机变量 X1,...,Xn之和,且 Xi∈[ai,bi]
混淆矩阵
1 | 0 | |
---|---|---|
1 | a (TP) | b (FN) |
0 | c (FP) | d (TN) |
一级指标
- TP ( true positive ),真正,被正确预测的正样本数
- FN ( false negative ),假负,被错误预测为负类的正样本数
- FP ( false positive ),假正, 被错误预测为正类的负样本数
- TN ( true negative ), 真负,被正确预测的负样本数
二级指标
- 真正率 TPR 或者 灵敏度 (Sensitivity)
- 模型正确预测的正样本比例
- TPR=TP/(TP+FN)
- 真负率 TNR 或者 特指度 (Specificity)
- 模型正确预测的负样本比例
- TNR=TN/(TN+FP)
- 假正率 FPR
- 被预测为正类的负样本比例
- FPR=FP/(TN+FP)
- 假负率 FNR
- 被预测为负类的正样本比例
- FNR=FN/(TP+FN)
- 查准率 percision
- 预测为正类的样本中实际为正类的比例
- p=TP/(TP+FP)
- 召回率 recall
- 被模型正确预测的正样本比例
- 高召回意味着,很少将正样本误分为负样本
- r=TP/(TP+FN)
三级指标
F1−Score:
- F=r+p2rp=2TP+FN+FP2TP
- 精度与召回的调和平均 F2=r1+p1
其余指标
- P−R 曲线
- Fβ=r+β2p(β2+1)rp
ROC 曲线 与 AUC
- ROC(Receiver Operating Characteristic)
- TPR 沿 y 轴绘制, FPR 沿 x 轴绘制
- 曲线每一个点对应了不同阈值下的一个模型
Code:
# From 尹昊宇
#ROC曲线 y轴为真阳率(TP/(TP+FN)) x轴为假阳率(FP/FP+TN)
def plotroc(classscore,label):
import matplotlib.pyplot as plt
current = [1.0,1.0] #用于记录当前绘图光标停止的位置,初始位置为(1,1),即全部预测为正类
ysum = 0 #计算ROC曲线下的面积
numpos = sum(np.array(label)==1.0) #计算训练样本中正类个数
ystep = 1/float(numpos) #计算y的步长,相当于1/TP+FN
xstep = 1/float(len(label)-numpos) #计算x的步长,相当于1/FP+TN
sortindex = classscore.T.argsort() #将该矩阵(m*1)从小到到大排序,返回索引
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
for index in sortindex.tolist(): #将所有样本从得分最小的开始依次预测为反类
if label[index] == 1.0:
delx = 0
dely = -ystep
else:
delx = -xstep
dely = 0
ysum += current[1] #面积计算时,只有x轴发生偏移,才需要加一下此时y轴高度
#由于面积可以看作是多个长方形之和,长方形宽一样,只要计算长(y)的和即可
ax.plot([current[0],current[0]+delx],[current[1],current[1]+dely],c = 'b')
current = [current[0]+delx,current[1]+dely]
ax.plot([0,1],[0,1],'b--')#蓝色虚线
ax.axis([-0.05,1.05,-0.05,1.05])
plt.show()
return ysum*xstep
auc = plotroc(prob,label)
交叉验证
如何估计模型的泛化能力?
- 交叉验证 (CrossValidation)
- 留一法 (Leave−One−OutCrossValidation)
留一法的每一回合都用了几乎所有样本进行训练;同时没有随机因素的影响;但是计算成本太高。
自助法 (bootstrapping)
利用自助采样法为基础
自助法重复 m 次得到包含 m 个样本的数据集 D′
m−>∞lim(1−m1)m−>e1≈0.368
正则化 (regularization)
f∈FminN1i=1∑NL(yi,f(xi))+λJ(f),λ≥0
常见的惩罚:
L1,L2惩罚。
模型比较
-
t 检验
两个学习器 A,B
在 k 折交叉验证下的训练误差为 ϵ1A,...,ϵkA;ϵ1B,...,ϵkB
如果两个模型性能相同,则有Δi=ϵiA−ϵiB=0
所以有假设检验统计量var(ϵA−ϵB)/k∣mean(ϵA−ϵB)∣∼t(k−1) - Mcnemar 检验
A,B | T | F |
---|---|---|
T | e00 | e01 |
F | e10 | e11 |
如果两个算法性能相同,则表现相同,则有 e01=e10
对应的统计量为
τχ2=e01+e10(∣e01−e10∣−1)2∼χ2(1)
-
Friedman & Nemenyi 检验
这是一个非参数检验法
每一个元素为对应的性能排序值,如需哦性能一样,则平分序值
数据集 | A | B | C |
---|---|---|---|
D1 | rank | ||
D2 | |||
D3 | |||
D4 | |||
平均序值 |
统计量为:
τχ2=kk−1∗k2−112Ni=1∑k(ri−2k+1)2=k(k+1)12N(i=1∑kri2−4k(k+1)2)
当 k 和 N 较大时,服从 χ2(k−1) 分布
偏差-方差分解
E(f;D)=bias2(x)+var(x)+ϵ2
=(fˉ(x)−y)2+ED[(f(x;D)−fˉ(x))2]+ED[(yD−y)2]