社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习中的数据泄露原因和预防策略!

人工智能学习指南 • 2 月前 • 137 次点击  

在数据预处理、特征工程和训练测试集划分等关键步骤中,防止数据泄露至关重要。

数据泄露的定义:在机器学习中,数据泄露指的是训练数据集之外的信息渗透到模型构建过程中,导致性能指标虚高,模型无法泛化到新的未见数据。

数据泄露对机器学习模型的影响是深远的,主要包括:

模型过拟合:由于模型在训练过程中接触到了不应接触的信息,导致模型对训练数据过度拟合,而在新数据上的泛化能力下降。

性能评估失真:数据泄露会导致模型在测试集上的表现过于乐观,从而无法准确评估模型的真正性能。

实际应用效果不佳:当模型被部署到实际应用中时,由于无法获取到训练时使用的额外信息,其性能会显著下降,无法满足实际需求。

本文将深入探讨七种常见的数据泄露原因,希望能帮助大家规避这些问题。


问题背景设定:

为了更好地解释数据泄露,我们设想一个假设的机器学习用例:

假设你是一家大型信用卡公司的数据科学家,每天都有数百万笔交易被处理,其中不可避免地包含一些欺诈交易。

你的任务是构建一个能够实时检测欺诈的模型,你拥有包含已知欺诈案例的历史数据,这构成了一个典型的分类问题,且数据不平衡,因为欺诈交易通常占总交易量的很小一部分。

手头的一些特征包括:

  • 交易相关特征:交易金额、货币、时间、账单地址、类型(线上与线下)、地点等。

  • 卡片相关特征:信用额度、卡片余额、卡片类型、持卡时间等。

  • 商户相关特征:商户名称、商户类别、商户地址等。

  • 客户相关特征:客户地址、年龄、收入、消费历史等。


数据预处理中的常见错误:

为了准备数据集以供模型开发,通常会进行必要的数据转换步骤,如数值特征缩放、类别变量编码和缺失数据填充。

这些转换可能涉及从数据集的多行中计算分布或度量指标。

因此,如果在分割训练集和测试集之前对整个数据集应用这些转换,就存在将测试集信息泄露到训练过程中的风险。


如果大家想更进一步学习机器学习、深度学习、神经网络技术的可以看看以下文章(文章中提到的资料都打包好了,都可以直接添加小助手获取)


<


 人工智能资料分享 



>








人工智能60天学习计划(点击图片即可跳转)











深度学习中文教程书(点击图片即可跳转)


神经网络最全学习资料(点击图片即可跳转)


以下是可能发生的情况:

错误1:使用完整数据集缩放数值特征

在我们的欺诈检测案例中,有许多数值特征,如交易金额和持卡时间。

某些机器学习模型(如带有L1或L2正则化的逻辑回归)要求标准化数值变量,因为正则化会惩罚大系数。

这通常涉及计算特征的均值和标准差(如使用scikit-learn的StandardScaler)。

如果使用整个数据集来计算交易金额的分布,并应用于标准化训练集和测试集,那么实际上是将未见数据(测试数据)的交易信息暴露给了训练过程。

因此,我们应该仅使用训练集的均值和标准差来标准化训练集和测试集中的交易金额。


错误2:对整个数据集进行目标编码

许多机器学习模型仅接受数值变量,因此我们需要将类别变量编码为数值变量。

除了常见的独热编码外,目标编码是另一种流行的方法。

目标编码用从目标变量(此处为欺诈或非欺诈)派生出的数值值替换类别。

这通常涉及计算每个类别的目标均值(例如,每个商户类别的欺诈率)。

如果从整个数据集中计算均值,那么又将测试集中关于目标数据的重要信息泄露给了训练集,因为测试集中包含了欺诈交易。

因此,我们应该仅使用训练数据来计算每个类别的目标均值,并将学习到的编码应用于测试集。


错误3:使用测试集信息填充缺失值

在真实世界的数据集中,缺失数据是常态,例如,我们可能无法获取每位客户的收入信息。

一种常见的方法是使用中位数值(即非空行的中位数客户收入)来填充缺失的数值。

出于同样的原因,应该仅从训练集中计算中位数值,而不是整个数据集,并应用于两个集合。

通过以上策略,可以有效减少机器学习中的数据泄露风险,确保模型的准确性和泛化能力。


错误四:在数据分割前进行上采样/SMOTE

如前所述,欺诈检测通常是一个不平衡的分类问题,其中欺诈交易仅占很小一部分。

重采样,特别是上采样(复制少数类记录),是平衡数据集的一种有用技术。

但如果在将数据拆分为训练集和测试集之前进行上采样,相同的欺诈案例可能会同时出现在两者中,导致性能人为偏高。SMOTE(合成少数类过采样技术)是处理不平衡数据集的另一种常用方法。

类似地,如果在训练测试分割之前应用它,由测试数据生成的合成样本可能会将信息泄露到训练集中。

因此,这些不平衡数据集的处理方法应仅应用于训练集——一旦训练集通过上采样或SMOTE进行了增强,就应该在增强的训练集上训练模型,并在原始测试集上评估性能。


特征工程中的错误

准备好数据集后,就可以开始作为特征工程一部分来创建新特征了。

然而,这也存在数据泄露的风险。


错误五:在特征工程中使用未来数据

在欺诈检测中,消费行为的突然变化往往是一个危险信号。

因此,可能会创建如交易金额与平均金额之比的特征,来衡量某笔交易与客户平均消费相比的异常程度。

但我们应该使用哪些数据点来计算这个平均值呢?

为避免数据泄露,我们需要确保不使用未来数据,因为在进行实时交易预测时,这些数据将不可用。

在这种情况下,仅应使用过去的交易来计算平均消费。


训练测试分割中的错误

虽然将数据随机拆分为训练集和测试集很常见,但并非总是合适。某些分割策略可能会无意中导致数据泄露,使模型在训练过程中“看到”测试数据。


错误六:训练集和测试集数据重叠

我们的欺诈检测数据集是在交易层面上的,这意味着它将包含来自同一客户的多个交易记录。

欺诈者往往会在短时间内进行多次类似的欺诈交易尝试。

如果随机地将数据拆分为训练集和测试集,来自同一客户的交易可能会同时出现在两者中,从而使模型能够“学习”到测试数据。

解决方案是使用组洗牌分割而不是随机分割,它在客户层面进行训练测试分割,确保来自同一客户的交易在分割过程中保持在一起。这确保了模型是在真正未见过的数据上进行测试的,并能更好地泛化到新客户。


错误七:未对时间序列数据使用时间分割

在处理时间序列数据(如股票价格、天气模式、用户活动日志)时,在训练测试分割中保持时间顺序至关重要。

随机分割数据可能导致严重的数据泄露,因为模型将学习在预测时不会出现的未来事件。

假设一个新的机器学习用例,想要预测客户的未来交易金额。

随机分割数据集可能会导致未来的交易影响训练集,相反,应该使用时间分割,其中测试集中的所有数据点都发生在训练数据之后。这反映了现实世界场景,即预测总是基于历史数据进行的。


结论

在构建机器学习模型时,我们经常将数据预处理、特征工程和训练测试分割作为单独的步骤来讨论。

然而,它们之间有着深刻的联系,一个步骤中的错误可能会影响整个建模过程。

如上例所示,这些步骤的顺序需要精心设计以避免数据泄露。

在我们的例子中,你应该遵循以下顺序:


  • 数据收集

  • 训练测试分割

  • 数据预处理(仅基于训练数据)

  • 特征工程(仅使用预测时可用的信息)

  • 模型训练和评估


为了防止数据泄露,请始终问自己两个关键问题:

  • 是否将测试集的信息暴露给了训练过程?

  • 是否使用了在进行预测时将不可用的未来数据?


这两个问题将帮助你避免过于乐观的性能指标,并构建能够很好地泛化到新数据的模型。

我们还应该将相同的原则应用于交叉验证过程,以确保每个折叠也不存在泄露。


如果大家想更进一步学习机器学习、深度学习、神经网络技术的可以看看以下文章(文章中提到的资料都打包好了,都可以直接添加小助手获取)


<


 人工智能资料分享 



>








人工智能60天学习计划(点击图片即可跳转)











深度学习中文教程书(点击图片即可跳转)


神经网络最全学习资料(点击图片即可跳转)



大家觉得这篇文章有帮助的话记得分享给你的朋友、同学、闺蜜、敌蜜、死党!

B站:AI秃秃学长小墨



关注小墨

获取最新AI技能+最肝AI干货

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/174314
 
137 次点击