aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Chia tập đánh giá AI theo nhóm: tránh để cùng khách hàng xuất hiện ở cả hai phía

Suong Nguyen by Suong Nguyen
27/10/2026
in AI
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một nhóm xây bộ phân loại ticket có thể có nhiều câu hỏi từ cùng khách hàng. Chia ngẫu nhiên từng dòng dễ đưa những câu gần giống nhau vào cả tập huấn luyện và tập kiểm tra. Khi đó, điểm đánh giá chưa chắc phản ánh khả năng phục vụ khách hàng mới.

Bài này dành cho developer đang chuẩn bị dữ liệu thử nghiệm AI. Mục tiêu là kiểm tra ranh giới giữa các nhóm, chưa phải chọn mô hình hay tính accuracy. Các nguyên tắc được đối chiếu tài liệu scikit-learn ngày 27/10/2026; ví dụ chỉ dùng thư viện chuẩn Python, không cần cài scikit-learn.

1. Chọn đơn vị cần giữ độc lập

Hãy viết câu hỏi đánh giá trước khi chọn tỷ lệ chia. Nếu sản phẩm cần xử lý tổ chức chưa từng gặp, organization_id có thể là nhóm phù hợp. Nếu bạn muốn đánh giá trên tài liệu mới, các chunk thuộc cùng tài liệu nên được xem xét cùng nhau. Với nhiều bản sửa của một câu hỏi, ID câu hỏi gốc hữu ích hơn ID từng bản sửa.

Đây là quyết định theo dữ liệu của bạn. Không phải mọi dự án đều phải chia theo khách hàng: bài toán dự báo lần liên hệ tiếp theo của khách cũ có thể cần một ranh giới theo thời gian. Chọn nhầm nhóm vẫn có thể tạo một phép đo không phù hợp, dù chương trình không báo lỗi.

2. Thấy vấn đề bằng sáu dòng dữ liệu giả

Chạy đoạn sau bằng Python 3.9 trở lên. Mỗi khách hàng có hai ticket; nhãn và nội dung thật không cần xuất hiện trong ví dụ này.

rows = [
    {"id": "t1", "customer": "a"},
    {"id": "t2", "customer": "a"},
    {"id": "t3", "customer": "b"},
    {"id": "t4", "customer": "b"},
    {"id": "t5", "customer": "c"},
    {"id": "t6", "customer": "c"},
]

def groups(part):
    return {row["customer"] for row in part}

bad_train, bad_test = rows[::2], rows[1::2]
print(sorted(groups(bad_train) & groups(bad_test)))

Kết quả là ['a', 'b', 'c']. Hai tập không có ticket trùng ID nhưng vẫn chứa cùng ba khách hàng. Ví dụ cố ý chia dòng chẵn/lẻ để vấn đề dễ thấy; nó không đo xác suất trùng nhóm của một thuật toán chia ngẫu nhiên.

3. Chia bằng một danh sách nhóm được giữ lại

Nối đoạn này sau ví dụ trên. Chúng ta chọn khách c làm nhóm kiểm tra cố định để minh họa, không chọn nhóm dựa trên điểm mô hình.

test_customers = {"c"}
train = [r for r in rows if r["customer"] not in test_customers]
test = [r for r in rows if r["customer"] in test_customers]

assert train and test
assert groups(train).isdisjoint(groups(test))
train_ids = {r["id"] for r in train}
test_ids = {r["id"] for r in test}
assert train_ids.isdisjoint(test_ids)
assert len(train_ids | test_ids) == len(rows)
print(len(train), len(test), sorted(groups(test)))

Kết quả mong đợi là 4 2 ['c']. Các assertion kiểm tra hai ranh giới khác nhau: nhóm không giao nhau và bản ghi không giao nhau. Kiểm tra tổng số ID còn giúp phát hiện trường hợp bỏ sót dữ liệu trong fixture này; với dữ liệu thật, kiểm tra ID đầu vào duy nhất trước khi chia.

Nếu dùng scikit-learn, GroupShuffleSplit nhận thông tin nhóm khi chia. Lưu ý test_size của công cụ này tính theo số nhóm, không phải số dòng. Một khách có nhiều ticket có thể khiến tỷ lệ dòng khác xa tỷ lệ nhóm bạn chọn. Đừng sửa tỷ lệ bằng cách chuyển riêng vài ticket của khách đó sang phía còn lại.

4. Lưu kế hoạch chia cùng phiên bản dữ liệu

Một lần đánh giá cần có khả năng tái lập. Bạn có thể lưu danh sách ID nhóm, ID bản ghi và mã phiên bản dataset vào một file nội bộ. Không ghi dữ liệu cá nhân vào repository công khai chỉ để tiện chạy lại.

Khi thêm dữ liệu mới, đối chiếu file kế hoạch thay vì tự chia lại mọi dòng rồi so điểm với lần cũ. Nếu đổi thành phần test, hãy coi đó là một phiên bản đánh giá khác. Cùng tên metric không làm hai tập kiểm tra khác nhau trở nên tương đương.

Kiểm tra thêm trước khi huấn luyện

  • Tìm bản sao hoặc nội dung gần giống thuộc hai ID nhóm khác nhau.
  • Đếm số nhóm, số dòng và phân bố nhãn ở mỗi tập; tập test có thể quá nhỏ hoặc thiếu một lớp.
  • Chỉ học các bước tiền xử lý có tham số từ train, rồi áp dụng sang test.
  • Dùng validation để điều chỉnh cách làm; giữ test dành cho đánh giá đã định trước.

Chia nhóm không tự xử lý rò rỉ từ tương lai, nhãn xuất hiện trong feature hoặc việc chỉnh prompt theo đáp án test. Các lỗi đó cần kiểm tra riêng.

Giới hạn của ví dụ

Fixture sáu dòng đã được chạy bằng Python trong lượt biên tập. Nó chứng minh các assertion và cách giữ nhóm, không chứng minh mô hình tốt hơn. Bài chưa huấn luyện mô hình, chạy splitter của scikit-learn hoặc đo thay đổi chất lượng. Hãy bắt đầu bằng một bộ dữ liệu nhỏ có thể kiểm tra tay, rồi mới mở rộng quy trình.

Nguồn tham khảo

  • scikit-learn: Cross-validation cho dữ liệu theo nhóm
  • scikit-learn: GroupShuffleSplit
  • scikit-learn: Data leakage và tiền xử lý

Tags: AIĐánh giá mô hìnhData leakage
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Zero-shot classification: multi_label thay đổi ý nghĩa score như thế nào?

by Suong Nguyen
29/10/2026
0

Phân biệt score cạnh tranh giữa các nhãn với score độc lập trong zero-shot NLI qua một phép tính Python có thể tự kiểm tra.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Chấm câu trả lời AI tiếng Việt: kiểm tra Unicode NFC trước khi dùng exact match

by Suong Nguyen
28/10/2026
0

Phân biệt chuỗi nhìn giống nhau với chuỗi bằng nhau, xây metric NFC có phiên bản và giữ lại các khác biệt thực sự về dấu tiếng Việt.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Đánh giá truy hồi RAG bằng Recall@k và MRR trước khi sửa prompt

by Suong Nguyen
26/10/2026
0

Tính Recall@k và MRR trên danh sách ID tự tạo để phân biệt thiếu tài liệu liên quan với xếp hạng tài liệu quá thấp.

Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Cosine similarity và dot product: vì sao cùng vector lại xếp hạng khác?

by Suong Nguyen
25/10/2026
0

Tự tính cosine similarity bằng Python để hiểu ảnh hưởng của độ dài vector và kiểm tra cách xếp hạng trong tìm kiếm embedding.

Next Post
Minh họa các khái niệm AI, mạng nơ-ron và lập trình trên máy tính

Chấm câu trả lời AI tiếng Việt: kiểm tra Unicode NFC trước khi dùng exact match

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native TextInput: bàn phím numeric không thay thế validation
  • Phỏng vấn JavaScript: vì sao tách method thành callback lại mất this?
  • Android NumberFormat: tách locale, mã tiền tệ và giá trị cần hiển thị

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply