Khai phá dữ liệu: học từ luật kết hợp trước
Đề cương ôn tập Khai phá dữ liệu 368 trang: học từ luật kết hợp, cây quyết định tới phân cụm — có bài tính tay, mã Python chạy thật, trắc nghiệm kèm đáp án.
Khai phá dữ liệu: học từ luật kết hợp trước
Môn Khai phá dữ liệu có một kiểu sinh viên rất dễ nhận ra. Ngồi nghe giảng về cây quyết định thì gật gù. Đến buổi thầy hỏi "tính Information Gain cho thuộc tính Thời tiết" thì cả lớp cúi mặt xuống bàn. Không phải tại các bạn dốt. Tại vì môn này có hai tầng, và người ta hay dạy tầng trên trước khi người học kịp chắc tầng dưới.
Tầng dưới là đếm. Đếm support, đếm confidence, đếm số bản ghi rơi vào mỗi node. Tầng trên là công thức đẹp — entropy, log, chuẩn hóa. Ai không chắc tầng đếm thì học công thức sẽ chỉ học thuộc, thi xong là quên, và đến lúc làm đồ án thì mở dataset ra không biết bắt đầu từ đâu.
Nên thứ tự ôn hợp lý không phải là thứ tự trong slide. Nó là thứ tự bạn làm khi ngồi trước một file dữ liệu thật.
Bắt đầu từ luật kết hợp, không phải từ phân lớp
Đa số đề cương xếp phân lớp lên trước vì nó "cơ bản hơn". Nhưng Apriori dễ kiểm chứng bằng tay hơn nhiều: bạn đếm được, sai thì thấy sai ngay. Còn chạy cây quyết định mà nhập nhằng ở bước chọn thuộc tính thì kết quả ra một cây vẫn "trông hợp lý", đến lúc thi mới lộ.
Ví dụ kinh điển, giỏ hàng của một cửa hàng tạp hóa nhỏ, 5 hóa đơn:
| Hóa đơn | Mặt hàng |
|---|---|
| T1 | bánh mì, bơ, sữa |
| T2 | bánh mì, bơ |
| T3 | bánh mì, sữa, trứng |
| T4 | bơ, sữa, trứng |
| T5 | bánh mì, bơ, sữa, trứng |
Giờ hỏi một câu rất thi: luật {bánh mì, bơ} → sữa có support và confidence bao nhiêu?
Support của tập {bánh mì, bơ, sữa} là 2/5 = 0,4 — nó xuất hiện ở T1 và T5. Confidence là support của cả ba chia cho support của vế trái {bánh mì, bơ}. Vế trái có ở T1, T2, T5 → 3/5. Vậy confidence = (2/5) / (3/5) = 0,667.
Tính đúng ba bước đó thôi, bạn đã nắm được cái mà đề thi hay hỏi nhất. Phần lớn lỗi sinh viên mắc ở đây là chia nhầm mẫu — lấy 2/5 chia cho tổng số hóa đơn thay vì chia cho support của vế trái. Sai một chỗ, cả bài tự luận mất điểm dây chuyền.
Support nghe thì dễ, nhưng nó là cái bẫy phổ biến nhất của môn này. Với 100 mặt hàng, số tập ứng viên là 2^100. Không có máy nào duyệt hết, kể cả các cụm tính toán lớn. Apriori sinh ra để cắt tỉa đúng chỗ đó: nếu một tập 2 món đã hiếm, thì mọi tập chứa nó cũng hiếm. Đọc cái nguyên lý ấy một lần là hiểu, nhưng phải tự làm vài lượt sinh–tỉa mới nhớ được nó cắt ở tầng nào.
Chỗ sinh viên hay sai nhất: chọn thuộc tính ở cây quyết định
Cây quyết định không khó. Nó chỉ dài. Một đề bài cho bảng 14 dòng, 4 thuộc tính, hỏi "vẽ cây bằng ID3" là bạn phải tính entropy ở ba tầng liên tiếp. Tầng thứ ba mà sai một log thì bốn câu phía sau lệch hết.
Điều nên làm là học thuộc đúng ba con số nền: entropy của tập thuần bằng 0, entropy của tập có hai lớp bằng nhau bằng 1, và Information Gain luôn không âm. Ba neo đó giúp bạn tự kiểm kết quả ngay giữa bài thi — nếu tính ra gain âm thì biết mình nhầm ở đâu đó, khỏi ngồi đoán.
Cái khó chịu của ID3 là nó ưu ái thuộc tính có nhiều giá trị. Cho nên mới sinh ra C4.5 dùng Gain Ratio và CART dùng Gini. Ba phiên bản đó khác nhau đúng một dòng công thức, nhưng đề thi hay gộp chung để dò xem bạn có phân biệt được hay không. Học vẹt ba cái tên thì dễ, nhưng hiểu tại sao người ta bỏ ID3 thì lại phải biết cái bệnh của nó: một cột mã sinh viên duy nhất cho mỗi người sẽ đạt gain cực đại — vô dụng hoàn toàn.
Naive Bayes và cái giả định không ai tin nổi
Naive Bayes có tên gọi phản ánh đúng bản chất: giả định ngây thơ rằng mọi thuộc tính độc lập với nhau. Trong thực tế, "thời tiết nắng" và "nhiệt độ cao" liên quan chặt tới nhau, chẳng độc lập gì. Giả định đó không đúng, ai cũng biết, nhưng mô hình vẫn chạy tốt trên văn bản. Vì sao vẫn tốt thì đến nay người ta tranh luận chưa ngã ngũ.
Cái dễ mất điểm của Bayes không nằm ở công thức mà ở chỗ xác suất bằng 0. Nếu trong tập huấn luyện chưa từng xuất hiện một từ nào đó, P(từ|chủ đề) = 0, nhân vào là cả biểu thức sập về 0. Cách chữa là Laplace smoothing, cộng thêm 1 vào tử và m. Vấn đề: nhiều bạn áp smoothing xong không nhớ là phải cộng m vào mẫu số, thế là phân phối không còn cộng lại bằng 1 nữa.
Đánh giá mô hình: phần bị học đối phó nhiều nhất
Đây là chương mà sinh viên hay gạch đầu dòng để học đối phó, và cũng là chương đi theo các bạn lâu nhất. Ngồi phòng phỏng vấn thực tập vị trí phân tích dữ liệu, câu đầu người ta hay hỏi không phải là "kể tên ba thuật toán" mà là "accuracy 95% thì mô hình này đã tốt chưa".
Câu trả lời hay nhất: chưa chắc, phụ thuộc bài toán. Nếu dữ liệu mất cân bằng kiểu 99% ca âm và 1% ca dương, một mô hình đoán toàn âm đã đạt accuracy 99%. Con số nghe đẹp mà vô giá trị với thực tế.
Precision và Recall mới là cặp đôi phải phân biệt cho bằng được. Ví dụ dễ nhớ: hệ thống lọc thư rác. Precision là trong số thư nó đánh dấu là rác, bao nhiêu cái đúng là rác. Recall là trong số thư rác thật, nó bắt được bao nhiêu. Bạn chỉnh cho nó bắt thư rác mạnh tay quá thì hay quét nhầm cả thư công việc vào thùng rác — precision tụt. Chỉnh cho an toàn quá thì rác cứ lọt vào hộp thư — recall tụt. Không có cách nào tối ưu cả hai cùng lúc.
Bảng nhỏ dưới đây là bốn ô mà giáo trình nào cũng vẽ, nhưng nên tự tay vẽ lại một lần để nhớ nó nằm ở đâu:
| Mô hình đoán Dương | Mô hình đoán Âm | |
|---|---|---|
| Thực tế Dương | TP | FN |
| Thực tế Âm | FP | TN |
Precision = TP/(TP+FP). Recall = TP/(TP+FN). F1 là trung bình điều hòa của hai số đó, đọc lên là thấy: nó phạt trường hợp một số cao một số thấp. Còn ROC và AUC đo khả năng xếp hạng của mô hình tại mọi ngưỡng quyết định — không phụ thuộc vào việc bạn chọn ngưỡng 0,5 hay 0,7. Vì vậy khi dữ liệu lệch, người ta thường nhìn AUC thay vì accuracy.
Phân tích cụm: k-means không tự biết số cụm
k-means là thuật toán đầu tiên ai cũng được dạy. Nó cũng là thuật toán gây nhiều kỳ vọng sai nhất.
Vấn đề số một: bạn phải nói trước cho nó biết có bao nhiêu cụm, tham số k. Trong bài thi thì đề cho k sẵn. Trong đồ án thì không ai cho. Bạn ngồi nhìn một đám mây điểm và tự quyết. Phổ biến là dùng phương pháp elbow — vẽ đường cong theo k rồi tìm chỗ gãy — nhưng chỗ gãy này mờ, có dataset không có chỗ gãy nào rõ ràng cả, và bạn tự lấy k = 3 rồi thuyết minh trong báo cáo.
Vấn đề số hai, dễ mất điểm thi hơn: kết quả k-means phụ thuộc vào cách khởi tạo tâm cụm. Chạy hai lần với hai lần khởi tạo ngẫu nhiên khác nhau có thể ra hai kết quả cụm khác nhau. Đó là lý do người ta dùng k-means++. Nếu đề thi hỏi tại sao kết quả không ổn định, trả lời gọn: vì bài toán tối ưu mà k-means giải là không lồi, chỉ hội tụ về cực trị địa phương.
DBSCAN thì đi theo hướng ngược lại. Không cần biết k, tìm cụm theo mật độ, và nhận ra được cả điểm nhiễu. Đổi lại bạn phải chọn hai tham số epsilon và minPts, mà chúng lại khó chọn hơn k nhiều. Với dữ liệu mà mật độ các vùng khác nhau rõ rệt — kiểu dãy cửa hàng đông ở trung tâm, thưa ở ngoại thành — DBSCAN thường thất bại, nó chỉnh một epsilon cho toàn bộ không gian.
Python: phần phải chạy được, không phải đọc thuộc
Có một thực tế buồn là nhiều bạn học hết môn vẫn chưa tự chạy được Apriori trên dữ liệu của chính mình, chỉ đọc code mẫu trong slide. Đọc code mà không chạy thì cái hiểu chỉ ở mức từ vựng.
Đoạn dưới đây là Apriori viết tay, dạy đúng cái phần "sinh và tỉa" mà giáo trình hay dạy lướt:
def apriori(tx, min_sup):
items = sorted({i for t in tx for i in t})
# L1: đếm từng mặt hàng
cand = [frozenset([i]) for i in items]
freq = {}
k = 1
while cand:
cnt = {c: sum(1 for t in tx if c <= t) for c in cand}
good = {c: n for c, n in cnt.items() if n >= min_sup}
if not good:
break
freq.update(good)
# sinh ứng viên tầng k+1 rồi tỉa
keys = sorted(good.keys())
nxt, seen = [], set()
for i in range(len(keys)):
for j in range(i + 1, len(keys)):
if len(keys[i] | keys[j]) == k + 1:
c = keys[i] | keys[j]
if c not in seen:
seen.add(c)
nxt.append(c)
cand = nxt
k += 1
return freq
tx = [
{"banh_mi", "bo", "sua"},
{"banh_mi", "bo"},
{"banh_mi", "sua", "trung"},
{"bo", "sua", "trung"},
{"banh_mi", "bo", "sua", "trung"},
]
for c, n in sorted(apriori(tx, 2).items(), key=lambda x: -x[1]):
print(sorted(c), n, "support =", n / len(tx))
Chạy đoạn này với min_sup = 2, bạn sẽ thấy {banh_mi, bo, sua} ra đúng 2, khớp với con số đếm tay ở trên. Tự chạy được một lần thì nhớ lâu hơn đọc mười lần. Điểm yếu của code viết tay là chậm — chạy trên file 100.000 dòng sẽ đứng hình — nhưng mục đích ở đây là hiểu thuật toán, không phải tối ưu tốc độ.
Bảng chương và mức ưu tiên
Không phải chương nào cũng đáng đầu tư như nhau. Bảng dưới xếp theo tần suất ra đề và mức độ tốn thời gian thực tế khi ôn:
| Chương | Dạng bài hay ra | Nên dành bao nhiêu thời gian |
|---|---|---|
| Tiền xử lý dữ liệu | Chuẩn hóa, xử lý giá trị thiếu | Ít — đọc lý thuyết, nhớ vài khái niệm |
| Luật kết hợp | Tính support/confidence bằng tay | Nhiều — ra gần như mọi đề |
| Cây quyết định | Tính entropy, Information Gain | Nhiều — tính dài, dễ sai |
| Naive Bayes | Phân lớp văn bản, smoothing | Vừa — nắm smoothing là đủ |
| Đánh giá mô hình | Precision, Recall, F1, ROC, AUC | Nhiều — cả thi lẫn phỏng vấn |
| Phân tích cụm | k-means từng bước, so sánh DBSCAN | Vừa |
| Phát hiện bất thường | Khái niệm, vài phương pháp | Ít — thường chỉ hỏi lý thuyết |
| Khai phá văn bản | Tiền xử lý, biểu diễn văn bản | Ít đến vừa |
Dữ liệu trong bảng này rút từ cấu trúc của đề cương 368 trang đang bán, thứ tự chương bám sát giáo trình giảng ở các trường khối kinh tế và công nghệ tài chính.
Học thế nào cho đỡ mệt
Cách hiệu quả nhất là học theo cặp đếm–công thức. Mỗi khái niệm mới, trước hết tự hỏi "cái này đếm cái gì", rồi mới ghi công thức. Confidence đếm tỉ lệ trong vế trái. Entropy đếm độ trộn của nhãn. Gini đếm xác suất chọn nhầm. Khi nhìn ra chúng đều là đếm dưới một lớp vỏ toán, môn này nhẹ đi rất nhiều.
Một cách nữa: chọn một dataset nhỏ tự làm, cỡ 20 dòng, và làm lại từng thuật toán trên đó bằng tay. Dataset lớn như Iris hay Titanic thì máy chạy hộ, bạn không học được gì. Dataset tự nghĩ ra, bạn phải theo dõi từng bước, sai chỗ nào biết ngay.
Và phải chấp nhận có phần không hiểu hết. Ví dụ tại sao Naive Bayes vẫn chạy tốt dù giả định sai là câu hỏi chưa có lời giải trọn vẹn — bạn không cần hiểu tường tận để làm đúng bài thi. Biết cái gì cần hiểu sâu và cái gì chỉ cần nhớ công thức là một kỹ năng, không phải sự lười.
Hạn chế của tài liệu này, nói thẳng
Đề cương này viết theo chương trình khối kinh tế, tài chính, công nghệ tài chính. Nếu bạn học ngành khoa học máy tính thuần, phần lý thuyết nền sẽ thấy hơi nhẹ so với giáo trình của bạn — cụ thể là phần chứng minh hội tụ của k-means và lý thuyết VC dimension không có trong đây.
Mã Python trong tài liệu viết để hiểu thuật toán, không tối ưu cho dữ liệu lớn. Chạy trên file vài trăm nghìn dòng sẽ chậm. Muốn làm thật thì phải chuyển sang scikit-learn, nhưng hiểu code viết tay trước rồi mới dùng thư viện sẽ đỡ hơn là dùng thư viện ngay từ đầu.
Phần pháp lý và đạo đức dữ liệu được cập nhật tới 2026, nhưng luật về dữ liệu cá nhân ở Việt Nam đang thay đổi khá nhanh, nên đọc phần này để nắm nguyên tắc chứ đừng trích như văn bản pháp quy cuối cùng.
Mua và nhận bài thế nào
Đề cương ôn tập Khai phá dữ liệu là file PDF song ngữ Việt–Anh, 368 trang, có bài tập tính tay kèm lời giải, tự luận có dàn ý, trắc nghiệm có đáp án, và mã Python chạy thật cho từng thuật toán chính.
Giá: 179.000đ.
Xem trước 5 trang đầu — mục lục, một bài luật kết hợp có lời giải, một bài cây quyết định — tại: https://globalmarket.vin/product/de-cuong-khai-pha-du-lieu
Thanh toán bằng chuyển khoản trong nước, không cần thẻ quốc tế. Nhận file trong 24h sau khi chuyển khoản. Nếu cần hoá đơn hay mua theo nhóm lớp, cứ nhắn qua trang sản phẩm.