2020数字中国创新大赛—算法赛开源方案复盘笔记
DCIC 2020:智慧海洋建設 開源方案復盤筆記
一、賽題介紹
1.1 賽題背景
本賽題基于位置數據對海上目標進行智能識別和作業行為分析,要求選手通過分析漁船北斗設備位置數據,得出該船的生產作業行為,具體判斷出是拖網作業、圍網作業還是流刺網作業。初賽將提供11000條(其中7000條訓練數據、2000條testA、2000條testB)漁船軌跡北斗數據。
1.2 賽題數據
初賽提供11000條漁船北斗數據,數據包含脫敏后的漁船ID、經緯度坐標、上報時間、速度、航向信息,由于真實場景下海上環境復雜,經常出現信號丟失,設備故障等原因導致的上報坐標錯誤、上報數據丟失、甚至有些設備瘋狂上報等。
數據示例:
- 漁船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 pdimport time import datetimefrom joblib import Parallel, delayed from sklearn.metrics import f1_score, log_loss, classification_report from sklearn.model_selection import StratifiedKFoldimport lightgbm as lgb%pylab inline2.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_scoren_fold = 10 skf = StratifiedKFold(n_splits = n_fold, shuffle = True) eval_fun = f1_scoredef run_oof(clf, X_train, y_train, X_test, kf):# 此處省略N行return preds_train, preds_testparams = {# 此處省略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模型做了融合,同時做了加權融合。
四、Baseline 3
4.1 Baseline 概況
Baseline Auhtor : wbbhcb
Baseline Address :Baseline
Baseline Star : 21
Baseline Score : 0.5
相對于Baseline 1和2,該Baseline的亮點在于提供了一個NN版的思路,雖然該思路的做法,用圖片的形式進行分類,損失了很多特征信息,但是依舊不妨礙作為一個Baseline思路的存在。
3.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, 0tq = 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 gradientsoptimizer.zero_grad()# forwardoutput = model(inputs)output = F.softmax(output, dim=1)loss = criterion(output, target)loss.backward()optimizer.step()loss_meter += loss.item()it_count += 1f1 = calc_f1(target, output)f1_meter += f1tq.update(batch_size)tq.set_postfix(loss="%.4f f1:%.3f" % (loss.item(), f1))tq.close()return loss_meter / it_count, f1_meter / it_count總結
以上是生活随笔為你收集整理的2020数字中国创新大赛—算法赛开源方案复盘笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 社交重构、游戏革新,万物皆可元宇宙?这场
- 下一篇: 2020数字中国创新大赛-智能算法赛-冠