共计 1680 个字符,预计需要花费 5 分钟才能阅读完成。
理解如何施行对抗性验证,以建设分类器来确定您的数据是来自训练还是测试集。如果能够这样做,则您的数据有问题,并且反抗验证模型能够帮忙您诊断问题。
如果您要在 Kaggle 上钻研一些获胜的解决方案,则可能会留神到对“对抗性验证”的援用(像这样)。它是什么?
简而言之,咱们构建了一个分类器,以尝试预测哪些数据行来自训练集,哪些数据行来自测试集。如果两个数据集来自雷同的散布,那应该是不可能的。然而,如果您的训练和测试数据集的特征值存在零碎差别,则分类器将可能胜利学习以辨别它们。您能够学会更好地区分它们的模型越多,问题就越大。
然而,好消息是_您能够剖析学习到的模型来帮忙您诊断问题_。并且,一旦您理解了问题,就能够解决它。
您能够在 GitHub 上找到此文章的残缺代码。
学习反抗验证模型
首先,导入一些库:
数据筹备
对于本教程,咱们将应用 Kaggle 的 IEEE-CIS 信用卡欺诈检测数据集。首先,假如您已将训练和测试数据加载到 pandas DataFrames 中,并将它们别离命名为_df_train_和_df_test_。而后,咱们将通过替换缺失值进行一些根本的清理。
对于对抗性验证,咱们想学习一个模型,该模型能够预测训练数据集中哪些行以及测试集中哪些行。因而,咱们创立一个新的指标列,其中测试样本用 1 标记,训练样本用 0 标记,如下所示:
这是咱们训练模型进行预测的指标。目前,训练数据集和测试数据集是离开的,每个数据集只有一个目标值标签。如果咱们在_此_训练集上训练了一个模型,那么它只会晓得所有都为 0。咱们想改选训练和测试数据集,而后创立新的数据集以拟合和评估对抗性验证模型。我定义了一个用于合并,改选和从新拆分的函数:
新的数据集_adversarial_train_和_adversarial_test_包含原始训练集和测试集的混合,而指标则批示原始数据集。_留神:我已将_TransactionDT_增加到特色列表中。_
对于建模,我将应用 Catboost。我通过将 DataFrames 放入 Catboost Pool 对象中来实现数据筹备。
建模
这部分很简略:咱们只需实例化 Catboost 分类器并将其拟合到咱们的数据中:
让咱们继续前进,在保留数据集上绘制 ROC 曲线:
这是一个完满的模型,这意味着有一种明确的办法能够告诉您任何给定的记录是否在训练或测试集中。这违反了咱们的训练和测试集散布雷同的假如。
诊断问题并进行迭代
为了理解模型如何做到这一点,让咱们看一下最重要的特色:
到目前为止,TransactionDT 是最重要的特色。鉴于原始的训练和测试数据集来自不同的期间(测试集呈现在训练集的将来),这齐全荒诞不经。该模型刚刚理解到,如果 TransactionDT 大于最初一个训练样本,则它在测试集中。
我之所以蕴含 TransactionDT 只是为了阐明这一点–通常不倡议将原始日期作为模型特色。然而好消息是这项技术以如此戏剧性的形式被发现。这种剖析显然能够帮忙您辨认这种谬误。
让咱们打消 TransactionDT,而后再次运行此剖析。
当初,ROC 曲线如下所示:
它依然是一个相当弱小的模型,AUC> 0.91,然而比以前弱得多。让咱们看一下此模型的特色重要性:
当初,_id_31_是最重要的性能。让咱们看一些值以理解它是什么。
此列蕴含软件版本号。显然,这在概念上与蕴含原始日期相似,因为特定软件版本的首次呈现将与其公布日期绝对应。
让咱们通过删除列中所有不是字母的字符来解决此问题:
当初,咱们的列的值如下所示:
让咱们应用此革除列来训练新的反抗验证模型:
当初,ROC 图如下所示:
性能已从 0.917 的 AUC 降落到 0.906。这意味着咱们曾经很难让模型辨别咱们的训练数据集和测试数据集,然而它依然很弱小。
论断
此办法用来评估训练集与测试集散布是否统一,以避免新的测试集呈现,导致崩盘的景象。
如果你喜爱本文的话,欢送点赞转发!谢谢。
看完别走还有惊喜!
我精心整顿了计算机 /Python/ 机器学习 / 深度学习相干的 2TB 视频课与书籍,价值 1W 元。关注微信公众号“计算机与 AI”,点击下方菜单即可获取网盘链接。