辛德蕾拉|准备数据时如何避免数据泄漏( 四 )


我们可以使用RepeatedStratifiedKFold(设置三次重复以及10折)来实现上述方案 , 然后使用cross_val_score()函数执行该过程 , 传入定义好的模型 , 交叉验证对象和要计算的度量(在本例中使用的是准确率 ) 。
辛德蕾拉|准备数据时如何避免数据泄漏然后 , 我们可以记录所有重复和折叠的平均准确度 。
综上 , 下面列出了使用带有数据泄漏的数据准备进行交叉验证评估模型的完整示例 。
辛德蕾拉|准备数据时如何避免数据泄漏运行上述代码, 首先对数据进行归一化 , 然后使用重复分层交叉验证对模型进行评估 。
由于学习算法和评估程序的随机性 , 您的具体结果可能会有所不同 。
在本例中 , 我们可以看到该模型达到了约85.300%的估计准确度 , 由于数据准备过程中存在数据泄漏 , 我们知道该估计准确度是不正确的 。
辛德蕾拉|准备数据时如何避免数据泄漏接下来 , 让我们看看如何使用交叉验证评估模型同时避免数据泄漏 。
具有正确数据准备的交叉验证评估使用交叉验证时 , 没有数据泄漏的数据准备工作更具挑战性 。
它要求在训练集上进行数据准备 , 并在交叉验证过程中将其应用于训练集和测试集 , 例如行的折叠组 。
我们可以通过定义一个建模流程来实现此目的 , 在要拟合和评估的模型中该流程定义了要执行的数据准备步骤的顺序和结束条件 。
“ 为了提供可靠的方法 , 我们应该限制自己仅在训练集上开发一系列预处理技术 , 然后将这些技术应用于将来的数据(包括测试集) 。
—第55页 , 特征工程与选择 , 2019年 。 ”
评估过程从错误地仅评估模型变为正确地将模型和整个数据准备流程作为一个整体单元一起评估 。
这可以使用Pipeline类来实现 。
此类使用一个包含定义流程的步骤的列表 。 列表中的每个步骤都是一个包含两个元素的元组 。 第一个元素是步骤的名称(字符串) , 第二个元素是步骤的配置对象 , 例如变换或模型 。 尽管我们可以在序列中使用任意数量的转换 , 但是仅在最后一步才应用到模型 。
辛德蕾拉|准备数据时如何避免数据泄漏之后我们把配置好的对象传入cross_val_score()函数进行评估 。
辛德蕾拉|准备数据时如何避免数据泄漏综上所述 , 下面列出了使用交叉验证时正确执行数据准备而不会造成数据泄漏的完整示例 。
辛德蕾拉|准备数据时如何避免数据泄漏运行该示例可在评估过程进行交叉验证时正确地归一化数据 , 以避免数据泄漏 。
由于学习算法和评估程序的随机性 , 您的具体结果可能会有所不同 。
本例中 , 我们可以看到该模型的估计准确性约为85.433% , 而数据泄漏方法的准确性约为85.300% 。
与上一节中的训练测试集划分示例一样 , 消除数据泄露带来了性能上的一点提高, 虽然直觉上我们会认为它应该会带来下降, 以为数据泄漏会导致对模型性能的乐观估计 。 但是 , 这些示例清楚地表明了数据泄漏确实会影响模型性能的估计以及在拆分数据后通过正确执行数据准备来纠正数据泄漏的方法 。


推荐阅读