2.1 拟合问题
记分类错误样本数为a,样本总数为m。那么。错误率error-rate 为 E = a/m 相应的,精度ACC= 1-E
我们把预测输出和真值之间的差称作 误差:学习器在训练集上的叫做训练误差/经验误差; 而在新的验证集中称作泛化误差
欲图训练一个普适性好的模型,就相当于尽可能地最小化泛化误差。
ML是一个归纳的过程。从训练集中的特殊提取一般规律。如果提取规律不充分,该有的特征未提取到(约束条件少),则会得出很多实际上不需要并不拟合的结果,此之为欠拟合underfitting; 与之相反,把训练集数据中的某个特征、细枝末节当做普适规律,则会导致什么都提取不到,此之为过拟合overfitting。欠拟合是可以轻松解决的,但令人棘手的是如何处理过拟合。任何算法无法避免过拟合现象(P != NP)
人们无法直接获取泛化误差,而训练误差又因过拟合无法成为评估模型的标准,那么如何进行模型评估呢?
人们使用测试集testing test 来测试学习器能力,以测试误差来做泛化误差的近似
1.训练样本和测试样本 独立同分布 同样来源于数据集
2. 二者应该尽量互斥,毕竟考试试卷不可能出现原题
2.2 Data set划分
因此 就由上涉及到一个数据集划分的问题。如何划分一个Data set呢?
2.2.1留出法 Hold out
人为设定比例(比如七三开) 分成两部分,一部分训练用,另一部分测试。为保证数据分布一致性,在数据集中随机取样就完事了。从1000个Item中 做300次不放回的抽球运动,即可得训练集S和测试集T。S:T这个比值一般为2:1~4:1之间。为保证可靠性,需将这个随机采样重复进行若干次,分别进行训练获取结果,结果取全体结果的均值。
算法实现,目前想到就是生成1~1000内的随机数,检测碰撞,如果碰撞,重新生成一次数/hash。因为只抽取少的那部分(300个而不是700)时间上的花销我感觉是可以容忍的。
2.2.2 交叉验证法 cross validation
将数据集D 划分成大小相同(相似)的k份,依次从K份中选中1份作为T,剩下K-1份数据作为S进行训练,此为k折交叉验证,一般情况 K=10。同留出法一样,进行若干次随机的k份整体划分,重复试验 p次k折交叉验证,得出p*k个结果,取其均值
我联想一些python中无序的数据结构,是不是可以指定一种划分,依靠数据结构本身的随机性,实现随机划分。(未测试)
2.2.3 自助法 bootstrapping
人们希望得到的是用D训练出的模型,而上述两种方法因测试集T的存在,实际上总是在使用一个mini-D进行测试。这就意味这误差啊(虽然有点矫情了),那么如何屏蔽这种影响呢? A:包外估计
自助法:设D中包含m个样本。进行m次有放回的抽球运动。显然,m个样本中,大概率(肯定)会存在有的球取到多次,有的球没取到的情况。样本中,一个球一次都没被抽中的概率为1/e = 0.368 取大头做S,而这些一次没被抽中的样本做T。应用 这种采样手段,生成的这种估计结果,成为包外估计 out-of-bag estimate
自助法在数据集小,或者D不容易划分的情况下显得十分实用;当数据量足够充足时,前两种方法误差相较而言会小。