第一次完整地打完一次數據競賽膜廊,雖然成績一般,但還是學習到了一些東西夭禽,特此總結一下城菊。文章主要內容如下:
- 賽題介紹
- 我的做法
- 打代碼過程中學到的一些知識
- 不足之處與總結
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 衍生出來的特征嗅骄。比如說胳挎,當前論文發(fā)表的年份,是否在論文庫的年份區(qū)間里溺森;當前論文的 co-author 跟論文庫 co-author 的重疊數慕爬;當前論文的 co-org 跟論文庫的 co-org 的重疊數。這里要指出一點屏积,我構建了兩個跟作者org 有關的特征(注意:是 org 不是 co-org)医窿,線下效果有明顯提升,但是線上效果卻下降很多炊林。我猜測原因是因為 org 缺失特征有點多姥卢。除了這些統(tǒng)計特征,我另外構建了跟文本相關的特征铛铁,比如隔显,通過對詞向量進行平均却妨,得到文本的詞向量,然后計算論文的詞向量跟論文庫詞向量之間的相似度括眠。分類器使用的是 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 榜成績?yōu)?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,沒有分析數據的分布妒茬,特征的分布。