Trong bài viết này, ta sẽ áp dụng những kiến thức liên quan đến lấy và làm sạch dữ liệu (gọi chung là tiền xử lý dữ liệu) trên tập dữ liệu Horse Colic (chứng đau bụng ở ngựa). Để dễ tiếp cận, các thao tác được thực hiện với Weka.

Tập dữ liệu: horse-colic
Notebooks: python.
Chuyển đổi định dạng file
Tập dữ liệu ban đầu chỉ chứa các giá trị của các thuộc tính.
2 1 530101 38.50 66 28 3 3 ? 2 5 4 4 ? ? ? 3 5 45.00 8.40 ? ? 2 2 11300 00000 00000 2 1 1 534817 39.2 88 20 ? ? 4 1 3 4 2 ? ? ? 4 2 50 85 2 2 3 2 02208 00000 00000 2 2 1 530334 38.30 40 24 1 1 3 1 3 3 1 ? ? ? 1 1 33.00 6.70 ? ? 1 2 00000 00000 00000 1 1 9 5290409 39.10 164 84 4 1 6 2 2 4 4 1 2 5.00 3 ? 48.00 7.20 3 5.30 2 1 02208 00000 00000 1 2 1 530255 37.30 104 35 ? ? 6 2 ? ? ? ? ? ? ? ? 74.00 7.40 ? ? 2 2 04300 00000 00000 2 2 1 528355 ? ? ? 2 1 3 1 2 3 2 2 1 ? 3 3 ? ? ? ? 1 2 00000 00000 00000 2 1 1 526802 37.90 48 16 1 1 1 1 3 3 3 1 1 ? 3 5 37.00 7.00 ? ? 1 1 03124 00000 00000 2 1 1 529607 ? 60 ? 3 ? ? 1 ? 4 2 2 1 ? 3 4 44.00 8.30 ? ? 2 1 02208 00000 00000 2 2 1 530051 ? 80 36 3 4 3 1 4 4 4 2 1 ? 3 5 38.00 6.20 ? ? 3 1 03205 00000 00000 2 2 9 5299629 38.30 90 ? 1 ? 1 1 5 3 1 2 1 ? 3 ? 40.00 6.20 1 2.20 1 2 00000 00000 00000 1
Ta tiến hành chuyển dữ liệu từ tập tin horse-colic.data sang bảng tính Excel. Sau đó, dựa vào mô tả dữ liệu để đặt tên cho các thuộc tính (tức là dòng đầu tiên của sheet).
1. TItle: Horse Colic database 2. Source Information -- Creators: Mary McLeish & Matt Cecile Department of Computer Science University of Guelph Guelph, Ontario, Canada N1G 2W1 mdmcleish@water.waterloo.edu -- Donor: Will Taylor (taylor@pluto.arc.nasa.gov) -- Date: 8/6/89 3. Past Usage: -- Unknown 4. Relevant Information: -- 2 data files -- horse-colic.data: 300 training instances -- horse-colic.test: 68 test instances -- Possible class attributes: 24 (whether lesion is surgical) -- others include: 23, 25, 26, and 27 -- Many Data types: (continuous, discrete, and nominal) 5. Number of Instances: 368 (300 for training, 68 for testing)
Cuối cùng, lưu lại theo định dạng csv với tên horse-colic.csv (Weka có thể mở được định dạng csv).

Quan sát tập dữ liệu
Đầu tiên, ta dùng Weka để nạp dữ liệu horse-colic.csv vào chương trình như hình dưới. Ở tab Preprocessing, ta click vào nút Open files. Sau đó, tìm đến nơi lưu file horse-colic.csv ban nãy và click Open (lưu ý: Files of Type ta chọn CSV data file (*.csv)).

Trong tập dữ liệu huấn luyện (training set) tải về, ta quan sát thấy có 300 mẫu dữ liệu, 28 thuộc tính, và 30% dữ liệu bị thiếu giá trị. Thông tin các thuộc tính được tổng hợp trong file attribute.csv. Gồm các thông tin như tên thuộc tính, loại thuộc tính, giá trị trung bình, giá trị độ lệch chuẩn, số mẫu bị thiếu giá trị trên thuộc tính này.

Làm sạch dữ liệu
Trong tập dữ liệu horse-colic.csv có cả thuộc tính số (numeric) và thuộc tính rời rạc (nominal) tuy nhiên tất cả đều biểu diễn dưới dạng số. Yêu cầu đặt ra là phải rời rạc hóa các thuộc tính số để các thuộc tính được mô tả đúng như ý nghĩa của nó. Bên cạnh đó dữ liệu còn có giá trị thiếu, nảy sinh một yêu cầu nữa là phải điền giá trị cho các ô bị thiếu dữ liệu. Giải quyết 2 vấn đề trên ta sẽ sử dụng đến một số bộ lọc (filter) của Weka (nằm trong thư mục Unsupervised/Attribute).
Trước tiên, ta chuẩn hóa các thuộc tính số về đoạn [0, 1] bằng bộ lọc Normalize. Sau đó, dùng bộ lọc ReplaceMissingValue để thay thế tất cả các giá trị thiếu bằng giá trị trung bình của thuộc tính.
Tiếp đến, ta dùng bộ lọc Discretize: là bộ lọc dùng để rời rạc hóa các thuộc tính numeric thành nomial. Việc rời rạc đơn giản bằng cách chia giỏ (binning), sắp xếp và chia dữ liệu vào các giỏ có cùng độ rộng (equal-width). Chia vùng giá trị thành N khoảng cùng kích thước, Độ rộng của từng khoảng = (giá trị lớn nhất – giá trị nhỏ nhất)/N. Mặc định, Weka gán N=10.

Cuối cùng, ta dùng bộ lọc NumericToNominal: là bộ lọc dùng để chuyển các thuộc tính dạng numeric thành nomial. Không như discretization (rời rạc hóa), bộ lọc này gom các mẫu có cùng giá trị vào cùng một nhóm nomial.

Kết quả sau cùng được lưu thành file horse-colic.arff.
Rút gọn dữ liệu
Dữ liệu có thể quá lớn đối với 1 số chương trình khai thác dữ liệu: tốn nhiều thời gian. Ta rút gọn dữ liệu (kích thước) sao cho vẫn thu được cùng (hoặc gần như cùng) kết quả phân tích. Ta dùng phương pháp giảm số chiều dữ liệu bằng thuật toán cây quyết định.
Đầu tiên, ta xây dựng cây quyết định J48. Trong tab Classify, ta chọn Classifier J48 decision tree.

Tiếp theo, ta loại các thuộc tính không xuất hiện trên cây.


Như vậy các thuộc tính được thu gọn chỉ còn 5 thuộc tính thay vì 28 thuộc tính như ban đầu.
Kết luận
Qua bài viết này, khi thao tác với tập dữ liệu Horse Colic, ta có thể thấy dữ liệu trong thực tế có chất lượng xấu (dữ liệu bị thiếu và không đầy đủ). Sau các bước làm sạch dữ liệu và rút gọn dữ liệu, ta có thể tiến hành khai thác dữ liệu ở những bước sau này.
Anh ơi, em có 1 câu hỏi là tại sau bước discretization rồi thì tất cả các attribute đều là nominal rồi thì tại sao lại cần thêm bước numericToNominal nữa anh?
Em cám ơn
ThíchThích
Discretize và NumericToNominal đều có chức năng như nhau là chia giỏ dữ liệu số. Em có thể dùng tách biệt hai tính năng này hay sử dụng qua lại để chọn ra bộ lọc phù hợp nhé.
ThíchThích
Chào Anh, Em hiện đang làm LV về phân lớp dữ liệu mất cân bằng. Anh có thể giúp Em thao tác tiền xử lý bộ dữ liệu pima-indians-diabetes với ạ. Trong bộ dữ liệu Pima, có nhiều bản ghi trống thông tin, em muốn hỏi thao tác xóa các bản ghi bị trống được không ạ. Em xin trân trọng cảm ơn Anh!
ThíchThích
Hi em, em dùng Pandas thì thử lệnh này
df1 = df[df.isnull().any(axis=1)]
ThíchThích
Em cảm ơn Anh nhiều, Anh cho em hỏi nếu trường hợp xóa missing data của em chỉ xử lý trên weka có được không Anh. Nếu được mong Anh chỉ giúp Em ạ. Em cảm ơn A.
ThíchThích
a cho em hỏi là chuyển đổi file dữ liệu txt (http://archive.ics.uci.edu/ml/machine-learning-databases/horse-colic/horse-colic.names) như thế nào để có file dữ liệu excel? Weka ah?
ThíchThích
em viết script python, đọc từng dòng với các cột theo thứ tự như trong file description như em gửi, sau đó chuyển sang dạng csv bằng cách thay dấu khoảng trắng bằng dấu “,”
ThíchĐã thích bởi 1 người
Chào anh, blog của anh rất hay, em đang là sinh viên và cũng đang tìm tòi về ML. Anh cho em hỏi ở project thực tế, ngoài Weka ra anh còn dùng những tool hay phương pháp nào khác để data preprocessing không ạ? Cám ơn anh nhiều.
ThíchThích
Hi em, project thực tế cũng tương tự như vậy, nhưng đa số em sẽ tự viết script để xử lý hơn là dùng các tool (vì không đáp ứng được nhiều nhu cầu bên ngoài).
ThíchĐã thích bởi 1 người
Cám ơn anh đã trả lời, anh có thể ví dụ giúp em mình sẽ phải xử lý những gì không anh. Vì nếu như những ví dụ của anh phía trên thì Weka đã có thể giải quyết được rồi.
ThíchThích
Giả sử em muốn xử lý loại bỏ missing data và data của em lên đến 10Gb. Nếu dùng Weka thì em sẽ phải ngồi đợi load hết data lên rồi mới áp dụng hàm xử lý như vậy sẽ rất lâu. Thay vì vậy, em có thể viết script xử lý từng dòng (không load hết dữ liệu), hay đơn giản sử dụng command line để lọc. Sau đó, lưu lại thành data mới processed-data để phục vụ cho nghiên cứu tiếp theo.
Hoặc yêu cầu đòi hỏi em phải aggregate tất cả dữ liệu lại để thống kê theo giờ/ngày/tháng và hiển thị report để quan sát. Trong trường hợp này, rõ ràng Weka không hỗ trợ.
ThíchThích
Rất cảm ơn anh ạ, em chỉ mới làm ML trên 1 số data mẫu nhỏ như pima indian diabet hoặc iris nên không biết nhiều tình huống khác nhau trên thực tế cũng như khi kích thước của data trở nên lớn. Cám ơn anh đã trả lời chi tiết ạ.
ThíchThích
Trong thực tế mình phải xem dữ liệu thiếu có đặc biệt không, đúng không anh? Mình sẽ phải visualize để theo dõi các dữ liệu này hay như thế nào? Anh giới thiệu một vài phương pháp được không?
ThíchThích
Chắc bạn thu thập dữ liệu liên tục mới qua tâm đến monitor. Chủ yếu họ sử dụng line chart để quan sát sự thay đổi theo thời gian hoặc bar chart để biết mức độ mất mát dữ liệu là bao nhiêu. Tuỳ metrics mà ta sẽ thiết kế để theo dõi sao cho tiện nên ko có khuôn mẫu nào.
ThíchThích
Em chào anh. Em xem blog của anh rất thú vị. Em có đang nghiên cứu về tiền xử lý dữ liệu, nhưng em không biết cách viết script như nào. ANh có thể cho em xem mẫu 1 script đc ko ạ? Nếu được anh gửi vào mail chiphung.ltl@gmail.com giúp em với. Em đang rất cần ạ. Cảm ơn anh
ThíchThích
Cho em hỏi, làm cách nào để config weka kết nối mysql trên ubuntu ạ?
Em thử mấy lần thì đều báo lỗi.
ThíchThích
cho em hỏi là , làm thế nào để bỏ đc dấu âm trong dự liệu ạ
em cảm ơn
ThíchThích
lấy absolute value em
ThíchThích
Vì em mới bắt đầu tìm hiểu về khai phá dữ liệu nên muốn hỏi anh câu này: Mục đích của tiền xử lý dữ liệu là gì ?
Mong anh trả lời giúp em
ThíchThích
để làm đầu vào cho các phân tích khác, thường được miêu tả qua câu “garbage in, garbage out”
ThíchThích