-
1. 提出问题
考虑T_all的泛化能力:
1.测试集上的性能与真正的泛化性能未必相同
2.测试集上的性能与测试集本身选择有很大关系
3.机器学习算法本身有一定的随机性,同一个测试集上多次运行,可能会有不同的结果
-
2.二项分布
import pandas as pd
import matplotlib as pml
import matplotlib.pyplot as plt
from scipy.special import comb
#全部数据ALL
#假设模型在ALL上的错误率为
e_all=0.3
#测试集T
#T样本量
m_T=10
#模型在T上面判断错误的数量
m_T_error=6
#模型在T上的错误率
e=round(m_T_error/m_T,4)
#二项分布计算
def calculate_p(m_T,m_T_error):
p=(comb(m_T,m_T_error))*(e_all**m_T_error)*(1-e_all)**(m_T-m_T_error)
p=round(p,4)
return p
p=calculate_p(m_T,m_T_error)
#出现每个情况的概率
def calculate_ps(m_T):
m_T_errors=list(range(m_T+1))#错误个数也可能是0,1,2,3,4...
ps=[]
for i in range(len(m_T_errors)):
m_T_error=m_T_errors[i]
p=calculate_p(m_T,m_T_error)
ps.append(p)
return m_T_errors,ps
m_T_errors,ps=calculate_ps(m_T)
#错误个数:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
#二项分布下的错误率[0.0282, 0.1211, 0.2335, 0.2668, 0.2001, 0.1029, 0.0368, 0.009, 0.0014, 0.0001, 0.0]
#画出分布图象
def plot_scatter(x,y):
plt.scatter(x,y,s=20,c='b',alpha=0.5)
plt.show()
return
plot_scatter(m_T_errors,ps)
从图中可以看出,错三个的概率是最高的,e=e_all=0.3的情况概率是最高的
-
3. 假设检验
假设e_all<=0.3,对于这个假设,实际只设了上限,拒绝这个假设的办法只能是出现大于某个数的错误,那么这个界限的最大值是多少?置信度为90%
#上述概率累加求和
def calculate_Ps(ps):
Ps=[]
p=0
for i in range(len(ps)):
p+=ps[i]
Ps.append(p)
return Ps
Ps=calculate_Ps(ps)
plot_scatter(m_T_errors,Ps)
求出上界,进行单侧假设检验
import numpy as np
Ps_array=np.array(Ps)
confidence_index=np.argwhere(Ps_array>0.9)
##np.argwhere( a ) 返回非0的数组元组的索引,其中a是要索引数组的条件。
confidence_index=confidence_index[0]
print(confidence_index)
#[5]
-
4.多个测试集一种算法
t检验(1.离散型随机变量的函数分布,2.卡方分布,3.t分布,4.正态分布与处理为t分布)
-
5.多个测试集两种算法
交叉验证t检验
-
6.一个测试集两种算法
McNemar检验
-
7.多个测试集多种算法
Friendman检验与Nemenyi后续检验
以上是数理统计的内容,见宇哥概率九讲~
网友评论