Tiền xử lý dữ liệu (Horse Colic dataset)

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.

Horse Colic
Horse Colic

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).

horse-colic.csv
horse-colic.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)).

Open horse-colic file
Open horse-colic file

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.

Weka first look data
Weka first look data

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.

Discretize
Discretize

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.

NumericToNominal
NumericToNominal

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.

J48 decision tree
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.

Attribute selection
Attribute selection
Select attributes
Selected attributes

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.

Advertisement

Một suy nghĩ 21 thoughts on “Tiền xử lý dữ liệu (Horse Colic dataset)

      1. 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ích

          1. 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ích

  1. 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ích

      1. 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ích

        1. 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ích

          1. 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ích

    1. 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ích

  2. 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ích

Trả lời

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s