当前位置: 首页 > 编程日记 > 正文

机器学习的第一个难点,是数据探索性分析

作者 | 陆春晖

责编 | 寇雪芹

头图 | 下载于视觉中国

当我们在进行机器学习领域的学习和研究时,遇到的第一个难点就是数据探索性分析(Exploratory Data Analysis)。虽然从各种文献中不难了解到数据探索性分析的重要性和一般的步骤流程,但是在面对实际问题时,往往会有不知道从哪儿下手以及不知道怎么根据分析结果来优化算法的困境。

本文通过对真实业务场景数据的探索性分析及建模与优化,尝试对其进行解构,揭示其真实的意图和作用,希望能对同行有所启示。本文采用kaggle平台上正在进行的Jane Street 市场交易预测比赛数据,该比赛要求参赛选手设计一个量化交易预测模型,利用全球主要证券所得市场数据识别最有效的交易,从而实现回报最大化。

数据探索性分析从解读数据业务背景开始

数据探索性分析首先要根据数据集所描述的主体含义,即这个数据集蕴含的背景知识,确定其所属的问题领域,通常通过对业务的深刻理解实现。

以Jane Street市场交易预测比赛数据为例,我们首先要理解这个交易预测模型的目的是实现交易牟利最大化,也就是最大限度的实现“低买高卖”,但是由于市场的波动性这个目的很难实现。

因此给定一组交易的历史相关数据(例如股票市场的)和历史回报率,希望能训练出模型,能够根据当前交易的实时相关数据,准确预测该交易的未来回报率,从而筛选出那些回报率高的交易进行操作,回报率低的交易不进行操作。通过对业务背景的解读,我们大致判断这是一个时间序列类的预测问题,根据操作和不操作两种行为,进一步判断出其是时间序列二分类预测问题。

有了对问题领域的大致判断,接下来结合业务背景知识对数据集进一步展开分析。首先观察数据集中训练集和测试集的特征列,如图1所示。

图1 训练集和测试集特征列

发现训练集比测试集多了五列特征,分别是resp_1、resp_2、resp_3、resp_4、resp,resp大致可以猜测代表回报率,可是为什么有五列回报率?我们再回到业务背景中去找答案,业务背景中描述resp_1~resp_4代表不同时间范围内的回报率。不是很理解什么含义,分析一下resp和resp_1~resp_4的相关性,使用热力图进行可视化分析。

图2 回报率各列相关性热力图

通过热力图可视化相关性发现,这五列回报率间存在很明显的相关性,并且越临近的列相关性越高。再选取前10行数据用折线图观察下各列回报率的波动状况。

图3 回报率列折线图

大致可以理解,每笔交易的回报率都是随着时间时刻变化的,resp代表交易时刻的回报率,resp1~resp4代表交易时刻前四个时点的回报率。也就是说,每笔交易的回报率本身也是一个时间序列,在预测进行交易是否进行时,可以依据当前时刻的resp值进行判断,也可以尝试依据给定时间周期内整体的回报率趋势进行判断。

如果依据当前时刻resp值进行是否交易的判断,resp<0时目标值action=0,且resp>0时目标值action=1,则数据集的目标值分布如下图(a)所示,如果依据回报率区间整体均值和最大值进行是否交易的判断,其目标值分布如下图(b)和(c)所示。回报率的使用对目标值分布有一定的影响,可能是影响模型准确性的因素之一。

图(a)        图(b)        图(c)

图4 依据回报率不同角度进行是否交易的分析

通过对数据业务背景的解读,我们已经得知所需要解决的是一个典型的时间序列二分类预测问题,并且其目标值需要通过一组时间序列来确定。

数据探索性分析以特征为最小分析单元

当对整体问题有了大致了解,接下来就需要针对具体的特征变量进行具体分析,分析从三个方面进行。

1.特征含义分析

特征含义往往结合特征变量的名称。部分特征变量往往通过名称就可以大致了解其含义,了解其特征含义可以帮助我们更好的理解数据本身,协助建模。

本文中使用的数据总共有133列特征,其中名称有意义的特征列为‘date’,‘weight’和‘ts_id’,其他列从’feature_0’~’feature_129’,明显是做过匿名处理的特征,暂不做分析。

对名称有意义的特征进行分析。其中‘ts_id’列因为标明是ID列,并且其序号从0开始到2390490无重复,与数据集行数相同,并且因为是时间序列类数据,故可认定其为按一定时间先后排序的交易序列号。

‘date’列顾名思义可知是日期类,观察其具体取值是从0~500的整数,估计每个取值代表一天,并且‘date’每个取值对应的交易数量不同,其分布如下图所示,横坐标代表’date’取值,纵坐标代表每一个’date’取值区间对应的‘ts_id’数量。可以发现交易数量的分布并不平稳,大致以date值85为界限,之前与之后的交易数据分布有明显的差异。

图5 不同日期值交易数量分布

‘weight’列含义为权重,结合背景知识中权重和回报率一起作为评价函数的输入项,并且’weight’为0的交易不影响最终评价函数的评分,大致可以判断其是一个代表交易的盈利率或者说重要性的指标。观察其分布如下图所示。

图6 权重值的分布

其中权重为0的数据大约占总数据量的17.1%,也就是说原始数据集中有17.1%的交易数据,是否进行交易对评价结果不产生影响,可以在训练模型时去掉。

接下来对‘feature_0’~’feature_129’这130维特征进行分析,虽然特征已经做了匿名处理,但是还提供了一个features.csv的文件,描述了特征的一些情况,对其进行分析。文件总共包含30个标签,分别对130维特征进行了True和False的标记,对每维特征的标签数量分析如图7所示。

图7 特征标签数量分析示意图

可以发现‘feature_0’特征比较特殊,一个标签也没有,其他特征都至少存在一个标签,最多不超过四个标签,‘feature_0’特征可能需要给与比较多的关注。

2.特征“脏数据”分析

经过前面的分析,对数据已经有了相对清晰的认知,接下来要对‘feature_0’~‘feature_129’这130维特征做“脏数据”分析,主要包括缺失值和异常值的分析。

缺失值分析可以通过统计特征集中的null值个数实现,各特征的缺失率如下图所示。

图8 特征缺失值比率分析

可以分析得知,130维特征中有88维特征存在缺失值,平均缺失率大致为2.18%,最大缺失率为16.55%,缺失率最大的四个特征是‘feature_17’,‘feature_18’,’feature_27’,’feature_28’,考虑到缺失率没有超过50%,可以先不处理,也可以在建模时用均值或者分位数填充。

异常值分析可以考虑使用箱线图,部分特征的箱线图如下图所示:

图9 部分特征箱线图分析

从图9中发现,除了‘feature_0’外,其他特征都存在许多偏离较大的异常值,可以考虑进行移除。

3.特征统计分布分析

完成特征“脏数据”分析后通常会继续对特征进行统计分布分析。

首先判断特征是否是正态分布的,对于非正态分布的特征可以考虑进行相应转换。之所以希望特征是正态分布的,是因为机器学习领域的很多模型是基于数据服从正态分布的假设,所以如果数据服从正态分布,会对模型的训练效果有比较明显的提升。可以使用Q-Q图对特征进行分析,部分特征的Q-Q图如下图所示。

图10 特征分布Q-Q图

可以发现,很多特征变量的数据分布都不是正态的,后续可以使用数据变化对其进行处理

其次对比训练集和特征集的数据分布是否一致,对于分布不一致的特征,考虑进行删除处理。本文使用KDE分布图来进行观察。130维特征中没有发现训练集和测试集明显分布不一致的特征。

图11 用KDE分布图对比训练集和测试集数据

最后对特征的相关性进行分析,用来发现特征变量和目标变量间、以及特征变量之间的关系,为特征工程中提取特征做准备。本文使用相关性热力图来进行观察。观察与目标值’resp’相关性最高的10个特征变量。

图12 特征间相关性热力图

发现一个非常有意思的现象,与目标值’resp’相关性最高的10维特征,彼此间的相关性也非常高,建模时如果选择线性回归模型,需要对相关性高的特征多加关注。

数据探索性分析为建模提供理论支撑

所有的数据探索性分析最终都是为建模进行服务的。通过上文的数据探索性分析,可以指导我们进行建模。

通过对数据业务背景的解读,我们得知需要建立的是一个基于时间序列的二分类预测模型,可以先采用决策树类模型做基础模型,本文使用了Xgboost分类模型,不对原始数据做任何处理,直接用xgboost模型进行预测分类,训练集和验证集比例为7:3时,基础得分为4078.620。

首先结合对特征含义的分析。考虑过滤掉weight特征值为0的特征,模型得分提升到4292.947,同时调整训练集和验证集的比例分布,当训练集和验证集比例为9:1时,模型得分提升到4601.8。用resp_1,resp_2,resp_3,resp_4,resp五列回归值的均值判断action取值,替代单纯的根据resp判断action取值,模型得分提升到5277.285。

其次结合对特征异常值的分析。由于使用的是树类模型,对缺失值不敏感,可以将缺失值统一处理为-999,也可以用特征的均值替代,对于树类模型来说,模型得分没有明显的提升。

接下来考虑对部分非正态分布的特征进行转化,当对标签为’feature_1’,’feature_2’,’feature_41’,’feature_42’的特征进行log变化,将其转换为正态分布时,模型得分提升到了6310.758。

根据数据探索性分析的结果,完成了第一轮的建模和优化,将模型得分从基础分4078.620,提升到了6310.758,提升率达到54.7%,效果很显著。

第一轮建模和优化完成后进入了一段瓶颈期,于是再次回到数据探索性分析,尝试解构出更多的信息。仍然从特征开始,我注意到‘date’这一列特征,作为时间序列类问题最重要的特征,应该有继续挖掘的价值。首先结合不同日期值交易数量分布图(图5),可以观察到以date=85为界限,之前的日交易频率明显比之后的高,不了解是因为什么原因导致的。根据kaggle网站上的一些建议,尝试放弃掉前85天的数据,只用后415天的数据进行建模,模型得分提升到了6390,再稍微调整下参数,最终达到了6405.901。

调整参数的时候,发现之前建模时犯了一个错误,date这维特征本身有时间约束,建模时不能用未来的数据对历史的数据做验证,所以改变了之前随机划分训练集和测试集的方式,改变使用前385天的数据训练,后30天的数据验证,模型得分提升到了7040.166,尝试调整下训练集和测试集的比例,当使用前375天的数据训练,后40天的数据验证时效果最好,模型得分为8757.05,,在第一轮的基础上又提升了38.7%。

仅仅通过两轮数据探索性分析,便极大地优化了模型,显著提升了预测的效果,由此可见其重要性。并且数据探索性分析可以持续迭代进行,不断挖掘出数据集内隐藏的一些特征,加深我们对于背景知识的理解,指引我们进行有效的特征工程,并且为建立模型和优化模型提供理论依据,是进行数据挖掘和机器学习最有效的辅助手段。

更多精彩推荐
☞明年,我要用 AI 给全村写对联☞Ant Design 遭删库!☞高手的习惯:pythonic风格代码☞对比四种爬虫定位元素方法,你更爱哪个?
点分享点收藏点点赞点在看

相关文章:

Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结

1&#xff0e;Global.asax文件的处理形式不一样 转化后将出现错误&#xff0c;在vs2003中Global.asax具有代码后置文件&#xff0c;2.0下, 将代码分离文件移到 App_Code 目录下&#xff0c;以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。“Code-behind”属性将从 …

Robotium初探秘

2019独角兽企业重金招聘Python工程师标准>>> Getting started 如果想知道robotium是如何运行、什么样子的&#xff0c;就看下面的步骤。如果想自己新建一个robotium测试工程&#xff0c;点击 此处 要使用Robotium&#xff0c;需要把Robotium.jar放在测试工程的build…

初级Java程序员所面临的4大挑战

一、编码时间过长 作为入门级Java工程师&#xff0c;每周至少编程45小时&#xff0c;而且每个月会有1到2个星期工作50至60小时。从这些数字上看&#xff0c;过去几个月里每周工作将近50小时。80&#xff05; –90&#xff05;的工作时间都耗在了电脑前。这样的数字虽然表明了享…

javascript页面跳转常用代码

这东东最难记&#xff0c;每次需要时都是重新到Google上搜&#xff0c;真是烦死了&#xff0c;这回整理一下贴到这。 按钮式&#xff1a; <INPUT name"pclog" type"button" value"GO" onClick"location.hrefhttp://9ba.cn/"> 链…

frame,iframe,frameset之间的关系与区别

2019独角兽企业重金招聘Python工程师标准>>> ■ 框架概念 &#xff1a; 所谓框架便是网页画面分成几个框窗&#xff0c;同时取得多个 URL。只需要 <FRAMESET> <FRAME> 即可&#xff0c;而所有框架标记需要放在一个总起的 html 档&#xff0c;这个档案只…

最低售价17999元,华为发布新一代折叠屏手机Mate X2,将首批升级HarmonyOS

2019年&#xff0c;华为发布第一代折叠屏Mate X&#xff0c;开启了5G折叠屏手机新纪元&#xff1b;2020年&#xff0c;华为发布第二代折叠屏Mate Xs&#xff0c;实现了折叠屏手机从硬件到生态的演进。 2月22日&#xff0c;华为举行新一代折叠旗舰发布会&#xff0c;发布全新折…

「要拼就拼运维」5分钟一台?它让我爱上工作了!

高效运维轻松管理本文转自d1net&#xff08;转载&#xff09;

JavaScript去除字符串首尾空格

function trim(str) { return str.replace(//s/g,""); } javascript去除字符串空格的函数 function jtrim(s) { var i,b0,es.length; for(i0;i<s.length;i) //去左空格 if(s.charAt(i)! ){bi;break;} if(is…

server-send event object

http://jamie-wang.iteye.com/blog/1849193 event -- onmessage, onopen, onerror 不是方法&#xff0c;而是事件 http://school.youth.cn/px/lamp/2012/1130/38537.shtml http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/index.html?cadrs http://bb…

拿来就能用!Dijkstra 算法实现快递路径优化

作者 | 李秋键责编 | 伍杏玲出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;近几年来&#xff0c;快递行业发展迅猛&#xff0c;其中的程序设计涉及到运送路径的最优选择问题&#xff0c;下面我们尝试模拟实现快递路径优化问题&#xff0c;假设为快递公司设计快递投递…

92号油的发动机能加97吗?标号越高不代表就越好

当我们买了车&#xff08;不管是二手还是新车吧&#xff09;&#xff0c;我们都能很快知道这车的发动机是加什么标号的汽油的。这些信息都能在说明书或者在加油盖附近找到。但同时很多粉丝也在问&#xff0c;我的车是92的&#xff0c;但我加97的话发动机会不会更有力更省油&…

不要跳槽!!!

在这个俗称“金三银四”的跳槽季&#xff0c;很多人都蠢蠢欲动&#xff0c;想要拿更高的薪资&#xff0c;想要去更大的平台......但我也要奉劝大家一句&#xff1a;三思而后行。确实&#xff0c;春节过后&#xff0c;大家都在为开年做准备&#xff0c;跳槽也好&#xff0c;学习…

按下回车键指向下一个位置的一个函数

functiontofocus(itemname) // 按回车置下一个位置 2{ 3vara 4aeval( " document.vouch. "itemname) 5a.focus() 6} 7 在控件中使用onkeypress" javascrip:if(window.event.keyCode13){tofocus(nextformname)}提取下一个控件名

初涉LR,关联

摘要&#xff1a;Loadrunner是一种很好的性能测试工具&#xff0c;它通过对创建Vuser脚本、定义场景、运行场景、分析结果四大模块来进行性能负载测试。 在回放脚本时有时会出现运行不成功的情况&#xff0c;有可能是因为之前所录制的参数与现实的不一致的原因&#xff0c;比如…

新型智能电视攻击,9成国外设备或受影响

在近日举办的欧洲广播联盟媒体网络安全研讨会上&#xff0c;瑞士安全研究员Rafael Scheel分享了一种针对智能电视的新型攻击方法&#xff1a;通过发送恶意数字视频地面广播信号(DVB-T)&#xff0c;实现远程控制电视设备并获得智能电视root访问权限&#xff0c;之后利用电视可以…

按esc键退出的一个函数

1functionesckey(keycode) // 按esc键退出2{ 3if (keycode 27 ) 4{ 5window.close() 6} 7}

Linux挂载卸载光盘实践

在Linux下有时候需要挂载光盘&#xff0c;拷贝文件或安装系统&#xff0c;例如拷贝Redhat操作系统镜像文件等。下面介绍一下在Linux系统下挂载、卸载光盘的方法。 在Linux系统中&#xff0c;每一个物理设备都可以看做是一个文件&#xff0c;而像硬盘、光盘等物理设备文件都在/d…

程序员晒元宵节福利,网友:看了我想砸键盘......

再过几天就到元宵节了&#xff0c;又到了互联网大厂晒福利、拉仇恨的时候了。小编在脉脉上看到许多不愿透露姓名的网友的爆料&#xff0c;一起来看看吧。有的网友说收到了汤圆&#xff0c;还有员工说收到了四盒草莓&#xff0c;但是还有网友透露自己喜提加班&#xff0c;更有甚…

tomcat_deploy 平滑启动脚本

1.此脚本需要nginx安装ginx_upstream_check_module 配置完成平滑重启 2.脚本内容如下&#xff1a; 1 #!/bin/bash2 cat <<MADAY3 ---------------------------------------------------------4 -------------------------------------------------------------5 A)服…

判断输入是否为中文的函数

1functionischinese(s){ 2varrettrue ; 3for ( vari0 ;i < s.length;i) 4 retret &&(s.charCodeAt(i) > 10000 ); 5returnret; 6 }

OpenERP与Python 元编程

Python元编程被称为“黑魔法”。Python界的传奇人物Tim Peters有云&#xff1a; 引用 Python的元编程这种黑魔法99%的人都无需了解&#xff0c;如果你拿不准是否应该用到它时&#xff0c;你不需要它. OpenERP基本遵循了Tim Peters的教诲&#xff0c;但是却在6.1版本之后忍不住触…

联手中科大、浙大、华科大等高校,阿里研发4项最新AI安全技术

随着互联网技术对抗环境日益复杂化&#xff0c;各大网络平台页面可供用户上传并做展示的内容&#xff0c;都可能面临恶意攻击&#xff0c;例如黑灰产团伙会发布色情等不良图片和视频&#xff0c;以及发布可能涉嫌抄袭侵权的商品或其他违规信息&#xff0c;甚至一些黑灰产团伙还…

联想S820 MIUI刷机包 MIUI 4.4.30 流畅执行 在线主题破解

ROM介绍 破解免费使用MIUI全部主题(方法&#xff1a;开机开启Root权限&#xff0c;进入WSM工具箱→安装二进制文件→重新启动→再次进入WSM工具箱→两个工具打上勾→重新启动)&#xff0c;然后尽情奔放吧 .加入V4A音效 .加入安卓4.4切换特效 .加大外放音量。不爆音 .集成 WSM …

列表框操作函数集合

1 /*列表框互相操作函数集 */23// 描述: 添加不重复列表框元素4functionselAdd( srcList, dstList )5 {6varselectedIndex newArray();7varcount 0 ;89for( i0 ; i < srcList.options.length; i ){1011if( srcList.options[i].selected ){1213selectedIndex[count] i;14…

看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画

作者 | 神经小兮来源 | HyperAI超神经头图 | 下载于视觉中国把影视剧变成漫画&#xff0c;是怎样的一种神操作&#xff1f;来自大连理工大学和香港城市大学的团队&#xff0c;最新提出的 AI 框架&#xff0c;可自动将影视剧转换为漫画。从此&#xff0c;观影追剧又多了一种打开…

跨越企业的“中等收入陷阱”

在国际经济学中&#xff0c;有一个“中等收入陷阱”的概念&#xff0c;含义为&#xff1a;新兴市场国家突破人均GDP1000美元的“贫困陷阱”后&#xff0c;很快会奔向1000美元至3000美元的“起飞阶段”&#xff1b;但到人均GDP3000美元附近以后&#xff0c;快速发展中积聚的矛盾…

docker 数据卷与容器卷

2019独角兽企业重金招聘Python工程师标准>>> 容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09; 数据卷容器&#xff08;Data Volumes Dontainers&#xff09; 数据卷 使用-v可以挂载一个本地的目录到容器中作为数据卷。 [root…

document.all与WEB标准

1、DOM  WEB标准现在可真是热门中热门&#xff0c;不过下面讨论的是一个不符合标准的document.all[]。DOM&#xff0d;&#xff0d;DOCUMENT OBJECT MODEL文档对象模型&#xff0c;提供了访问文档对象的方法.例如文档中有一个table,你要改变它的背景颜色&#xff0c;那就可…

终于有人把Python讲清楚了!

经常有人问我&#xff0c;Python初学者该怎么学好Python&#xff1f;其实从事Python开发的这些年中&#xff0c;我见过很多相关的教程和书籍&#xff0c;他们大都这样讲 &#xff1a;先介绍 Python 的基本语法规则、list、dict、tuple 等数据结构&#xff0c;然后再介绍字符串处…

开源 免费 java CMS - FreeCMS1.5-建站向导

2019独角兽企业重金招聘Python工程师标准>>> 下载地址&#xff1a;http://code.google.com/p/freecms/ 建站向导 从FreeCMS 1.5开始支持 为了方便用户创建站点&#xff0c;系统提供了建站向导功能。 从左侧管理菜单点击建站向导进入。 第一步&#xff1a;创建…