Last active
June 17, 2021 16:11
-
-
Save behitek/812c136990306e5137f8e0fe336c3eaf to your computer and use it in GitHub Desktop.
- 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 đó.
- Xong (Có cả code dạng project - Pycharm & Code step by step - Google Colab)
- Thuật toán SVM (Support Vector Machine)
- Thuật toán MLP (Multi-Layer Perceptron)
- 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)
Ý 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ụngngram = 1
vàngram = 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.
- 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
- Xem trên link Google Colab
- 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
- 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.
- 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:
- Metric đánh giá: Precision, Recall và F1 score (Về độ đo này, blog anh Tiệp có giải thích rất rõ)
- Độ chính xác giảm rõ rệt khi tăng từ 5 lên 10 người.
- 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.
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 |
- 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
- 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)
- 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