机器学习中的特征穿越

评估穿越

评估穿越是机器学习系统中一个常见而又隐蔽的问题,会导致对模型做出不准确的评估结果,进而影响对模型的选择和调优。本文以两种最常见的穿越方式为例,介绍一下评估穿越,以及带来的问题和解决方案。

什么是评估穿越?

首先我们来回顾一下ML系统中的评估一般是怎么做的。为了便于描述,我们假设一个训练和评估均为离线进行的场景,但是本文的讨论同样适用于在线的训练和评估。

在拿到样本数据之后,做了必要的清洗和采样之后,我们会将样本分为训练集(train)和测试集(test)(有时还会再分一份作为validation),我们会在训练集上训练出模型,然后在测试集上对模型的效果进行评估,具体来说,我们会计算各种指标出来,例如准确率、召回率、AUC,MAP等等。我们之所以要将样本划分为训练集和测试集,主要目的就是希望在测试集上做评估,而不是在训练集上做评估,防止发生过拟合,进而使得评估结果更加准确。

评估穿越,指的就是由于样本划分不当,导致测试集中的信息“穿越”到了训练集中,导致评估结果会更偏爱过拟合的模型,从而导致评估结果不够准确。这么说比较抽象,下面我们以最常见的两种穿越为例,认识一下穿越究竟是怎么发生的。

时间穿越

机器学习的课本中告诉我们,拿到数据集后,需要将其按照一定比例分割为训练集和测试集,训练集用来训练模型,而测试集用来评测效果。要实现这个目的,最简单的实现方法,就是对于每条样本做一次随机选择,来判断将其放到训练集还是测试集。

但是这种实现方法,会导致一个问题,就是我们称之为“时间穿越”的问题。假设我们的样本数据包含了七月份和八月份的用户行为,按照上面的方法进行划分的话,划分的结果就是训练集和测试集中都可能含有七月和八月的数据,这样的数据在训练时没有问题,但是在预测评估时,会导致数据指标优于实际情况,例如,真的的AUC应该是0.7的话,那么在这样的数据集上评估出的结果就会大于0.7。

为什么呢?大家都知道训练集上训练出来的模型是不能在训练集上进行评估的,因为训练集上的评估结果会更偏好过拟合的模型,导致我们错误评估了模型的泛化能力。这就好比用来练习的试卷不能用来考试,因为这样会导致死记硬背的学生分数更高,而不是学习能力强的学生。类似的,在上面的例子中,由于训练集和测试集中都包含了七月和八月的数据,这就好像考试卷子中虽然没有包含练习试卷的题目,但是包含了非常相似的题目,也会导致我们错误判断一个学生的学习能力。究其根本原因,是因为在实际场景中,数据行为都是在快速变化的,相近时间内的行为存在一定的相似性,时间相差越远行为差异越大。这一点和一个稳定数据分布场景是完全不同的,如果数据分布在时间维度上是相对稳定的,那么时间因素就不是一个那么重要的因素,相互穿越带来的问题就会比较小。

换一个角度来说,我们的模型在训练完成之后,用到线上预测真实数据时,预测的数据不仅是训练模型时没有见到过的,而且在时间上也是一定晚于训练模型时的数据的。那么我们在训练和评估时也要尽量还原这样的场景,否则得到的评测结果就会和真实结果产生偏差。

所以说,要想避免时间维度的穿越,应该在划分训练和测试样本时要将时间维度加以考虑。

sklearn划分数据集
trn_x, val_x,trn_y, val_y = train_test_split(x_train, y_train, test_size=0.3, shuffle = false)

random_state :(非必需) int 类型,默认值为None。随机数的种子。
随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。不填的话默认值为False,即每次切分的比例虽然相同,但是切分的结果不同。

shuffle :(非必需) 默认为True,打乱。控制拆分数据前,原始数据集是否需要打乱再拆分。
设置为false可避免时间上特征穿越

参考:
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split

https://blog.csdn.net/DebugYing/article/details/122477435

https://blog.csdn.net/qq_39355550/article/details/82688014

会话穿越

以电商网站的推荐为例,用户在浏览一个商品时,某个推荐模块会为他推荐多个商品进行展现,用户可能会点击其中的某几个,其他的则不会点击。为了描述方便,我们将这些一次展现中产生的点击和未点击数据合起来称为一次会话(不同于计算机网络中会话的概念)。

在上面描述的样本划分方法中,一次会话中样本可能有部分被划分到训练集,另外部分会划分到测试集。这样的行为,我们称之为会话穿越。会话穿越的问题在于,由于一个会话对应的是一个用户在一次展现中的行为,所以是存在较高相关性的,穿越会带来类似上面提到的用练习题考试的问题;此外,会话本身是不可分割的,也就是说,在线上使用模型时,不可能让你先看到一次会话的一部分,然后让你预测剩余的部分,因为会话的展现结果是一次性产生的,一旦产生后,模型已经无法干预展现结果。这就好比说模拟考试时老师告诉你说是开卷的,于是你很开心地考了90分,但是到了真实考场上时,考试却是闭卷的,那么你可能只能得到70分。原因就在于你在模拟考试时利用了你在真实考试时无法利用到的信息。

所以在处理涉及到会话的样本时,最好是以会话为单位对样本进行划分,以免出现会话穿越的问题。

穿越的本质

上面我们用两种类型的穿越,向大家介绍了穿越问题,但是这两种穿越,以及我们没有介绍到的其他类型的穿越,里面的核心问题是什么呢?

首先是一个信息泄露的问题。无论是时间穿越,还是会话穿越,其核心问题都在于在训练数据中的信息以不同方式、不同程度泄漏到了测试数据中。我在其他文章中也简单介绍过,机器学习本质上就是信息的游戏,信息的泄露必然会导致评估结果发生偏差。

其次是场景真实性的问题。上面的两种穿越问题中,线下训练测试的场景,都和线上真正预测未知数据的场景有着偏差,从而导致了评估结果的偏差。举个极端的例子,就好比慈溪在颐和园风平浪静的昆明湖训练水兵,然后去波涛汹涌的大海上和敌人打仗,焉有不败之理。

所以大家无论是在处理样本时,还是在处理特征时,需要对信息泄露和场景真实性问题加以注意,这两个问题可能会以各种形态出现在机器学习系统中,稍不留神可能就会被捉弄。

总结

本文用两种最为常见的场景介绍了评估穿越这样一个机器学习系统中常见而又隐蔽的问题,之后通过进一步抽象指出了信息泄露和场景真实性这两个更为泛化的问题,希望能够引起大家的注意。

参考:
https://blog.csdn.net/phrmgb/article/details/79997057

### 机器学习中的特征选择方法 在构建有效的机器学习模型过程中,特征选择扮演着至关重要的角色。通过精心挑选最能代表数据本质的特征,可以显著提高模型的表现力并减少过拟合的风险。 #### 基于过滤的方法 这类技术依赖统计测试来衡量输入变量与目标变量之间的关系强度。常见的度量标准包括卡方检验、互信息以及皮尔逊相关系数等。这种方法独立于所使用的具体学习算法,因此具有较高的通用性和灵活性[^2]。 #### 包裹法(Wrapper Methods) 包裹法直接利用预测模型来进行评估,通常会迭代地增加或移除某些特征组合,并观察这样做对于最终性能指标的影响。递归特征消除(RFE)及其变体RFECV就是典型的例子;前者允许用户自定义希望保留下来的特征数量,而后者则借助交叉验证机制自动寻找最佳子集大小。 #### 嵌入式方法(Embedded Methods) 嵌入式的策略是在训练期间同步完成特征的选择工作。Lasso回归就是一个很好的案例——它不仅能够估计参数权重,还能自然地实现稀疏化效果,即让不重要维度对应的系数趋向零从而达到降维的目的。此外像XGBoost这样的梯度提升框架也内置了类似的正则项用于控制复杂度[^3]。 为了防止时间序列场景下的“特征穿越”,应当特别注意确保所有参与建模的历史记录均不会泄露任何有关未来时刻的信息。这意味着当处理此类特殊结构的数据集时,需谨慎设计实验流程以维护因果顺序完整性[^4]。 ```python from sklearn.feature_selection import RFE, RFECV from sklearn.svm import SVC # 使用RFE进行特征选择的例子 estimator = SVC(kernel="linear") selector = RFE(estimator=estimator, n_features_to_select=5).fit(X_train, y_train) # 获取被选中的特征索引 selected_indices = selector.support_ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值