OAG-WhoIsWho 赛道二比赛总结

第一次完整地打完一次数据竞赛,虽然成绩一般,但还是学习到了一些东西,特此总结一下。文章主要内容如下:

  1. 赛题介绍
  2. 我的做法
  3. 打代码过程中学到的一些知识
  4. 不足之处与总结

1. 赛题介绍

比赛链接 https://www.biendata.com/competition/aminer2019_2/
简单来说就是同名作者消歧。一篇论文包含的信息有 title,abstract,keywords, venue, year, authors, organizations。最终的提交结果就是,给定你一篇论文的信息还有其中的一个作者名,让你把这篇论文分配给正确的作者 ID。

2. 我的做法

一开始是想把每篇论文作为一个样本,把论文作者 ID 作为样本类别,这样的话,有两万多类,而且每一类的样本数极度不平衡——有些类别只有一两个样本,有些则有 1000 多个样本,所以效果很差。

后面参考了 baseline 的做法,转化成二分类的问题。每个作者 ID 都有自己的论文库信息(包含论文列表,及每篇论文的 title、author、organization 等)。将每一篇论文分别跟候选作者 ID 配对,如果是正确的 ID 那么就是正样本。那么对于配对的一篇论文和一个论文库,如何提取出特征就成了重中之重。这里,我参考了参赛人员提供的两个 baseline (十分感谢参赛大佬的无私分享):(https://www.biendata.com/models/category/3188/L_notebook/
https://www.biendata.com/models/category/2998/L_notebook/)。Baseline 里主要用到了 author, org, year 衍生出来的特征。比如说,当前论文发表的年份,是否在论文库的年份区间里;当前论文的 co-author 跟论文库 co-author 的重叠数;当前论文的 co-org 跟论文库的 co-org 的重叠数。这里要指出一点,我构建了两个跟作者org 有关的特征(注意:是 org 不是 co-org),线下效果有明显提升,但是线上效果却下降很多。我猜测原因是因为 org 缺失特征有点多。除了这些统计特征,我另外构建了跟文本相关的特征,比如,通过对词向量进行平均,得到文本的词向量,然后计算论文的词向量跟论文库词向量之间的相似度。分类器使用的是 catboost。xgboost 和 lightgbm 也有试过,但这里效果不如 catboost。

最后列一下最后自己使用的特征:
co-author 相关特征 6 个(来源于 baseline):
   author_interset_num
   author_interset_num/paper_ids_len
   author_interset_num/paper_authors_len
   author_interset_num/aid_authors_set
   author_interset_num_repeat
   author_interset_num_repeat/aid_authors_len
注:author_interset_num 表示当前论文的 co-author 跟论文库 co-author 的重叠数,repeat 表示当前论文的 co-author 在论文库中的 co-author 出现的次数(可重复)。paper_ids_len 表示论文库的论文数,paper_authors_len 表示当前论文的作者数。aid_author_set 表示论文库中 co-author 的数,aid_authors_len 表示论文库中,co-author 的总次数(可重复)。

co-org 相关特征 6 个
   org_interset_num
   org_interset_num/paper_ids_len
   org_interset_num/paper_orgs_len
   org_interset_num/aid_orgs_set
   org_interset_num_repeat
   org_interset_num_repeat/aid_orgs_len
注:各特征的含义可参考 author。

year 相关特征 10 个(来源于 baseline)
   year_b_min
   year_b_max
   year_b_mean
   year_b_std
   year_b_mm2 = (year_b_min + year_b_max) / 2
   year_b_min-year_a
   year_b_max-year_a
   year_b_mean-year_a
   year_b_mm2-year_a
   year_inside_range
注:year_a 表示当前论文年份, year_b 表示论文库所有论文年份列表

venue 相关特征 2 个:
   venue_count
   venue_count_vlen
注:venue_count 表示当前论文 venue 在论文库中的 venue_list 出现的总次数,venue_count_vlen 表示总次数除以论文库列表 venue_list 的长度

文本相关特征 12 个:
   title_tfidf_tsvd_cos
   title_tfidf_tsvd_cosmax
   title_emb_cos
   title_emb_cosmax
   abstract_tfidf_tsvd_cos
   abstract_tfidf_tsvd_cosmax
   abstract_emb_cos
   abstract_emb_cosmax
   paper_text_tfidf_tsvd_cosmax
   paper_text_tfidf_tsvd_cos
   paper_text_emb_cos
   paper_text_emb_cosmax
注:这里的 paper_text 指的是将论文的 title、abstract、keyword 拼接起来得到的文本。因为 title、abstract 和 keywords 特征缺失值不少,单纯利用 title 等衍生出来的特征可能信息量可能不够。所以拼接起来作为 paper_text,作为新的特征。emb_cos 后缀表示当前论文文本(title or abstract or paper_text)的词向量跟论文库的平均词向量之间的余弦相似度。emb_cosmax 表示跟论文库中所有论文文本的最大余弦相似度。tfidf_tsvd 指的是文本的 tfidf 特征经过 TruncatedSVD 降维后得到的向量。(文本的 tfidf 特征太高维,计算相似度耗时久,所以先用 TSVD 降一下维度。)

最后 b 榜成绩为 93.04(18名)。(其实原本的成绩是 92.93,我先用这个模型预测测试样本,并打上标签,然后合并训练集和测试集一起训练。最后线上提高了一个千分点。当然,这种做法有点玄学,有时效果反而会下降

3. 打代码过程中学到的一些知识

  • pandas 相关用法。经过这次比赛,感觉用 pandas 处理表格数据太方便了!特别是其中的 merge 函数和 apply 函数,简洁又好用。
  • pandas apply 进度条。有时候数据较多,或者计算比较复杂的时候,apply 运行比较久,而且也不知道什么时候可以运行完。代码如下:
import tqdm
# 添加下面这行代码,把 apply 改成 progress_apply 就行了
tqdm.tqdm.pandas(desc='apply')
data_stat['author_interset_num'] = data_stat.progress_apply(author_interset, axis=1)
  • 如何计算文本的加权词向量(根据词的 tf-idf 权重进行加权)。(虽然尝试了加权词向量后,效果并没有提升。)

4. 不足之处与总结

  • 线下验证集的构建。感觉构建得不够合理,线下有 99,但是线上只有 70 多(A榜),93(B 榜)
  • 没有做 EDA,没有分析数据的分布,特征的分布。

你可能感兴趣的:(OAG-WhoIsWho 赛道二比赛总结)