0%

智慧海洋建设比赛

这个比赛算是我第一个做的数值类特征的比赛,主要以学习为主。学习的内容包括:

  • 数值特征数据的特征工程,从数据中构建算法需要的特征
  • 模型使用以及调参(包括 Lightgb, Xgboost 等等)

比赛内容和数据分析

这部分主要搞清楚几个问题:

  • 比赛内容是什么,以及给了哪些数据
  • 是分类问题还是回归问题

首先看赛题:

本赛题基于位置数据对海上目标进行智能识别和作业行为分析,要求选手通过分析渔船北斗设备位置数据,得出该船的生产作业行为,具体判断出是拖网作业、围网作业还是流刺网作业。初赛将提供 11000 条 (其中 7000 条训练数据、2000 条 testA、2000 条 testB) 渔船轨迹北斗数据。数据包含脱敏后的渔船 ID、经纬度坐标、上报时间、速度、航向信息,由于真实场景下海上环境复杂,经常出现信号丢失,设备故障等原因导致的上报坐标错误、上报数据丢失、甚至有些设备疯狂上报等。

数据示例:

  • 渔船 ID:渔船的唯一识别,结果文件以此 ID 为标示
  • x: 渔船在平面坐标系的 x 轴坐标
  • y: 渔船在平面坐标系的 y 轴坐标
  • 速度:渔船当前时刻航速,单位节
  • 方向:渔船当前时刻航首向,单位度
  • time:数据上报时刻,单位月日 时:分
  • type:渔船 label,作业类型

可以看出这是一个分类问题,所给数据是数值型特征。再来看一下结果的评价指标:

数据预处理

因为数据给的是一些 csv 文件,所以首先需要对所有的文件进行合并,生成一个训练文件和一个测试文件。这里是我参考的 baseline
baseline 采用的文件合并代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import pandas as pd
import os

train_dir = "./data/hy_round1_train_20200102"
test_dir = "./data/hy_round1_testA_20200102"

test = pd.DataFrame(columns=['渔船ID', 'x', 'y', '速度', '方向', 'time'])

for root, dirs, files in os.walk(test_dir):
for file in files:
filename = os.path.join(root, file)
temp = pd.read_csv(filename)
test = pd.concat([test, temp])
print(test.info())

train = pd.DataFrame(columns=['渔船ID', 'x', 'y', '速度', '方向', 'time'])

for root, dirs, files in os.walk(train_dir):
for file in files:
filename = os.path.join(root, file)
temp = pd.read_csv(filename)
train = pd.concat([train, temp])
print(train.info())

test.to_csv("./data/test_origin.csv", index=None)
train.to_csv("./data/train_origin.csv", index=None)

这个代码没什么问题,但是实际跑起来却很慢,代码的瓶颈在于读取的数据是串行的,因此我们可以改造一个并行的加速版本。

支持一根棒棒糖!