这个比赛算是我第一个做的数值类特征的比赛,主要以学习为主。学习的内容包括:
数值特征数据的特征工程,从数据中构建算法需要的特征
模型使用以及调参(包括 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 pdimport ostrain_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 )
这个代码没什么问题,但是实际跑起来却很慢,代码的瓶颈在于读取的数据是串行的,因此我们可以改造一个并行的加速版本。