日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2020数字中国创新大赛—算法赛开源方案复盘笔记

發布時間:2025/3/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 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_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数字中国创新大赛—算法赛开源方案复盘笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。