【人工智能概论】 海洋数据的处理(待续)

【人工智能概论】 海洋数据的预处理


一. 数据集简介

1. 数据来源简介

  • 两个位于广西北海的海洋浮标,在2017-2019年间测定的若干数据构成了本数据集。
  • 每个浮标每隔半个小时测定一组数据,每组数据包含13个特征,算上时间戳,数据集共有14个组特征。
  • 还有两组不是全部数据都有的特征,暂不做考虑。

2. 特征简介

  1. Temp_C : 温度;单位:摄氏度。
  2. SpCond_mS : 电导率;单位:mS/cm(毫西门子每厘米)。
  3. Cond_mS : 水质电导率;单位:mS/cm。
  4. Sal : 盐度。
  5. DO_percent : 溶解氧饱和度百分比。
  6. DO_ppm : 溶解氧饱和度;单位:mg/L。
  7. pH : 酸碱度。
  8. pH_mV : 酸碱度;单位:mV。
  9. Turb_NTU : 浊度;单位 : NTU。
  10. Chl_ppb : 叶绿素;单位 : ug/L。
  11. Chl_RFU : 叶绿素——相对荧光单位。
  12. PE_uL : 藻红蛋白;单位 : ug/L。
  13. 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 异常与缺失处理

  1. 根据SMD数据集处理的经验,不难知麻烦的还是缺失数据的调整,根据数据本身的特点,海洋数据集主要出现的问题是——样本缺失,即某个时刻本应有数据,但没有记录;此外经过观察数据发现存在一组非常特殊的数据(代表特征温度数据为1),其多次出现但与周围数据格格不入,因此判定为异常数据,因此关键在于处理以上两种情况。(实际上异常检测任务应该把明确的异常直接剔除,之所以要补数据是为了预测时时间信息的连贯性)
  2. 但实际上没那么简单,如果按照半小时测一次的话还是有缺,找出缺失的位置,然后考虑补全。(不建议执行)
  • 实际上,如果连续太多记录错误,缺失的就不应该补了,补几乎就是自己造数据,引入的问题太大了,因此只能把文件拆成多个小文件来使用。而不大规模未能记录的,就当引入随机性了(毕竟平均下来一天最多也缺不到五组)。因此人工补充时间戳(即以下操作)或许可以省略了。
    待续
  • 如果按照半小时一测来算,理论上的记录数>真实记录的总数,那肯定有数据根本没记录,即连时间戳都没给保留,以下是如何找到这些时间戳的方法。
    待续
  • 找到缺失的时间戳,给它插入原数据中。以下是开辟插入行的方法:
# 假如要在原本数据的【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)
  • 占好位,填数据就行,分析一下主要是填入时间戳,至于后续的特征数可以按照缺失项处理,因此下面只实现填入时间戳。
    待续
  1. 根据数据特点,采用以下代码,将缺失数据与异常数据的标号筛选出来:
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里了
  1. 筛出有问题的项了,该如何替换成相对合理的数据。(用周期填补,以及单项缺失的问题。以及大片缺失的问题(大片缺失就以此为界大文件拆成小文件。))
    待续

  2. 实际上,一切问题的汇总,源自于,如何预测,要预测成什么样,即输入输出的情况是什么,不妨在确定后再进行。

  3. 而且海洋数据异常的测试集标签该怎么搞,异常数据该怎么获得?
    异常数据是不是可以用正常数据添加随机大方差噪声来模拟。

待定

  1. 针对第一个问题,前置任务中有验证过数据有一定的周期性可循,不妨采用对周期序列连续型缺失的处理,参考:https://kns.cnki.net/kcms2/article/abstract?v=3uoqIhG8C44YLTlOAiTRKgchrJ08w1e7fm4X_1ttJAnuNm1tX8HNQSrYE53RWltda4bLvEmNpF7CgS4ekQhxBwbE503zD_vq&uniplatform=NZKPT
  • 基于周期信息的时间序列缺失值填补方法(简称周期性填补法)
  • 基本思想: 基于序列的多个隐含周期,以相应的周期图峰值作为权重,计算不同周期位置的加权均数来填补缺失值。
  • 通过周期图峰值检验搜索序列序列的多个隐含周期;
  • 基于不同的周期值,获得不同周期位置上原始数据的均数,并以该缺失位置上的均数作为该位置的初始填补值;
  • 以不同的周期值相应的峰值作为权重,获得缺失位置上初始填补值的加权均数;
  • 用一次填补后的完整序列再次进行周期性验证;
  • 以上步骤循环迭代,直到前后两次填补值的相对误差不超过0.1时,循环停止,获得最终的序列填补值。

如果说效果真的很好还搞个锤子的预测?

  • 成本,应用范围,精度。
  • 首先,应用范围 这种方法的应用范围就十分有限,必须明确有周期性的变化。
  • 其次,成本 如果直接用预测模型来做填补,也不是不可以,但是成本势必很大。
  • 最后,精度 怎么实验它的精度肯定都搞不过预测,只是为了给时间序列保留连续信息罢了

分界

相同时间段平均值填补
随机保留缺失以作为传感器暴毙

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值