Skip to content

Instantly share code, notes, and snippets.

@behitek
Last active June 17, 2021 16:11
Show Gist options
  • Save behitek/812c136990306e5137f8e0fe336c3eaf to your computer and use it in GitHub Desktop.
Save behitek/812c136990306e5137f8e0fe336c3eaf to your computer and use it in GitHub Desktop.

Open In Colab

Xây dựng bài toán

  • Yêu cầu đề bài: Phân loại nội dung email theo người gửi
  • Loại bài toán: Text Classification
  • Mục tiêu: Xây dựng được mô hình phân loại có thể dự đoán được người gửi (trong danh sách training) từ 1 nội dung email (chưa gặp trong training) được cung cấp.
  • Dữ liệu: Dữ liệu có nhãn, data là nội dung của email; label là người gửi email đó.

Chạy được kết quả

  • Xong (Có cả code dạng project - Pycharm & Code step by step - Google Colab)

Hiểu giải thuật

  • Thuật toán SVM (Support Vector Machine)
  • Thuật toán MLP (Multi-Layer Perceptron)

Tại sao chọn SVM và MLP?

  • Bài toán dự đoán người gửi dựa vào nội dung email thuộc thể loại bài toán Phân loại văn bản (Text Classification)
  • SVM là một thuật toán học máy truyền thống cho kết quả vượt trội với bài toán phân loại văn bản.
  • MLP là một mô hình học sâu (deep learning) cơ bản nhất
  • Mục tiêu sử dụng 2 thuật toán này để so sánh 1 mô hình truyền thống cho kết quả tốt và 1 mô hình học sâu (đang nổi)

Vẽ sơ đồ giải thuật

Luyện Code Online

Ý tưởng chung:

  • Để xác định email của một người nào đó chúng ta sẽ dựa vào các từ/cụm từ người đó hay sử dụng. Do vậy, nếu có nhiều email của 1 người, ta có thể xác định được thói quen sử dụng của người đó mà đoán biết được.
  • Tuy nhiên, với máy tính thì ta cần biểu diễn chúng sang các vector số để máy tính có thể tính toán trên đó được. Quy trình:
    • CountVectorizer: Đếm tần suất xuất hiện của các từ, cụm từ trong email của từng người. Việc này giúp ta xác định được các từ/cụm từ mà mỗi người thường xuyên sử dụng nhất. Tuy nhiên, có nhiều từ được sử dụng nhiều nhưng chưa chắc đã có ý nghĩa, ví dụ: the, a, me, subject, forwarded to, ... Sau bước này, mỗi email ta thu được 1 vector đếm tần suất suất hiện từng từ trong email đó. Tại bước này, chúng ta thỉết lập ngram = (1,2): Đếm các từ đơn và 2 từ liên tiếp nhau. Việc sử dụng ngram lớn hơn có thể cho kết quả tốt hơn nhưng tốc độ sẽ chậm đi rất nhiều. Do vậy, sử dụng ngram = 1ngram = 2 là con số hợp lý.
    • TfidfTransformer: Thực hiện tính toán lại từ kết quả của CountVectorizer. Đánh giá cao sự hiện diện của các cụm từ xuất hiện nhiều ở 1 người nào đó mà ít xuất hiện ở những người còn lại. Sau bước này, mỗi email ta thu được 1 vector thể hiện trọng số của từng từ có trong email đó.
    • Classifier: Từ kết quả ở bước TfidfTransformer, ta đem biểu diễn chung lên không gian đa chiều. Classifier sẽ đi tìm 1 hàm số f(x) = y để từ email x, hàm sô f(x) có thể dự đoán ra người gửi y.

Chạy từng bước minh họa

  • Xem trên link Google Colab

Phân tích kết quả chạy – trực quan dữ liệu

  • Một phần phân tích đã ghi rõ trên Google Colab
  • Dữ liệu được trực quan hóa qua biểu đồ trên Colab

Kết quả chạy với thuật toán SVM

  • Với 5 người (ngram = 2): Độ chính xác trung bình đạt 75%
    • precision: độ đo Precision
    • recall: độ đo Recall
    • F1-score: Độ đo F1 (Giá trị biểu diễn cho 2 đại lượng Precision và Recall)
    • support: Số lượng phần tử của nhãn đó được đem đi đánh giá
    • accuracy: tỉ lệ đúng / tổng số
              precision    recall  f1-score   support

           0       0.87      0.86      0.87       284
           1       0.71      0.64      0.67       301
           2       0.79      0.82      0.80       316
           3       0.75      0.72      0.74       309
           4       0.66      0.73      0.69       290

    accuracy                           0.75      1500
   macro avg       0.76      0.76      0.75      1500
weighted avg       0.76      0.75      0.75      1500
  • Với 10 người (ngram = 2): Độ chính xác trung bình đạt 58%
              precision    recall  f1-score   support

           0       0.54      0.64      0.58       288
           1       0.57      0.56      0.56       292
           2       0.48      0.51      0.49       265
           3       0.46      0.60      0.52       290
           4       0.70      0.42      0.53       303
           5       0.48      0.59      0.53       324
           6       0.71      0.73      0.72       318
           7       0.60      0.56      0.58       308
           8       0.74      0.71      0.72       292
           9       0.61      0.47      0.53       320

    accuracy                           0.58      3000
   macro avg       0.59      0.58      0.58      3000
weighted avg       0.59      0.58      0.58      3000

Nhận xét:

  • Độ chính xác giảm rõ rệt khi tăng từ 5 lên 10 người.

Kết quả chạy với thuật toán MLP

  • Với 5 người (ngram = 2): Độ chính xác trung bình đạt 87%
              precision    recall  f1-score   support

           0       0.90      0.94      0.92       284
           1       0.85      0.87      0.86       301
           2       0.91      0.87      0.89       316
           3       0.86      0.80      0.83       309
           4       0.82      0.86      0.84       290

    accuracy                           0.87      1500
   macro avg       0.87      0.87      0.87      1500
weighted avg       0.87      0.87      0.87      1500
  • Với 10 người (ngram = 2): Độ chính xác trung bình đạt 79%
              precision    recall  f1-score   support

           0       0.75      0.82      0.78       288
           1       0.84      0.92      0.88       292
           2       0.63      0.64      0.64       265
           3       0.75      0.65      0.70       290
           4       0.81      0.87      0.84       303
           5       0.83      0.89      0.86       324
           6       0.87      0.86      0.86       318
           7       0.78      0.68      0.73       308
           8       0.87      0.83      0.85       292
           9       0.75      0.72      0.74       320

    accuracy                           0.79      3000
   macro avg       0.79      0.79      0.79      3000
weighted avg       0.79      0.79      0.79      3000

Nhận xét:

So sánh 2 mô hình

  • Cả 2 mô hình đều sử dụng ngram = 2 để tăng độ chính xác
  • SVM là 1 thuật toán học máy truyền thống, biểu diễn dữ liệu sang không gian nhiều chiều. Tại đó, SVM tạo ra các siêu mặt phẳng để phân tách các nhãn khác nhau.
  • MLP là một thuật toán học sâu (Neural network) với input layer (1 layer), output layer (1 layer) và các hidden layer. Mô hình khởi tạo các tham số ngẫu nhiên và sau đó tối ưu tham số dựa vào optimizer và loss.
  • Do MLP có kiến trúc sâu hơn, số step huấn luyện nhiều hơn, cho ra function có độ phức tạp hơn nên độ chính xác cao hơn rõ rệt.

Phân tích điểm mạnh & điểm yếu

SVM MLP
Có kiến trúc đơn giản Có kiến trúc phức tạp hơn
Là một mô hình học máy truyền thống Mô hình mạng Neural network
Thời gian tính toán (huấn luyện, dự đoán) nhanh hơn Thời gian tính toán (huấn luyện, dự đoán) chậm hơn
Yêu cầu ít tài nguyên hơn khi huấn luyện Yêu cầu cấu hình thiết bị huấn luyện cao hơn
Độ chính xác kém hơn MLP Độ chính xác tốt hơn SVM
Tối ưu dựa vào khoảng cách giữa các điểm dữ liệu ở các nhãn khác nhau, nên nếu trường hợp dữ liệu chồng chéo nhau thì độ chính xác khi tạo ra siêu phẳng sẽ giảm nhiều Tối ưu dựa vào optimizer và loss có thể đạt hiệu quả cao hơn trong trường hợp bài toán phức tạp
Tìm kiếm không gian biểu diễn dữ liệu là yếu tố then chốt của SVM MLP không quan tâm tới việc biểu diễn dữ liệu lên không gian

Ngữ cảnh dữ liệu

  • Dữ liệu ngắn, dài lẫn lộn. Có những email nội dung rất dài nhưng cũng có những email cực kỳ ngắn
  • Với email ngắn thì rất khó phân loại
  • Người dùng có quá ít email cũng rất khó xác định đặc trưng email của họ
  • Dữ liệu khá nhiều nhiễu, việc tiền xử lý cực kỳ quan trọng

Loại dữ liệu

  • Dữ liệu văn bản thuần thúy
  • Ngôn ngữ: tiếng Anh
  • Dữ liệu mất cân bằng (un-balance dataset)

Khắc phục điểm yếu: nêu giải pháp (search - idea)

  • Vấn đề dữ liệu nhiễu:
    • Tiền xử lý bằng code
    • Giải pháp đã được trình bày trên Colab
  • Vấn đề dữ liệu mất cân bằng:
    • Áp dụng chiến lược cân bằng dữ liệu bằng cách xóa bớt dữ liệu của các user có nhiều email.
    • Giải pháp đã được trình bày trên Colab
  • Vấn đề khi phân loại nhiều user
    • Độ chính xác sẽ giảm khi tăng số lượng nhãn (số user)
    • Chưa có giải pháp @@
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment