2020DCIC智慧海洋建设算法赛学习02-数据分析

本文通过初步探索竞赛数据,发现异常值、不同作业类型的特征分布,并进行异常值处理、轨迹可视化和特征工程思考。


这篇博客旨在对赛题数据做一些初步的探索,包括查看数据中的缺失值、异常值等,以及通过可视化来观察各个特征的分布情况,为之后进行特征工程提供一些思路。

1. 查看数据整体情况

对于一份数据集,首先要对它的整体情况做一些基本的了解。

导入数据库

首先导入必要的库:

import warnings
warnings.filterwarnings('ignore')

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns

from tqdm import tqdm
import multiprocessing as mp
import os
import pickle
import random

读取数据集

这份数据集是以压缩文件的形式给出的,其中包含每条渔船的csv格式的数据文件,我们这里定义读取数据文件的函数:

def read_train_file(filename=None):
    # 替换数据存放的路径
    Path = "../input/wisdomoceans/hy_round1_train_20200102/hy_round1_train_20200102/"
    return pd.read_csv(Path + filename,encoding="utf-8")

def read_test_file(filename=None):
    # 替换数据存放的路径
    Path = "../input/wisdomoceans/hy_round1_testA_20200102/hy_round1_testA_20200102/"
    return pd.read_csv(Path + filename,encoding="utf-8")

定义一个读取和保存数据的类:

# 定义加载和存储数据的类
class Load_Save_Data():
    def __init__(self, file_name=None):
        self.filename = file_name
        
    def load_data(self, Path=None):
        if Path is None:
            assert self.filename is not None, 'Invalid Path...'
        else:
            self.filename = Path
        with open(self.filename, 'wb') as f:
            data = pickle.load(f)
        return data
    
    def save_data(self, data, path):
        if path is None:
            assert self.filename is not None, 'Invalid path...'
        else:
            self.filename = path
        with open(self.filename, 'wb') as f:
            pickle.dump(data, f)

利用上述构建的函数和类,定义一个通过多线程的方式来读取数据的函数,加快读取速度:

def read_data(Path, Kind=''):
    filenames = os.listdir(Path)
    print('\n@Read Data From' + Path + '.......................')
    # 多线程处理
    with mp.Pool(processes=mp.cpu_count()) as pool:
        data_total = list(tqdm(pool.map(read_train_file if Kind=='train' else
                                        read_test_file, filenames), total=len(filenames)))
    print('\n@End Read Total Data .............................')
    load_save = Load_Save_Data()
    if Kind == 'train':
        load_save.save_data(data_total, './total_data.pkl')
    return data_total

现在可以用上面的函数来读取训练集和测试集:

# 读取训练数据
train_path = '../input/wisdomoceans/hy_round1_train_20200102/hy_round1_train_20200102/'
data_train = read_data(train_path, 'train')
data_train = pd.concat(data_train)

# 读取测试数据
test_path = '../input/wisdomoceans/hy_round1_testA_20200102/hy_round1_testA_20200102/'
data_test = read_data(test_path, 'test')
data_test = pd.concat(data_test)

查看数据集

先来看看训练集的基本情况:

print('The shape of train data:', data_train.shape)
data_train.head()

The shape of train data: (2699638, 7)

在这里插入图片描述
训练集的特征并不复杂,每条数据包括渔船ID、x轴坐标、y轴坐标、速度、方向、上报时间六个特征,要预测的目标值就是作业类型(type)。
查看训练集的各个特征的基本统计值:

data_train.describe([0.01, 0.025, 0.05, 0.5, 0.75, 0.9, 0.99])

在这里插入图片描述
可以看到速度的最大值与99%分位数相差很大,说明速度特征存在异常值,可以通过3-sigma原理判断异常值并进行处理。
最后查看训练集的缺失值:

# 查看训练集缺失值
print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')

There are 0 columns in train dataset with missing values.

训练集没有缺失值,不需要进行缺失值填充。
同样地查看测试集的基本情况:

print('The shape of test data:', data_test.shape)
data_test.head()

The shape of test data: (782378, 6)

在这里插入图片描述
查看测试集各个特征的基本统计信息:

data_test.describe([0.01, 0.025, 0.05, 0.5, 0.75, 0.9, 0.99])

在这里插入图片描述
速度特征同样存在异常值。
查看测试集是否存在缺失值:

# 查看测试集缺失值
print(f'There are {data_test.isnull().any().sum()} columns in test dataset with missing values.')

测试集也没有缺失值。

小结

通过对数据集的整体了解,我们发现数据集的特征构成并不复杂,并且都是数值型数据,也没有缺失值,也就是说原始的数据不需要我们进行过多的处理,只需滤掉一些异常值。对于这样一个数据集,我们工作的重点就在于通过分析数据的分布挖掘不同类型渔船的轨迹特点来找到构建新特征的思路,并且通过合适的方式来利用轨迹这一时序信息。
接下来我们就要对数据的分布进行一些可视化的分析。

2. 可视化分析

2.1 渔船轨迹可视化

我们先把三类不同的数据存入不同的文件中:

# 把三类不同数据放到不同的文件中
def get_diff_data():
    Path = '../input/wisdomoceans/total_data.pkl'
    with open
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值