一、背景:
二、解決辦法
解決這個問題的乙個思路就是希望在模型訓練的時候小類和大類的重要性的一樣的,主要可以通過兩種方法實現,乙個是取樣,乙個加權,還有資料增強。
1. 取樣
理論:
取樣分為上取樣和下取樣。上取樣是將小類別複製多份,使得他們的數目與大類別相近。下取樣是在大類別中隨機剔除一些資料,使得大類別和小類別數目相近。
這樣的方法缺點也很明顯了,上取樣的話,由於將小類別樣本複製了多份,那麼模型就容易出現過擬合問題,下取樣的話,由於刪除了一部分資料,那麼模型就有可能學不到一些特徵,模型效能就會降低。
所以綜合了上取樣和下取樣的方法,先是對大類進行多次下取樣,將小類別複製多份與大類別子集合並,從而產生多個訓練子集,用多個訓練子集分別訓練出多個模型,最後用投票的方式得到最後結果。
實踐:
將類別2隨機分成7個子集,每個子集數目與其他小類別數目相近,然後將每乙個類別2的子集與其他小類別的資料合併訓練乙個模型,這樣可以同時訓練7個模型,最後測試的時候用這個7個模型得到的結果進行投票(加權平均)。
結果:
在小類別上的效能是上公升了,但是在大類別上的效能下降了,整體效能與之前差不多,效能沒有得到什麼提公升啊。
2. 加權
針對資料不平衡問題,嘗試使用目標檢測任務中的方法,用focal loss和pull away term loss對各個類別進行加權,使用加權的方法處理不平衡問題是需要大量的調參的,而且我們有4個類別,調參組合很多,很難調參。目前使用最簡單粗暴的引數設定,y=2,alpha=0,效能有一點提公升,在巨集平均上有1%左右的提公升,在微平均上與baseline持平。
3. 資料增強
理論:
之前在上取樣中提到,如果將小類別複製多份容易產生過擬合問題,要解決這個問題,我們其實可以在資料中增加一些隨機擾動,效果可能會好一些。在影象處理裡面,常見的做法是修改rgb值,那麼在文字處理裡面,我想到可以使用同義詞替換來構造小類別樣本。
實踐:
(1)在github上找到了哈工大同義詞林的最新版,選取其中的同義詞,共計9995對,55846個詞。
(2)由於乙個詞可能會有多個同義詞,我採用隨機選取的方式構造語料,測試結果如下所示:
發現構造結果非常不好,思考了一下,應該是因為同義詞的涉及領域太廣了,所以對同義詞進行了刪選。
(3)用手機領域的背景語料對同義詞進行了刪選,最後還剩31225個詞。為了防止過擬合,對替換的句子進行了篩選,只選取了替換處大於3處的句子。用刪選後的同義詞構造語料,測試結果如下所示:
發現情況好一些了,但是還是不確定這樣的語料是否有效。
(4)採用2種方式構造小類別資料,1種是全句替換,另外1種是保留意見解釋片段,只替換上下文。還沒有跑出結果。
擴充套件做法:
1. 如果同義詞隨機替換的方法沒有效果,也可採用計算embedding相似度的方法替換,沒進行過嘗試,以後有時間可以探索一下。
2. 為了使替換的同義詞更準確,也可以加入詞性分析。
結果:
按照上述步驟處理之後,用新的資料集在baseline模型上進行了測試,模型分類效果顯著,得到了目前為止的最高效能。
關於目標檢測不平衡問題的一些工作
之前開的組會分享了一些在這方面的頂會,這邊放部落格上分享。關於目標檢測的不平衡問題,推薦閱讀 two stage目標檢測演算法回顧 本文主要分享的工作都是基於two stage的,不妨先回顧一下。以faster rcnn為例 下面講一下三個方面的imbalance。easy hard imbalan...
類別不平衡資料的處理
1.不平衡學習的基本概念及處理方法分類 重點學習 分類中解決類別不平衡問題 綜述重點 2.學習adacost對adaboost的改進方式 實現基於代價敏感的adacost演算法 3.smote演算法的matlab實現 基於matlab,應用smote演算法對小樣本類進行過取樣 python中可以呼叫...
處理不平衡資料的方法
處理不平衡資料我們可以採用欠 下 取樣和過 上 取樣的方法。欠 下 取樣 就是從資料量較多那類樣本中,隨機選出與資料較少那類樣本數量相同的樣本,最終組成正負樣本數量相同的樣本集。過 上 取樣 對樣本中數量較少的那類樣本生成演算法補齊,使之達到與較多那類樣本相匹配的數量,如smoto演算法。合成新樣本...