1,训练集,验证集和测试集#
在人工智能和机器学习过程中,对于原始数据可以分成三部分:训练集,验证集和测试集,参考图 1 所示。其中:
- 训练集(Trainning set):用于构建机器学习模型。
- 验证集(Validation set):验证集可以包含在训练集中,也可以单独划分。单独划分的时候往往是为了用于交叉验证训练后的机器学习模型,或者可以用于选择模型参数。
- 测试集(Test set):对于模型来说是未知数据,用于评估最终模型。
图 1 训练集、验证集和测试集
2、泛化、过拟合和欠拟合#
如果一个算法对没见过的数据做出准确的预测,则称它能够从训练集泛化(generalize)到测试集。一般来说,总是想要构建一个泛化精度尽可能高的算法。判断一个算法在新数据上表现好坏的唯一度量,就是在测试集上的评估。一般来说,简单的模型对新数据的泛化能力更好。构建一个对现有信息量来说过于复杂的模型,称为过拟合(overfitting)。这种情况下,在拟合模型时过分关注训练集的细节,得到了一个在训练集上表现很好,但不能泛化到测试集或新数据上的模型,那么就存在过拟合。与之相反,如果模型过于简单,那么可能无法抓住数据的全部内容以及数据中的变化,模型在一开始训练集上的表现就很差,这种现象称之为欠拟合(underfitting)。
模型越复杂,在训练集上的预测结果就越好,但是由于模型过于复杂,使得我们过多地关注训练集上的每个单独的数据点,模型就不能很好地泛化到新数据上。过拟合和欠拟合之间存在一个最佳位置,参考图 2 的中间位置,可以得到最好的泛化模型。这是模型探索的最终目标。
图 2 模型复杂度与预测误差关系
(来源:CNBLOG[2])
3,交叉验证#
交叉验证(Cross-validation),也称循环估计,是一种评估泛化性能的统计学方法,它比单次划分训练集和测试集的方法更加稳定全面。在交叉验证中,数据被多次划分为训练集和测试集,或者保留测试集不动,将训练集多次划分为训练集和验证集。
常见的交叉验证是 K 折交叉验证(k-fold cross-validation),其中 K 是由用户指定的数字在执行 K 折交叉验证时,首先将训练集划分为大致相等的 K 部分,每一部分称之为折(fold)。接下来训练一系列模型。使用第 K 折作为验证集,来评估精度,其他折(1~K-1)作为训练集来训练第一个模型。依次使用第 K-1、K-2、…..2、1 折作为验证集,其他折作为训练集来训练不同的模型,每一次都计算精度,最后得到 K 个精度值。以 K=10 为例,十折交叉验证可参考图 3 所示。
图 3 十折交叉验证示例图
(来源:CSDN[3])
交叉验证的优点是使得每个样例都会刚好在测试集中出现一次:每个样例位于一个折中,而每个折都在测试集中出现一次。因此,模型需要对数据集中所有的样本的泛化能力都很好,才能让所有的交叉验证打分(一般取其平均值)很高。和数据的单次划分相比,交叉验证的另一个优点是对数据的使用更加高效。以十折交叉验证为例,我们可以使用 90% 的数据来拟合模型。而交叉验证的缺点是增加了计算成本。因为要训练 K 个模型而不是单个模型,所以交叉验证的速度要比数据单次划分大约慢 K 倍。另外,需要注意的是,交叉验证不是一种构建模型的方法。交叉验证的目的只是评估给定算法在特定数据集上训练后的泛化性能的优劣,其本身并不会返回一个模型。
4、网格搜索#
模型的泛化能力可以通过调整参数来提升。而找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一件棘手的任务,但对于几乎所有的模型和数据集来说都是必要的。关于参数调优方面的研究也有很多,比如非参数噪声法估计,遗传算法参数寻优。其中最常用的方法就是网格搜索(grid search),它主要是指尝试我们关心的参数的所有可能组合。以 SVR 为例,它有 2 个重要参数:核宽度 gamma 和正则化参数 C。假设我们希望尝试 C 的取值为 0.001、0.01、0.1、1、10 和 100,gamma 的取值为 0.001、0.01、0.1、1 和 10,所以总共有 30 种参数组合,参考图 4 所示,所有可能的组合组成了 SVR 的参数设置网格。
图 4 SVR 参数设置网格
为了得到对泛化性能的更好估计,网格搜索常常与交叉验证结合使用。带交叉验证的网格搜索的最大缺点就是训练模型所需要太多的时间。以图 4 的网格为例,使用 5 折交叉验证对 C 和 gamma 特定取值的 SVR 精度进行评估,需要训练 30*4=120 个模型。
5,滚动预测#
滚动预测方法,顾名思义,对大量的样本数据进行滚动性选择。它的本质是利用一个 “时间窗口” 在不断向后移动的过程中,将市场中最新的数据加入到建模中,从而不断更新模型。而这种算法的使用前提是:建模过程中,新数据的重要性要大于旧数据,新数据的意义便是比旧数据更适合市场的变化需求。
对于这种算法,面临的研究方向主要有两个。第一种方法是将时间窗口固定,这样一来时间窗口的大小就不会随着新数据和新样本的添加而发生改变,从而旧数据和旧样本会不断地被清除出去,为新数据的填入提供充足的空间,因此,窗口的大小对于这个算法来说十分重要,也要为它提供最优化。第二种方法是时间窗口的大小可以随着新数据和新样本的填入而发生改变,这样一来,由于新数据的不断填入,时间窗口需要根据新数据和新样本的特点及时调整大小,这种机制的特点就是旧数据仍然处于算法中,只是训练将最新数据加入模型练习,这种方式虽然看似综合考虑了模型对市场需求的符合程度,但是仍然面临两大缺陷。第一个是由于老数据的存在,模型在不断加入新数据的过程中面临的计算量也会越来越大,导致训练的效率也越来越低。第二个是部分旧数据不符合市场需求,模型在进行训练的过程中由于旧数据的阻碍会影响算法的准确度,所以,这种算法在使用的过程中需要进行综合考虑。
过去的多因子模型的研究成果表明,绝大部分的模型并没有根据科技和时代的更新而进行升级优化,这些模型的建立基于市场运行准则不会改变亦或者不会在短期内发生变化,因此,模型的构建者不会频繁的对模型数据和样本进行更新,这样的做法并不是不行,它存在一定的合理性。但是根据实际情况而言,市场的行情每分每秒都在发生变化,原先奉行的市场规律可能在下一个发展阶段就并不适用,因此,这样的模型并不能完全跟上市场发展的脚步,构建者必须及时的对模型中的数据和样本进行调整更新。所以,更建议使用滚动时间窗口机制来帮助构建者避免该类问题的出现。
参考文献:
[1] https://blog.csdn.net/lhx878619717/article/details/49079785
[2] https://www.cnblogs.com/sthinker/p/6837597.html
[3] https://blog.csdn.net/lhx878619717/article/details/49079785