自然語言處理觀念整理-3
text classification
text classification是將原始資料進行標註, 透過ML訓練模型, 用來預測新的一句話是屬於何種分類
文本分類有分為多種形態:
- 二元分類: 一個文件被賦予一個是非的答案
- 多元分類: 一個文件被賦予一個特定的答案
- 多標籤分類 : 一個文件被賦予多個標籤, 如體育新聞被標註體育.籃球...等等
文本分類有許多應用應用場景例如:
- email分類, 垃圾郵件分類
- 搜尋引擎, 推薦系統
- 顧客問題分類
- 評價情緒分析
- 語言識別
- 作者識別
- 真假新聞
建構分類的pipeline
- 蒐集標籤資料組
- 將資料拆成訓練. 驗證. 測試
- 決定評估指標
- 將原文轉換維特徵向量
- 使用訓練組特徵向量來進行訓練模型
- 使用測試組與指標評估模型
- 部屬模型並進行監控
常用評估指標有
- accuracy, precision, recall, F1, ROC, 矛盾矩陣
- 特殊領域也有特定的評估KPI
一個簡單的範例如下, 可參考這裡
from sklearn.linear_model import LogisticRegression #import
logreg = LogisticRegression(class_weight="balanced") #instantiate a logistic regression model
logreg.fit(X_train_dtm, y_train) #fit the model with training data
#Make predictions on test data
y_pred_class = logreg.predict(X_test_dtm)
#calculate evaluation measures:
print("Accuracy: ", accuracy_score(y_test, y_pred_class))
print("AUC: ", roc_auc_score(y_test, y_pred_prob))
cnf_matrix = confusion_matrix(y_test, y_pred_class)
plt.figure(figsize=(8,6))
plot_confusion_matrix(cnf_matrix, classes=['Not Relevant','Relevant'],normalize=True,
title='Confusion matrix with normalization')
分類器性能低下原因
- 過於稀疏矩陣, 特正向量太過龐大 >> embedding
- 資料類別不平衡問題 >> upper or down sample
- 更好的演算法與調參 >> 每個都要試試看
- 更好的原文表示法 >> 依照功能需求調整
避免稀疏陣列文字表示法
- word embedding : 範例請看這裡
- 次單字embedding與fastText : 快速且可處理OOV問題
- doc embedding : 學習整個文件(句子段落)的表示法
使用深度學習
- 將原文語義單元化, 並轉籌單字索引向量
- 填補原文序列, 使每個元文向量都有相同長度
- 將每個單字索引mapping到一個embedding向量, 可藉由單字索引向量語embedding矩陣相乘
- embedding可替換成訓練好的embedding
- 將3 or 4 當成神經網路結構輸入
- 多調整超參數與參數或使用自動調參
- LSTM比較擅長利用元文的連續性質, 他需要資料量比CNN多很多, 不足的話無法發揮
- 範例請看這裡
使用大型訓練好的模型進行分類(遷移學習)
- 當資料量不足時, 可使用訓練好的模型如BERT
- fine-tune接上自己的分類
- 範例請看Keras ktrain或 pytorch
用lime來解釋分類器預測
缺乏資料標籤建議作法
- 使用既有API進行分類(google分類API)
- 使用開放式data
- 根據經驗法則上label再進行修正
- 使用prodigy之類工具主動學習
- 從隱性或顯性的回饋中學習
實用的建議
- 採用最先進的演算法是個錯誤, 應該快速建立出baseline, 先進模型可能造成大量技術債
- 平衡訓練資料, 設法蒐集更多資料
- 交由專家協助標註
- 將蒐集資料, 建構pipeline, 部屬, 測試, 監控做好, 快速建立模型, 再進行反覆測試
- ensemble演算法, 採多數決
Ref:
- 自然語言處理最佳實務, O'Reilly
沒有留言:
張貼留言