【比赛实战篇】智能算法赛:智慧海洋建设Top1方案代码

海上安全治理是海洋发展中至关重要的环节,了解各个区域船只的工作情况以及具体位置,可以对于防止因为船只的碰撞等事故而造成的巨大损失,而要提升海上安全治理能力,首要任务是“看得清”,即看得清“是什么、谁在用、做什么”。船舶避碰终端(AIS)、北斗定位终端等通信导航设备的应用,给海上交通和作业带来了极大便利,但同时存在设备信息使用不规范造成的巨大人身和财产损失,给海上安全治理带来了新的挑战。本次赛题基于位置数据对海上目标进行智能识别和作业行为分析,要求选手通过分析渔船北斗设备位置数据,得出该船的生产作业行为,具体判断出是拖网作业、围网作业还是流刺网作业。

此处感谢qyxs的友情分享,关于第一名的代码,我们抽取部分精华简单介绍,详细的细节可以去文末参考qyxs的Github下载code慢慢品味。

本次大赛算法赛阶段第一名团队对经纬度进行geohash编码,

def geohash_encode(latitude, longitude, precision=12):
    """
    Encode a position given in float arguments latitude, longitude to
    a geohash which will have the character count precision.
    """
    lat_interval, lon_interval = (-90.0, 90.0), (-180.0, 180.0)
    base32 = '0123456789bcdefghjkmnpqrstuvwxyz'
    geohash = []
    bits = [16, 8, 4, 2, 1]
    bit = 0
    ch = 0
    even = True
    while len(geohash) < precision:
        if even:
            mid = (lon_interval[0] + lon_interval[1]) / 2
            if longitude > mid:
                ch |= bits[bit]
                lon_interval = (mid, lon_interval[1])
            else:
                lon_interval = (lon_interval[0], mid)
        else:
            mid = (lat_interval[0] + lat_interval[1]) / 2
            if latitude > mid:
                ch |= bits[bit]
                lat_interval = (mid, lat_interval[1])
            else:
                lat_interval = (lat_interval[0], mid)
        even = not even
        if bit < 4:
            bit += 1
        else:
            geohash += base32[ch]
            bit = 0
            ch = 0
    return ''.join(geohash)

然后采用tfidf,countervector,w2v等转换抽取特征并结合诸多细致的统计特征作为最终的特征模块,最后采用LightGBM进行建模,该方案在AB榜单上都取得了Rank1的成绩,同时在AB榜单的第一第二阶段也都十分稳定。

关于tfidf,countervector和w2v等代码如下:

Tfidf代码:

def tfidf(input_values, output_num, output_prefix, seed=1024):
    tfidf_enc = TfidfVectorizer()
    tfidf_vec = tfidf_enc.fit_transform(input_values)
    svd_tmp = TruncatedSVD(n_components=output_num, n_iter=20, random_state=seed)
    svd_tmp = svd_tmp.fit_transform(tfidf_vec)
    svd_tmp = pd.DataFrame(svd_tmp)
    svd_tmp.columns = ['{}_tfidf_{}'.format(output_prefix, i) for i in range(output_num)]
    return svd_tmp

count2vec代码:

def count2vec(input_values, output_num, output_prefix, seed=1024):
    count_enc = CountVectorizer()
    count_vec = count_enc.fit_transform(input_values)
    svd_tmp = TruncatedSVD(n_components=output_num, n_iter=20, random_state=seed)
    svd_tmp = svd_tmp.fit_transform(count_vec)
    svd_tmp = pd.DataFrame(svd_tmp)
    svd_tmp.columns = ['{}_countvec_{}'.format(output_prefix, i) for i in range(output_num)]
    return svd_tmp

word2vec代码:

# workers设为1可复现训练好的词向量,但速度稍慢,若不考虑复现的话,可对此参数进行调整
def w2v_feat(df, group_id, feat, length):
    print('start word2vec ...')
    data_frame = df.groupby(group_id)[feat].agg(list).reset_index()
    model = Word2Vec(data_frame[feat].values, size=length, window=5, min_count=1, sg=1, hs=1,
                     workers=1, iter=10, seed=1, hashfxn=hashfxn)
    data_frame[feat] = data_frame[feat].apply(lambda x: pd.DataFrame([model[c] for c in x]))
    for m in range(length):
        data_frame['w2v_{}_mean'.format(m)] = data_frame[feat].apply(lambda x: x[m].mean())
    del data_frame[feat]
    return data_frame

关于很多其他的细节和我们之前的一篇文章十分类似,此处不再做过多介绍,本文相关代码参见qyxs的Githubhttps://github.com/juzstu/TianChi_HaiYang

个人微信:加时请注明 (昵称+公司/学校+方向)

也欢迎小伙伴加入NLP交流群,刚刚创的,想和大家讨论NLP(若二维码过期可加作者微信)!

你可能感兴趣的:(【比赛实战篇】智能算法赛:智慧海洋建设Top1方案代码)