Advertisement

数据挖掘实战——交通大数据预测II

阅读量:

在过去的两个月里,在阿里天池完成了这项赛事。首次系统性地参与数据挖掘比赛后,在第一赛季至第二赛季间完整地经历了一个完整的流程。每天都会提出新的想法,并不断学习和掌握新的方法,并运用编程的方法实现了这些想法。观察到自己建立模型的平均绝对误差(MAPE)持续下降的过程中那种成就感也是无可比拟的。经过这段时间的努力付出与积累的经验让我更加清楚自己擅长的方向与领域,并对未来的职业规划也有了更为明确的目标:希望未来能够在大数据与人工智能领域继续深耕并有所建树。这次比赛让我更加坚定了这条道路的信心同时也激励着我在接下来大学三年中继续挑战各类相关赛事以不断提升自己的专业能力

第一赛季:

初次接触数据挖掘大赛。

在数据挖掘竞赛中这是我首次参与。虽然之前曾参与过类似的比赛且其类型大致相同,但那次只是对数据进行初步分析,随后采用统计量进行填补工作。本次比赛中我们准备采取更加积极的态度,运用机器学习模型来生成预测结果,并重点介绍大名鼎鼎的Xgboost算法。关于Xgboost的优势,我将 elaborate on its strengths in a future blog post.

第一次提交结果。

第一天的时候,并未对任何数据进行深入研究(实际上后续也没有进行过系统的分析),而是直接填充了一个历史中位数值。当时并未完全理解为何采用如此简单的中位数来填补结果这一做法(即认为这或许是我们所犯的一个重要错误)。第二天早上醒来后快速浏览了线上结果页面,在查看了MAPE值(约为0.4284)并查看了当天排名发现其位居第25名时感到较为满意,并未对其他问题给予过多关注。然而在第二个赛季开始后才意识到这一行为存在问题,并试图通过对比第一赛季的结果来验证该方法的有效性却因缺乏详细的线下验证日志而陷入困境(即未能获得足够的数据支持)。随后对这一统计量进行了进一步优化但提升效果并不显著(即认为这一改进的作用有限),从而认识到在KDD CUP竞赛中取得良好效果的方法并不一定适用于所有场景(可能与本次比赛的数据规模有关)。当数据量较大时模型训练会更加完善预测结果也会更加接近真实值——这是我的基本理解

Xgboost建模。

由于之前在Sklearn中进行线性回归建模的经验丰富,在初次尝试Xgboost建模时,并未遇到太大的困难。然而,在训练与测试数据集中需遵循libsvm格式的要求,在尝试将数据转换为libsvm文件的过程中因格式问题导致了一系列麻烦。后来我发现可以直接通过numpy导入二维数组来解决这个问题。说实话这个经历留下了不少教训。

第一次建模完全未进行任何特征工程化处理,并未实施任何数据预处理操作。此时数据的质量尚算一般。我们只选择了历史期中位数以及路长这两个关键性指标作为模型输入参数。选择6月6日至7日的时间段作为训练数据集,并将6月8日的数据用于模型验证。最终在线上测试中的平均误差值达到了0.3540这一令人满意的数值表现。相比仅依赖统计特征计算的MAPE指标而言提升了约7%。Xgboost果然名不虚传!然而,在开始项目初期时我对这种做法感到异常不适因为这与常规建模思路相比显得有些别扭经过反思我发现这种做法实际上建立了一个历史期中位数与真实值之间的直接映射关系而并非通过模型在历史数据与未来数据之间建立映射关系因此才会感到别扭

第一次建模完全未进行任何特征工程化处理,并未实施任何数据预处理操作

改变别扭。

在第二次建模过程中, 我们采用了不同的方法, 上一次建模时是以时间为主要维度进行预测, 而这一次选择以日期为主要维度进行预测. 最终, 我们选择了历史中位数, 预测时间前两小时的旅行时间, 路长这三个特征展开建模, 最后的整体表现得到了显著提升, 在线平台的预测精度达到了0.3273. 这一改进的原因有两个方面: 其一可能是小时时间段内的数据波动较为明显; 其二是由于这种模式下的数据样本数量相对较少. 因此在采用第二种模式后取得了更好的效果. 在第二赛季开始时, 我们又尝试使用了包含更多特征的第一种模型来进行预测, 但最终其效果比第二种模式差了约2%. 当时我们尝试将第一种模型输出的结果作为第二种模型的输入特征, 但未能成功实现这一目标.

增加特征。

在改进建模方法之后,在原有模型基础上又增加了若干个额外的特征,并将原有提取近3个月数据中位数作为特征进行了扩展。采用类似的方法又增加了多个相关性指标,在这一过程中带来的显著提升是显而易见的;然而这些新增指标的整体效果并不十分理想。经过进一步思考发现,这主要是因为这些新增的特征主要集中在相似的数据维度上,在一定程度上存在重叠性;因此它们对模型带来的显著提升并不十分明显。

窗口平滑。

通过增加特征的方法来提升模型性能时,我们对原始数据进行了进一步优化数据质量,并采用了一种更为精细的数据预处理方式。具体而言,在初步的数据清洗后又引入了额外的数据增强操作以弥补原始数据可能存在的不足。随后,在初步的数据清洗后又引入了额外的数据增强操作以弥补原始数据可能存在的不足。随后,在初步的数据清洗后又引入了额外的数据增强操作以弥补原始数据可能存在的不足。随后,在初步的数据清洗后又引入了额外的数据增强操作以弥补原始数据可能存在的不足。随后,在初步的数据清洗后又引入了额外的数据增强操作以弥补原始数据可能存在的不足.

更换目标函数。

在初赛最终一天时我们确定了一种提升模型性能的有效方法这一发现成为了进入第二赛季的关键因素在最初阶段我们采用Xgboost算法时为了适应比赛所使用的MAPE评价指标我们采用了对目标变量取自然对数的方式进行数据变换这一操作当时的我不清楚其背后的理论依据Xgboost算法本身的目标函数是基于残差最小化的(y - y')²形式然而由于MAPE指标要求评估(y - y')/y的变化我们进行了变量变换处理通过对数变换将原始问题转化为计算ln(1 + (y - y')/y)的形式这实际上等价于对原始误差项进行了泰勒展开的第一阶近似然而由于这种方法仅考虑了一阶项精度不足因此我们需要设计一种更为精确的损失函数最终经过优化我们的模型评估值达到了0.3064从而成功晋级至第二赛季

第二赛季:

第二赛季的比赛采用了线上平台赋予权限的新模式。我不习惯仅限于使用SQL来进行数据操作。但线上操作往往需要较长的时间。最后,在我几乎要放弃的时候的那一刻起始随后,在我几乎要放弃时的那一刻之后的比赛突然释放了完整的数据集,并允许线下使用这些数据进行分析工作。这给了我重新参与的动力

第二赛季的首次提交。

在本次提交中, 我们采用了历史中位数作为填充值. 因为更换了数据集的原因, 第一次提交的表现达到了0.3105, 排到了首页.

建模。

我们采用了之前的工作流程,在可视化平台上运用了GBDT算法进行模型构建。然而,在线上的测试平台确实存在诸多困难因素导致难以进行参数调整,并且运行速度较慢。实验结果令人不是很满意;事实上,在第一赛季中采用合理方法进行模型构建时的效果提升显著(提升了约10%)。最初我们认为可能的原因是多个时间段同时进行模型构建时的影响较大;然而,在随后分开构建后仍未能取得预期效果。我认为其中最主要的因素在于参数调节问题;当然还存在其他可能的原因

开放平台。

那天清晨我因睡眠不足而感到头晕时,老师突然发来短信通知,让我感到非常高兴。使用第一赛季的数据训练出的模型表现良好,但切换至第二赛季的数据进行建模后,模型的效果并未达到预期,提升至MAPE值为0.2712仍显差距。尽管如此也付出了不少努力,毕竟,在线下的学习环境对我们来说还是比较熟悉,但在线上提取特征确实非常具有挑战性!

增加特征。

基于以往的经验,在无法进一步提升模型性能的情况下,我们就开始尝试继续提取更多特征。我们借鉴了2017KDD CUP答辩PPT中的方法论,并逐步增加了最大值、最小值、标准差、峰度和偏度等统计量作为新特征。然而增加这些特征对模型性能的提升作用却不明显,效果仅微弱地有所提升。即使如此,在当时看来也没有其他显著提高效果的方法可用。也只能也只能逐步增加更多的特征。

去噪

对于中位数这一特征而言,在抗噪声方面具有天然优势;然而,在平均值(尤其是最大值和最小值)等方面,则较为敏感于噪声的影响。因此,在分析过程中我对数据进行了三次δ级去噪处理,并将明显偏离正态分布的数据点替换成中位数数值;不剔除这些异常数据的原因是因为某些特殊特征能够容忍一定程度的噪声干扰。此外,并不确定是否通过去噪处理增强了这些特性的表现能力

ZSCORE变换

后来我们进一步发现了一个通过引入ZSCORE变换来增加数据集信息量并实现正则化的有效方法。应用该方法后效果提升并不显著然而这使得迭代所需步数显著降低原本需要4000步才能完成的任务现在只需2500步即可完成总体而言这种方法的效果提升并不显著

经验和教训。

基本问题是数据集构建存在问题,在线下的数据源质量有待提升,并且缺乏规范性;此外代码结构混乱且缺少必要的组织性;同时在实验过程中未能建立完善的实验记录机制

总计以我的菜逼水平,到rank28已经很开心了。

全部评论 (0)

还没有任何评论哟~