【时序多分类赛题】2020数字中国创新大赛-智慧海洋建设top5方案(含源码)
这次给大家带来的是2020数字中国创新大赛-数字政府赛道-智能算法赛:智慧海洋建设的算法赛复赛赛道B top5的方案以及代码开源。比赛传送门:https://tianchi.aliyun.com/competition/entrance/231768/introduction 这是我们队伍参加的为数不多的数据挖掘类的算法竞赛。经过两个多月的时间,我们队伍最终在算法赛道B阶段取得top5的成绩。说一下参赛体验:都是神仙打架,太难了!接下来进入正题吧!
本方案采用特征工程 + NLP的相关技术
,下面为大家进行详细介绍。
任务介绍
赛题基于位置数据对海上目标进行智能识别和作业行为分析,要求选手通过分析渔船北斗设备位置数据,得出该船的生产作业行为,具体判断出是拖网作业、围网作业还是流刺网作业。数据包含脱敏后的渔船ID、经纬度坐标、上报时间、速度、航向信息,由于真实场景下海上环境复杂,经常出现信号丢失,设备故障等原因导致的上报坐标错误、上报数据丢失、甚至有些设备疯狂上报等。每一个渔船ID对应多条上报数据。数据示例如图: 分析完整个赛题其实是一个时序多分类的任务。
评价标准:以3种类别的各自F1值取平均做为评价指标
数据分析&特征分析
主要从以下4个方面去进行了数据分析和特征的分析
2-1. 基本信息
不同渔船的作业方式的区域有很大的区分度;
区域的重叠部分容易混淆,需要更多的信息进行判断;
gill netter(刺网)作业方式大部分都在速度0或接近0的情况下作业;
速度的稳定性 trawler(拖网) > seiner(围网) > gill netter(刺网);
三种作业方式的方向/direction在方向特别小的情况有一定差异;
我们对基础特征进行max,min...等进行统计得到一些基础特征
def group_feature(df, key, target, aggs,flag): agg_dict = {}for ag in aggs:agg_dict['{}_{}_{}'.format(target,ag,flag)] = agprint(agg_dict)t = df.groupby(key)[target].agg(agg_dict).reset_index()return t
t = group_feature(df, 'ship','x',['max','min','mean','median','std','skew'],flag)
t = group_feature(df, 'ship','speed',['max','mean','median','std','skew'],flag)
t = group_feature(df, 'ship','direction',['max','median','mean','std','skew'],flag)
t = group_feature(df, 'ship','y',['max','min','mean','median','std','skew'],flag)
2-2. 细致信息
同一种作业方式在不同速度的位置区域(经纬度)也有着一定的差异
同一种作业方式在Day&Night上速度上有着一定的差异
同一种作业方式在Day&Night上位置区域(经纬度)有着一定的差异
data_1 = data[data['speed']==0]
data_2 = data[data['speed']!=0]
data_label = extract_feature(data_1, data_label,"0")
data_label = extract_feature(data_2, data_label,"1")
df['day_nig'] = 0
df.loc[(df['hour'] > 5) & (df['hour'] < 20),'day_nig'] = 1
data_1 = data[data['day_nig'] == 0]
data_2 = data[data['day_nig'] == 1]
data_label = extract_feature(data_1, data_label,"on_night")
data_label = extract_feature(data_2, data_label,"on_day")
2-3. 动态信息
每个渔船id的速度、经纬度看做是一个序列信息
利用速度、经纬度的分位数统计量,将浮点特征分桶转成一个类型特征
使用不同的ngram提取TF-IDF 特征(ngram=1, 2, 3)
对不同ngram提取的特征t-SNE 降维到二维,进行可视化
最终,利用NLP的TF-IDF提取关键高维的ngram信息,有效获取速度和经纬度动态变化的信息
#分桶
def cut_bins(raw_data, col_name=None, q=49):features, bins = pd.qcut(raw_data[col_name], q=q, retbins=True, duplicates="drop")labels = list(range(len(bins) - 1))features, bins = pd.qcut(raw_data[col_name], labels=labels, q=q, retbins=True, duplicates="drop")return features, bins, labels
# 讲融合后的taglist当作一句话进行文本处理
self.data['title_feature'] = self.data[self.to_list].apply(lambda x: x.split('|'))
self.data['title_feature'] = self.data['title_feature'].apply(lambda line: [w for w in line if w not in stop_words])
self.data['title_feature'] = self.data['title_feature'].apply(lambda x: ' '.join(x))print('start NMF')
# 使用tfidf对元素进行处理
tfidf_vectorizer = TfidfVectorizer(ngram_range=(tf_n,tf_n))
tfidf = tfidf_vectorizer.fit_transform(self.data['title_feature'].values)
#使用nmf算法,提取文本的主题分布
text_nmf = NMF(n_components=self.nmf_n).fit_transform(tfidf)
2-4. 基于word2vec的表征
使用深度学习的word2vec的CBOW算法无监督训练,获取经纬度(x-y)和速度(speed)的类型向量
每个渔船id的经纬度和速度向量取平均作为特征,然后使用t-SNE 降维到二维,进行可视化
最终,利用NLP的word2vec提取区域的交互动态信息,有效获取速度和经纬度信息
from gensim.models import Word2Vecimport gcdef emb(df, f1, f2):emb_size = 23print('====================================== {} {} ======================================'.format(f1, f2))tmp = df.groupby(f1, as_index=False)[f2].agg({'{}_{}_list'.format(f1, f2): list})sentences = tmp['{}_{}_list'.format(f1, f2)].values.tolist()del tmp['{}_{}_list'.format(f1, f2)]for i in range(len(sentences)):sentences[i] = [str(x) for x in sentences[i]]model = Word2Vec(sentences, size=emb_size, window=5, min_count=3, sg=0, hs=1, seed=2222)emb_matrix = []for seq in sentences:vec = []for w in seq:if w in model:vec.append(model[w])if len(vec) > 0:emb_matrix.append(np.mean(vec, axis=0))else:emb_matrix.append([0] * emb_size)emb_matrix = np.array(emb_matrix)for i in range(emb_size):tmp['{}_{}_emb_{}'.format(f1, f2, i)] = emb_matrix[:, i]del model, emb_matrix, sentencesreturn tmp
最终模型
训练模型前采用Lightgbm进行初步的特征筛选
最后用我们非常熟悉的Lightgbm进行模型训练,单模型5折最终线上F1=0.8990
from feature_selector import FeatureSelector
fs = FeatureSelector(data = train_label[features], labels = train_label[target])
fs.identify_zero_importance(task = 'classification', eval_metric = 'multiclass',n_iterations = 10, early_stopping = True)
fs.identify_low_importance(cumulative_importance = 0.97)
low_importance_features = fs.ops['low_importance']
print('====low_importance_features=====')
print(low_importance_features)
for i in low_importance_features:features.remove(i)
def macro_f1(y_hat, data):y_true = data.get_label()y_hat = y_hat.reshape(-1, y_true.shape[0])y_hat = np.argmax(y_hat, axis=0)f1_multi = precision_recall_fscore_support(y_true, y_hat, labels=[0, 1, 2])[2]f1_macro = f1_score(y_true, y_hat, average ="macro")assert np.mean(f1_multi) == f1_macroreturn 'f1', f1_macro, True
params = {'task':'train', 'num_leaves': 63,'objective': 'multiclass','num_class': 3,'metric': 'None', # [f1_0, f1_1, f1_2],'min_data_in_leaf': 10,'learning_rate': 0.01,'feature_fraction': 0.7,'bagging_fraction': 0.95,'early_stopping_rounds': 2000,
# 'lambda_l1': 0.1,
# 'lambda_l2': 0.1,"first_metric_only": True,'bagging_freq': 3, 'max_bin': 255,'random_state': 42,'verbose' : -1}
To do:
将渔船每条航行的时序数据当做一个句子/段落/文档进行处理
提取更深含义的渔船航线特征,学习到更高层次的渔船航线规律
多模型加权融合or stacking(lgb,xgb,...)
更多精彩内容(请点击图片进行阅读)
公众号:AI蜗牛车
保持谦逊、保持自律、保持进步
个人微信
备注:昵称+学校/公司+方向
如果没有备注不拉群!
拉你进AI蜗牛车交流群
点个在看,么么哒!
【时序多分类赛题】2020数字中国创新大赛-智慧海洋建设top5方案(含源码)相关推荐
- 【算法实战篇】时序多分类赛题-2020数字中国创新大赛-智慧海洋建设top5方案(含源码)
Hi,大家好!这里是AILIGHT!AI light the world!这次给大家带来的是2020数字中国创新大赛-数字政府赛道-智能算法赛:智慧海洋建设的算法赛复赛赛道B top5的方案以 ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task2数据分析
智慧海洋建设-Task2 数据分析 此部分为智慧海洋建设竞赛的数据分析模块,通过数据分析,可以熟悉数据,为后面的特征工程做准备,欢迎大家后续多多交流. 赛题:智慧海洋建设 数据分析的目的: EDA的主 ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task3特征工程
智慧海洋建设-Task3 特征工程 此部分为智慧海洋建设竞赛的特征工程模块,通过特征工程,可以最大限度地从原始数据中提取特征以供算法和模型使用.通俗而言,就是通过X,创造新的X'以获得更好的训练.预测 ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task1地理数据分析常用工具
智慧海洋建设-Task1 地理数据分析常用工具 在地理空间数据分析中,常会用到许多地理分析的工具,在本模块中主要是针对常用的shapely.geopandas.folium.kepler.gl.geo ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task5模型融合
智慧海洋建设-Task5 模型融合 5.1 学习目标 学习融合策略 完成相应学习打卡任务 5.2 内容介绍 https://mlwave.com/kaggle-ensembling-guide/ ht ...
- 【算法竞赛学习】数字中国创新大赛智慧海洋建设-Task4模型建立
智慧海洋建设-Task4模型建立 此部分为智慧海洋建设竞赛的模型建立模块.在该模块中主要介绍了如何进行模型建立并对模型调优. 学习目标 学习如何选择合适的模型以及如何通过模型来进行特征选择 掌握随机森 ...
- 2020数字中国创新大赛 • 算法赛道冠军技术方案分享
写在前面的话 作者说:我是来自京东数科的朱翔宇,也是此次大赛 Champion Chasing Boy 团队的 DOTA(常用ID),在与队友 鱼遇雨欲语与余(京东零售). 尘沙杰少.林有夕.嗯哼哼唧 ...
- 天池算法赛:数据挖掘经典赛事!DCIC 2020 数字中国创新大赛启动!
2020数字中国创新大赛(Digital China Innovation Contest, DCIC2020),以"培育数字经济新动能,助推数字中国新发展"为主题,采取多赛道并行 ...
- 4373支队伍报名2020数字中国创新大赛-数字政府赛道 数字战“疫”彰显社会责任...
2月25日,2020数字中国创新大赛-数字政府赛道进入复赛阶段.根据本赛道承办方--阿里云天池竞赛平台的数据显示,自1月1日赛事报名通道上线至今,共吸引了全球16个国家和地区共计4373支队伍参赛. ...
最新文章
- [Solution] The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
- 脚本重启nginx进程
- 在Linux下和Windows下遍历目录的方法及如何达成一致性操作
- 2021-10-11 寻找二叉树结点的前驱或后继结点(用到parent指针)
- 20190101.DDD笔记
- django防止csrf跨域伪造攻击
- mybatis-plus排除非表中字段
- protobuf java service_【java】protoc不生成.proto中的service,只生成model相关类,求助。...
- 也许,真的有2012
- Excel 2016 对数据做线性回归分析步骤
- 是计算机系男神女神用英语怎么说,生日快乐我的男神英文怎么写
- js下载文件 阿星小栈
- matlab 此上下文中不允许函数定义,错误: 此上下文中不允许函数定义。怎么办
- MySQL的文本导入load data local
- jquery实现滑动滚动条出现对联广告
- Linux按键响应测试
- python series转置储存到excel_P9:pythonpandas玩转excel文件
- 揭开手机天线材料LCP的神秘面纱
- 简洁明了的插值音频重采样算法例子 (附完整C代码)
- The class file xxx contains a signature 'xxx;' ill-formed at position 6 问题的解决
热门文章
- 利用OpenSearch API检索和下载数据 附Python代码实例
- Freemarker下载Word文档(文字+图片+表格)Idea示例 (附word展示图片异常解决方案)(附JPEG格式图片通过imageio.read方法读取为null解决方案)
- 《钢铁飞龙之奥特曼崛起》获赞 导演分享创作心得
- 计算机动画制作第一节教案,付雪_ 第四章动画制作_第一节制作逐帧动画——教案设计(7页)-原创力文档...
- valet mac_将Laravel Valet用于Super Quick Dev Server
- EXCEL表格-批量去除百分号%的三种方案
- 执法仪app音视频相关
- 宽php边框粗细_phpexcel导出excel外边框加粗,边框细线,合并单元格,换行,居中,上边距,左边距,打印设置...
- 实战element 的rate使用iconfont图标
- 《J2SE 回炉再造16》-------溺水狗