【人工智能概论】 海洋数据的预处理
文章目录
一. 数据集简介
1. 数据来源简介
- 两个位于广西北海的海洋浮标,在2017-2019年间测定的若干数据构成了本数据集。
- 每个浮标每隔半个小时测定一组数据,每组数据包含13个特征,算上时间戳,数据集共有14个组特征。
- 还有两组不是全部数据都有的特征,暂不做考虑。
2. 特征简介
- Temp_C : 温度;单位:摄氏度。
- SpCond_mS : 电导率;单位:mS/cm(毫西门子每厘米)。
- Cond_mS : 水质电导率;单位:mS/cm。
- Sal : 盐度。
- DO_percent : 溶解氧饱和度百分比。
- DO_ppm : 溶解氧饱和度;单位:mg/L。
- pH : 酸碱度。
- pH_mV : 酸碱度;单位:mV。
- Turb_NTU : 浊度;单位 : NTU。
- Chl_ppb : 叶绿素;单位 : ug/L。
- Chl_RFU : 叶绿素——相对荧光单位。
- PE_uL : 藻红蛋白;单位 : ug/L。
- PE_RFU : 藻红蛋白——相对荧光单位。
二. 数据预处理
2.1 预处理的预处理
- 在数据预处理之前也是有不小的工作量的,原始数据存在各种格式问题,因此要做相应的调整。
- 因为原数据的第一个特征就是时间戳,因此原数据中的其它有关时间的数据就是无用的,因此要删除。
- 在删除冗余的时间信息时发现有一个数据集的信息未能对齐,因此考虑将数据对齐。
- 在对齐数据的时候发现两个浮标中各有无效信息若干,以及缺少项过多的列,因此删除它们。
- 在进行上一步的时候发现,两个浮标测定的数据种类,有差异,因此保留共有的十三组特征,并且了解特征对应的物理量。
- 未能记录的数据(缺失数据)它都是给用-7999代替了,把-7999都替换成NAN方便后续处理。(这里说的是有时间戳但是数值明显有问题的)
- 数据缺失情况:
文件 理论量 未记录量 错误量 总占比
3–7 17520 1262 159 0.0811
3-89 35040 1210 6 0.0347
5–7 17520 1753 497 0.1284
5-89 35040 8 21 0.000828
2.2 真正的数据预处理
2.2.1 异常与缺失处理
- 根据SMD数据集处理的经验,不难知麻烦的还是缺失数据的调整,根据数据本身的特点,海洋数据集主要出现的问题是——样本缺失,即某个时刻本应有数据,但没有记录;此外经过观察数据发现存在一组非常特殊的数据(代表特征温度数据为1),其多次出现但与周围数据格格不入,因此判定为异常数据,因此关键在于处理以上两种情况。(实际上异常检测任务应该把明确的异常直接剔除,之所以要补数据是为了预测时时间信息的连贯性)
- 但实际上没那么简单,如果按照半小时测一次的话还是有缺,找出缺失的位置,然后考虑补全。(不建议执行)
- 实际上,如果连续太多记录错误,缺失的就不应该补了,补几乎就是自己造数据,引入的问题太大了,因此只能把文件拆成多个小文件来使用。而不大规模未能记录的,就当引入随机性了(毕竟平均下来一天最多也缺不到五组)。因此人工补充时间戳(即以下操作)或许可以省略了。
待续
- 如果按照半小时一测来算,理论上的记录数>真实记录的总数,那肯定有数据根本没记录,即连时间戳都没给保留,以下是如何找到这些时间戳的方法。
待续
- 找到缺失的时间戳,给它插入原数据中。以下是开辟插入行的方法:
# 假如要在原本数据的【1,2】行的前面插入数据
# 注意这里插入,只能实现占位,时间戳和后续数据都没有填入。
import pandas as pd
import numpy as np
def inject_cows(df,cows_list,values):
# df是待插入数据,cow_list记录在原文件的那些行前插入数据;
# values是打算插入的数据(因为主要起到占位作用,因此采用同样的内容即可,如NAN)
i = 0 # 用于辅助确定插入区域,第一次插入的时候直接按照号码插就行,第i次插入的时候就得是号码加上i了
for cow_num in cows_list:
cow_num = cow_num + i
header = df.columns # 用于保留标题栏
df = pd.DataFrame(np.insert(df.values,cow_num,values=values,axis=0))
i = i + 1
df.columns = header
return df
df = pd.read_csv('./test.csv',header=0) # 读取数据
df = inject_cows(df , [1,2] , [888,888,888,888])
df.to_csv('./test2.csv',index=False)
- 占好位,填数据就行,分析一下主要是填入时间戳,至于后续的特征数可以按照缺失项处理,因此下面只实现填入时间戳。
待续
- 根据数据特点,采用以下代码,将缺失数据与异常数据的标号筛选出来:
import pandas as pd
df = pd.read_csv('./sea_dataset/train/GX-05-2018-2019.xlsx',header=0) # 读取数据
list_time = [] # 用于保存异常、缺失数据的index
k = 0 # 因为数据集里没有标记index,所以要自己准备
df1 = df.iloc[:,:2].values # 截取全部数据的前两列,用于筛选
for i in df1:
if i[1] == '1': # 即温度为1的,选出来,记录序号
list_time.append(k)
elif i[1] == 'NAN': # 即温度为NAN的,选出来,记录序号
list_time.append(k)
elif i[1] == 1.0: # 考虑到要是没有NAN,则温度是由浮点数表示的,因此再加一条
list_time.append(k)
k = k + 1 # 将序号指向下一个数据
# 至此异常数据的编号就保存在list_time里了
-
筛出有问题的项了,该如何替换成相对合理的数据。(用周期填补,以及单项缺失的问题。以及大片缺失的问题(大片缺失就以此为界大文件拆成小文件。))
待续
-
实际上,一切问题的汇总,源自于,如何预测,要预测成什么样,即输入输出的情况是什么,不妨在确定后再进行。
-
而且海洋数据异常的测试集标签该怎么搞,异常数据该怎么获得?
异常数据是不是可以用正常数据添加随机大方差噪声来模拟。
待定
- 针对第一个问题,前置任务中有验证过数据有一定的周期性可循,不妨采用对周期序列连续型缺失的处理,参考:https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiTRKgchrJ08w1e7fm4X_1ttJAnuNm1tX8HNQSrYE53RWltda4bLvEmNpF7CgS4ekQhxBwbE503zD_vq&uniplatform=NZKPT
- 基于周期信息的时间序列缺失值填补方法(简称周期性填补法)
- 基本思想: 基于序列的多个隐含周期,以相应的周期图峰值作为权重,计算不同周期位置的加权均数来填补缺失值。
- 通过周期图峰值检验搜索序列序列的多个隐含周期;
- 基于不同的周期值,获得不同周期位置上原始数据的均数,并以该缺失位置上的均数作为该位置的初始填补值;
- 以不同的周期值相应的峰值作为权重,获得缺失位置上初始填补值的加权均数;
- 用一次填补后的完整序列再次进行周期性验证;
- 以上步骤循环迭代,直到前后两次填补值的相对误差不超过0.1时,循环停止,获得最终的序列填补值。
如果说效果真的很好还搞个锤子的预测?
- 成本,应用范围,精度。
- 首先,应用范围 这种方法的应用范围就十分有限,必须明确有周期性的变化。
- 其次,成本 如果直接用预测模型来做填补,也不是不可以,但是成本势必很大。
- 最后,精度 怎么实验它的精度肯定都搞不过预测,只是为了给时间序列保留连续信息罢了
分界
相同时间段平均值填补
随机保留缺失以作为传感器暴毙