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

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

被折叠的 条评论
为什么被折叠?



