20.12 使用k折交叉验证评估神经网络
问题描述
使用k折交叉验证评估一个神经网络。
解决方案
一般来说,没有必要使用k折交叉验证评估神经网络,也不推荐使用。
但如果是以下的情况,那么可以使用k折交叉验证评估神经网络:用Keras的scikit-learn封装器让Keras的sequential模型使用scikit-learn的API。
讨论
从理论上来讲,没有任何理由不能使用交叉验证评估神经网络。但是,神经网络经常用于非常大的数据集而且可能需要几小时甚至几天来训练,所以如果训练时间很长的话,采用k折交叉验证就会增加计算开销,这并不是一个值得推荐的做法。比如,对于一个通常需要一天来训练的模型,如果使用10折交叉验证评估,就要花10天的时间。如果数据量非常大,常见的稳妥做法是用某个测试集评估神经网络。
如果数据规模不大,k折交叉验证可以被用于最大化我们评估神经网络性能的能力。在Keras中,这是可行的,因为我们可以“封装”所有的神经网络,使它们能使用scikitlearn中的评估特性,包括k折交叉验证。为了实现这一点,必须先创建一个函数,返回编译好的神经网络。接着,使用KerasClassifier(这里假设有一个分类器,如果是回归分类器,就应该使用KerasRegressor)来封装模型,使它可以被scikit-learn使用。然后,神经网络就可以像其他scikit-learn的学习算法(比如随机森林、逻辑回归)一样被使用了。在本节的解决方案中,我们对神经网络使用了cross_val_score来运行一个3折交叉验证。
本书评论