本节以R语言为例(Python等其他语言类似),介绍机器学习中数据框及相关操作的一些技巧,期望帮助读者建立起机器学习中数据处理的一些好的习惯,继而触发探究的兴趣,即在数据分析中,尽量使用数据框操作是一个好习惯(就如同MATLAB中尽量采用向量或矩阵运算)。
任何工具软件都需要“巧妙”利用。比如在使用SPSS Modeler软件的时候,经常有用户抱怨其不够灵活,因为SPSS Modeler软件严格执行以数据框操作为中心,作为一个拖拽式建模软件,从操作界面中就限制了循环等标量计算的习惯,这样的限定比R、Python语言等脚本式语言还要强很多。但如果认真思考,就会发现这些抱怨的场景用数据框操作都是可以实现的,更多抱怨来源于思维的“惯性”和“惰性”。很多用户甚至以Java/C语言的思路去使用R、MATLAB等科学计算/数据分析工具软件,没有利用好工具软件设计背后的初衷和数据结构。也有人辩解循环等标量操作比数据框操作在效率上高,这种说法在特定情形下有道理,关键是要搞清楚“效率高”指的是“计算机的计算效率”还是“人的开发效率”,很多高级语言本来就是牺牲一些计算效率换取开发效率。
为深入了解R语言使用技巧,大家可以研究流行的package的源代码(特别是大神写的代码)、查看R语言的基础设计与代码(也粗浅了解LAPACK、BLAS等基础算法代码)、阅读一些高级教程(比如,Hadley的 Advanced R 、张丹的《R的极客理想》等)。除了这些学习手段外,更重要的是保持“极致”的心思去琢磨一些“好玩”的软件特征。
问题描述: 很多时序分析项目中,通常需要加工各种累积等特征量(比如,静稳天气累积时间、开机时长、高负荷运行时长)。以如下数据为例:
假设spd≥6为高负荷运作,一旦spd<6,从0开始累积,计算每个时刻的累积高负荷运作时间(不允许用循环)。
提示:
cumsum/cummax都是primitive函数,执行效率很高。
扩展: 如果考虑传感器采集噪声,允许中间2个连续点处于[4,6),但不进入累积时间;但①一旦低于4或②超过2个连续点处于[4,6),从0开始。请思考如何实现。
问题描述: 目标是统计机器在不同开机周期的开机温度的分析。原始数据包括2个数据集,数据集#1是开工周期数据,有开工周期编号、开始时间、结束时间3个字段数据集#2是设备状态监测数据,有时间戳和温度2个字段,每5min一个点,但可能存在缺失。我们需要将这2个数据合并出一个数据框,记录不同开机周期内,不同时间点的温度。
为演示明晰起见,数据集#1中只包含了3个开机周期,如下所示:
数据集#2中只包含了64行数据,前20行如下表所示,可以看出:①监测数据的时间点与开关机时刻不一定重合;②状态监测数据在10:58—11:28间存在数据缺失,这样第2个开机周期前25min存在数据缺失。
典型做法: 从表面上看,如果不用循环,上面2个数据集的合并不好做,其实多动一点“歪心思”,没有解决不了的问题。下面给出一个解法做启发(应该还有很多其他解法,留给大家自己思考),代码如下:
可以看看tmpDF的前36行,重点观察tmpField1、tmpField2的数值
(续)
问题描述: 下图所示是stl函数画图输出,有几个特点:①4个子图共用一个 x 轴;② y 轴的刻度左右切换(为了防止拥挤);③每个子图的最右边给出了数据的分布范围(一倍方差的范围)。这幅图是用最原始的plot实现的,不复杂但涉及一些有用参数的设置。请问这些是如何实现的?
提示:
·子图的无缝拼接可以参考mar、oma等par参数设置(就是设置四个边沿);
·前面3个子图的坐标刻度、label不显示可以通过xlab="",axes=FALSE实现;
· y 轴刻度显示位置在axis中设置(能用向量运算的不要用循环):
·分量的分布范围可以通过rect函数去画图。
建议读者下载R基础包源代码,阅读研究S3函数plot.stl()代码。
问题描述: 有时候需要分两段显示,如果不想2次画图,用一次plot如何做到?plot在划线的时候默认会把前后2点用线连接起来,例如:
提示: 读者可以对比一下下面的代码结果。
问题描述: 在工艺参数优化课题中,通常需要对比当前的参数波动范围和建议的管控区间,如下图所示。
提示: 直接看代码。
问题描述: 在很多分析项目的多人协同中,除了共享环境、约定目录等项目管理方式外,如何做到自适应?一种需求就是在代码中,自动获得R文件所在的目录。
提示: 见如下代码。
需要说明的是,只有source运行该R文件才能获取R文件的所在目录。在RStudi等IDE中按行运行(run)的时候无法获取。
R语言的Formula结构是一个很好的设计,不仅直观,而且有很多技巧可以简洁实现很多想不到的工作。例如,我们在 x =15前后采用不同的斜率,如何实现分段线性回归。请见如下示例代码。