DCIC 2020:智慧海洋建设 开源方案复盘笔记

2020 年 2 月 21 日 AINLP

一、赛题介绍

1.1 赛题背景

本赛题基于位置数据对海上目标进行智能识别和作业行为分析,要求选手通过分析渔船北斗设备位置数据,得出该船的生产作业行为,具体判断出是拖网作业、围网作业还是流刺网作业。初赛将提供11000条(其中7000条训练数据、2000条testA、2000条testB)渔船轨迹北斗数据。

1.2 赛题数据

初赛提供11000条渔船北斗数据,数据包含脱敏后的渔船ID、经纬度坐标、上报时间、速度、航向信息,由于真实场景下海上环境复杂,经常出现信号丢失,设备故障等原因导致的上报坐标错误、上报数据丢失、甚至有些设备疯狂上报等。

「数据示例:」

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

原始数据经过脱敏处理,渔船信息被隐去,坐标等信息精度和位置被转换偏移。选手可通过学习围网、刺网、拖网等专业知识辅助大赛数据处理。

1.3 评估指标

提交结果与实际渔船作业类型结果进行对比,以3种类别的各自F1值取平均做为评价指标,结果越大越好,具体计算公式如下:
其中P为某类别的准确率,R为某类别的召回率,评测程序f1函数为sklearn.metrics.f1_score,average='macro'。

二、Baseline 1

2.1 Baseline 概况
Baseline Auhtor 阿水
Baseline Address Baseline
Baseline Star 38
Baseline Score 0.62

阿水的Baseline是本赛题比较有代表性的方案,代码风格简介,对于初学者比较友好。同时 「数据->特征->算法」 的框架方便特征工程的快速迭代。

2.2 代码结构

2.2.1 Import U need
import os, sys, glob
import numpy as np
import pandas as pd

import time
import datetime

from joblib import Parallel, delayed
from sklearn.metrics import f1_score, log_loss, classification_report
from sklearn.model_selection import StratifiedKFold

import lightgbm as lgb

%pylab inline

2.2.2 特征工程
def read_feat(path, test_mode=False):
df = pd.read_csv(path)
df = df.iloc[::-1]

if test_mode:
df_feat = [df['渔船ID'].iloc[0], df['type'].iloc[0]]
df = df.drop(['type'], axis=1)
else:
df_feat = [df['渔船ID'].iloc[0]]

df['time'] = df['time'].apply(lambda x: datetime.datetime.strptime(x, "%m%d %H:%M:%S"))
df_diff = df.diff(1).iloc[1:]
df_diff['time_seconds'] = df_diff['time'].dt.total_seconds()
df_diff['dis'] = np.sqrt(df_diff['x']**2 + df_diff['y']**2)

df_feat.append(df['time'].dt.day.nunique())
df_feat.append(df['time'].dt.hour.min())
df_feat.append(df['time'].dt.hour.max())
df_feat.append(df['time'].dt.hour.value_counts().index[0])

# 此处省略 N 段代码

return df_feat

由于本赛题每个ID都独立成一个csv文件,可以看到阿水把利用文件名传参的方式对每个ID进行独立的特征处理。

2.2.3 并行化特征获取
train_feat = Parallel(n_jobs=10)(delayed(read_feat)(path, True)
for path in glob.glob('../input/hy_round1_train_20200102/*')[:])
train_feat = pd.DataFrame(train_feat)

test_feat = Parallel(n_jobs=10)(delayed(read_feat)(path, False)
for path in glob.glob('../input/hy_round1_testA_20200102/*')[:])
test_feat = pd.DataFrame(test_feat)
test_feat = test_feat.sort_values(by=0)

train_feat[1] = train_feat[1].map({'围网':0,'刺网':1,'拖网':2})

这里利用Parallel进行了并行化处理,提升了计算效率。

2.2.4 LightGBM 10折
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import f1_score

n_fold = 10
skf = StratifiedKFold(n_splits = n_fold, shuffle = True)
eval_fun = f1_score

def run_oof(clf, X_train, y_train, X_test, kf):
# 此处省略N行
return preds_train, preds_test

params = {# 此处省略N行}

train_pred, test_pred = run_oof(lgb.LGBMClassifier(**params),
train_feat.iloc[:, 2:].values,
train_feat.iloc[:, 1].values,
test_feat.iloc[:, 1:].values,
skf)


小结

笔者在此开源的基础上,只修改了部分特征工程,线上可以有 「0.8913」 的分数,同时并行化也使得线下迭代验证效率得到了保障。

三、Baseline 2

3.1 Baseline 概况

Baseline Auhtor 蔡君洋jioooo~
Baseline Address Baseline
Baseline Star 18
Baseline Score 0.8729

相对于Baseline 1,该Baseline的亮点在于做了一些EDA工作,对于理解题目很有帮助。

3.2 数据探查

  • 对不同标签的的(x,y)位置可视化我们可以发现,这基本就是沿海的轮廓。
  • 同时,不同标签在坐标上的区分度还是较为明显的。

3.3 多模型对比

该Baseline对Xgboost,LightGBM,CatBoost模型做了融合,同时做了加权融合。

test_end_score xgboost lightgbm catboost weight_xgboost weight_lightgbm weight_catboost
0 0.931042 0.930866 0.917411 0.877637 0.5 0.2
1 0.914347 0.901870 0.884444 0.879513 0.6 0.3
2 0.927533 0.907810 0.923235 0.888009 0.2 0.5
3 0.912230 0.891184 0.877702 0.894567 0.1 0.2
4 0.904197 0.894321 0.895069 0.899206 0.2 0.7
5 0.929959 0.918331 0.894536 0.902057 0.7 0.2
6 0.930583 0.915332 0.930583 0.905171 0.0 1.0
7 0.904270 0.903738 0.885791 0.890281 0.4 0.2
8 0.931706 0.926309 0.915993 0.918455 0.4 0.3
9 0.918609 0.909511 0.918609 0.885122 0.0 1.0
10 0.906875 0.890628 0.867425 0.865150 0.7 0.0
11 0.889217 0.878888 0.867252 0.866126 0.3 0.3
12 0.919569 0.907833 0.884178 0.893573 0.5 0.0
13 0.904401 0.895870 0.901480 0.888129 0.0 0.9
14 0.908233 0.896810 0.885806 0.856757 0.4 0.5
15 0.919484 0.900211 0.872883 0.911664 0.2 0.0
16 0.905847 0.883122 0.893712 0.879878 0.2 0.2
17 0.902063 0.899060 0.896116 0.884067 0.2 0.4
18 0.938963 0.933309 0.914183 0.895051 0.7 0.0
19 0.914048 0.913054 0.882581 0.876354 0.4 0.2

四、Baseline 3

4.1 Baseline 概况

Baseline Auhtor wbbhcb
Baseline Address Baseline
Baseline Star 21
Baseline Score 0.5

相对于Baseline 1和2,该Baseline的亮点在于提供了一个NN版的思路,虽然该思路的做法,用图片的形式进行分类,损失了很多特征信息,但是依旧不妨碍作为一个Baseline思路的存在。

4.2 部分代码概况

def train_epoch(model, optimizer, criterion, train_dataloader, epoch, lr, best_f1, batch_size):
model.train()
f1_meter, loss_meter, it_count = 0, 0, 0
tq = tqdm.tqdm(total=len(train_dataloader)*batch_size)
tq.set_description('folds: %d, epoch %d, lr %.4f, best_f:%.4f' % (fold_+1, epoch, lr, best_f1))
for i, (inputs, target) in enumerate(train_dataloader):
inputs = inputs.to(device)
target = target.to(device)
# zero the parameter gradients
optimizer.zero_grad()
# forward
output = model(inputs)
output = F.softmax(output, dim=1)
loss = criterion(output, target)
loss.backward()
optimizer.step()
loss_meter += loss.item()
it_count += 1
f1 = calc_f1(target, output)
f1_meter += f1
tq.update(batch_size)
tq.set_postfix(loss="%.4f f1:%.3f" % (loss.item(), f1))
tq.close()
return loss_meter / it_count, f1_meter / it_count

作者简介

DOTA
数据科学从业者
国内某知名互联网企业算法工程师
曾获:DiggSci亚军,JDATA季军,国内竞赛N次Top10


推荐阅读

AINLP年度阅读收藏清单

大幅减少GPU显存占用:可逆残差网络(The Reversible Residual Network)

鼠年春节,用 GPT-2 自动写对联和对对联

用 GPT-2 自动写诗,从五言绝句开始

transformer-XL与XLNet笔记

AINLP-DBC GPU 云服务器租用平台建立,价格足够便宜

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。


登录查看更多
1

相关内容

耶鲁大学《分布式系统理论》笔记,491页pdf
专知会员服务
44+阅读 · 2020年7月29日
基于改进卷积神经网络的短文本分类模型
专知会员服务
25+阅读 · 2020年7月22日
2019腾讯广告算法大赛方案分享(冠军)
大数据技术
12+阅读 · 2019年8月26日
交通评价指标概略
智能交通技术
15+阅读 · 2019年7月21日
实战分享之专业领域词汇无监督挖掘
PaperWeekly
15+阅读 · 2019年4月16日
LASSO回归与XGBoost:融合模型预测房价
论智
30+阅读 · 2018年8月8日
CVPR 2018 笔记
计算机视觉战队
3+阅读 · 2018年5月25日
天池大赛—商场中精确定位用户所在店铺 作品分享
数据挖掘入门与实战
3+阅读 · 2018年3月16日
DeepLabv3+:语义分割领域的新高峰
极市平台
4+阅读 · 2018年3月3日
基于Xgboost + LR + Keras 建模评估用户信用状态
机器学习研究会
5+阅读 · 2017年10月5日
学员笔记||Python数据分析之:numpy入门(一)
七月在线实验室
7+阅读 · 2017年9月28日
Geometric Graph Convolutional Neural Networks
Arxiv
10+阅读 · 2019年9月11日
Phase-aware Speech Enhancement with Deep Complex U-Net
Arxiv
8+阅读 · 2018年5月15日
Arxiv
9+阅读 · 2018年3月28日
VIP会员
相关资讯
2019腾讯广告算法大赛方案分享(冠军)
大数据技术
12+阅读 · 2019年8月26日
交通评价指标概略
智能交通技术
15+阅读 · 2019年7月21日
实战分享之专业领域词汇无监督挖掘
PaperWeekly
15+阅读 · 2019年4月16日
LASSO回归与XGBoost:融合模型预测房价
论智
30+阅读 · 2018年8月8日
CVPR 2018 笔记
计算机视觉战队
3+阅读 · 2018年5月25日
天池大赛—商场中精确定位用户所在店铺 作品分享
数据挖掘入门与实战
3+阅读 · 2018年3月16日
DeepLabv3+:语义分割领域的新高峰
极市平台
4+阅读 · 2018年3月3日
基于Xgboost + LR + Keras 建模评估用户信用状态
机器学习研究会
5+阅读 · 2017年10月5日
学员笔记||Python数据分析之:numpy入门(一)
七月在线实验室
7+阅读 · 2017年9月28日
Top
微信扫码咨询专知VIP会员