Trước khi chạy một mô hình, như hồi quy (dự đoán biến liên tục) hay phân loại (dự đoán biến rời rạc), bạn hầu như luôn muốn thực hiện một số tiền xử lý. Với các biến số, phổ biến là bạn sẽ chuẩn hóa về khoảng [0,1] (normalize) hoặc chuẩn hóa theo Z-score (standardize) dữ liệu. Các thuật ngữ này nghĩa là gì?
Normalize chỉ đơn giản là biến đổi dữ liệu sao cho giá trị nhỏ nhất là 0 và lớn nhất là 1. Để đạt được điều này, ta biến đổi mỗi điểm dữ liệu $x$ thành
$$x_{normalized} = \frac{x-x_{min}}{x_{max}-x_{min}}.$$
Standardize hơi khác: mục tiêu là đưa dữ liệu về trung tâm quanh 0 và chuẩn hóa theo độ lệch chuẩn:
$$x_{standardized} = \frac{x-\mu}{\sigma},$$
với $\mu$ và $\sigma$ lần lượt là trung bình và độ lệch chuẩn của tập dữ liệu. Trước hết lưu ý rằng các phép biến đổi này chỉ thay đổi khoảng giá trị chứ không thay đổi phân phối. Sau đó bạn có thể muốn dùng các biến đổi khác, như log hoặc Box-Cox, để dữ liệu trông giống phân phối Gauss hơn (hình chuông). Nhưng trước khi đi xa hơn, điều quan trọng là hỏi: vì sao ta chuẩn hóa dữ liệu? Khi nào thì phù hợp hơn? Ví dụ, liệu nó quan trọng hơn trong phân loại so với hồi quy không?
Hãy đào sâu vào các bài toán phân loại trước và xem việc chuẩn hóa ảnh hưởng đến hiệu năng của k-láng giềng gần nhất thế nào:
Trong bài viết này, tôi sẽ dùng ví dụ về việc chuẩn hóa dữ liệu số (dữ liệu số: dữ liệu gồm các con số, trái với dữ liệu phân loại/chuỗi; chuẩn hóa/scaling: dùng các phép toán cơ bản để thay đổi khoảng giá trị của dữ liệu; chi tiết sẽ ở phần sau) để minh họa tầm quan trọng của việc xem tiền xử lý như một phần của cấu trúc lớn hơn: quy trình máy học (ML). Để làm rõ, chúng ta sẽ xem một ví dụ thực tế trong đó việc chuẩn hóa có thể cải thiện hiệu năng mô hình.
Trước hết, tôi sẽ giới thiệu bài toán phân loại trong ML và k-láng giềng gần nhất (k-Nearest Neighbors), một trong những thuật toán đơn giản nhất dùng trong bối cảnh này. Để hiểu tầm quan trọng của việc chuẩn hóa dữ liệu số trong bối cảnh đó, tôi sẽ giới thiệu các thước đo hiệu năng mô hình cùng khái niệm tập huấn luyện và tập kiểm tra. Bạn sẽ thấy tất cả các khái niệm và thực hành này được áp dụng với một tập dữ liệu mà tôi cố gắng phân loại chất lượng rượu vang đỏ. Tôi cũng sẽ đặt tiền xử lý vào vị trí hữu ích nhất của nó: gần phần đầu của quy trình khoa học dữ liệu lặp. Tất cả ví dụ đều dùng Python. Nếu bạn chưa quen với Python, bạn có thể xem các khóa học của DataCamp tại đây. Tôi sẽ sử dụng thư viện pandas cho nhu cầu về dataframe và scikit-learn cho nhu cầu về máy học.
Đây là phần một của loạt hướng dẫn ba phần:
Phần 2: Đưa về trung tâm, Chuẩn hóa và Hồi quy Logistic
Phần 3: Chuẩn hóa Dữ liệu Tổng hợp
Lược giới thiệu về các bài toán phân loại trong Máy học
Phân loại và gán nhãn các sự vật trong thế giới hiện tượng là một nghệ thuật lâu đời. Vào thế kỷ 4 TCN, Aristotle đã xây dựng một hệ thống phân loại sinh vật được sử dụng trong 2.000 năm. Ngày nay, phân loại thường được coi là một nhiệm vụ máy học, cụ thể là một nhiệm vụ học có giám sát. Nguyên lý cơ bản của học có giám sát rất đơn giản: chúng ta có một loạt dữ liệu gồm các biến dự đoán và một biến đích. Mục tiêu của học có giám sát là xây dựng một mô hình "giỏi" dự đoán biến đích dựa trên các biến dự đoán. Nếu biến đích gồm các hạng mục (ví dụ 'nhấp' hoặc 'không', khối u 'ác tính' hoặc 'lành tính'), ta gọi nhiệm vụ học này là phân loại. Ngược lại, nếu biến đích là biến thay đổi liên tục (ví dụ giá nhà), đó là nhiệm vụ hồi quy.
Một ví dụ minh họa sẽ rất hữu ích: hãy xem tập dữ liệu bệnh tim, trong đó có 75 biến dự đoán như 'tuổi', 'giới tính' và 'có hút thuốc hay không', còn biến đích cho biết sự hiện diện của bệnh tim với thang điểm từ 0 (không bệnh tim) đến 4. Nhiều nghiên cứu về tập dữ liệu này tập trung vào việc phân biệt có bệnh tim hay không. Đây là một bài toán phân loại. Nếu bạn cố gắng dự đoán giá trị thực (0 đến 4) của biến đích, đó sẽ là một bài toán hồi quy (vì biến đích có thứ tự). Tôi sẽ bàn về hồi quy trong bài viết tiếp theo. Ở đây tôi sẽ xem một trong những thuật toán đơn giản nhất cho bài toán phân loại, thuật toán k-láng giềng gần nhất.
k-láng giềng gần nhất cho phân loại trong máy học
Giả sử chúng ta có một số dữ liệu đã gán nhãn, ví dụ dữ liệu gồm các đặc tính của rượu vang đỏ (như độ cồn, mật độ, lượng axit citric, pH, v.v.; đây là các biến dự đoán) với biến đích 'Chất lượng' và nhãn 'tốt' & 'xấu'. Khi đó, với đặc tính của một mẫu rượu mới chưa có nhãn, nhiệm vụ phân loại là dự đoán 'Chất lượng' của nó. Khi tất cả biến dự đoán là số (cũng có cách xử lý biến phân loại), ta có thể coi mỗi hàng/mẫu rượu là một điểm trong không gian n chiều và, trong trường hợp này, k-láng giềng gần nhất (k-NN) là một phương pháp phân loại đơn giản về mặt khái niệm & tính toán: với mỗi mẫu rượu mới chưa có nhãn, ta tính, với một số nguyên k nào đó, k láng giềng gần nhất của nó trong không gian biến dự đoán n chiều. Sau đó ta xem nhãn của k láng giềng này (tức 'tốt' hay 'xấu') & gán cho rượu mới nhãn có số phiếu nhiều nhất (ví dụ nếu k = 5, có 3 láng giềng bình chọn 'tốt' và 2 bình chọn 'xấu', thì mô hình gán nhãn 'tốt'). Lưu ý rằng, ở đây, huấn luyện mô hình chỉ gồm việc lưu trữ các điểm dữ liệu: không có tham số nào cần ước lượng!
Mô tả trực quan về k-láng giềng gần nhất
Trong hình dưới đây là ví dụ k-NN trong không gian 2D: bạn sẽ phân loại điểm dữ liệu ở giữa như thế nào? Nếu k=3, bạn sẽ phân loại nó là đỏ và nếu k=5, là xanh lục.
Triển khai k-NN trong Python (scikit-learn)
Trước hết, hãy để ý khoảng giá trị của các biến dự đoán: 'free sulfur dioxide' dao động từ 0 đến khoảng 70 và 'volatile acidity' từ khoảng 0 đến khoảng 1,2. Cụ thể hơn, biến thứ nhất có khoảng giá trị lớn hơn biến thứ hai 2 bậc độ lớn. Bất kỳ thuật toán nào, như k-NN, vốn quan tâm đến khoảng cách giữa các điểm dữ liệu, có thể sẽ tập trung quá mức và thiếu công bằng vào các biến có khoảng giá trị lớn hơn, như 'free sulfur dioxide' — vốn có thể chỉ toàn nhiễu, ai mà biết được. Điều này thúc đẩy việc chuẩn hóa dữ liệu, và chúng ta sẽ sớm làm điều đó.
Giờ biến đích là xếp hạng 'Chất lượng' của rượu vang, từ 3 đến 8. Để trình bày cho gọn, hãy chuyển nó thành biến hai hạng mục gồm 'tốt' (điểm > 5) & 'xấu' (điểm <= 5). Chúng ta cũng sẽ vẽ biểu đồ tần suất cho cả hai cách biểu diễn biến đích để hình dung rõ hơn.
k-láng giềng gần nhất: hiệu năng thế nào?
Lưu ý: độ chính xác cũng có thể được định nghĩa theo ma trận nhầm lẫn và thường được định nghĩa cho bài toán phân loại nhị phân theo số dương tính thật & âm tính giả; các thước đo hiệu năng phổ biến khác suy ra từ ma trận nhầm lẫn gồm độ chuẩn xác (precision), số dương tính thật chia cho tổng dương tính thật & dương tính giả, và độ bao phủ (recall), số dương tính thật chia cho tổng dương tính thật cộng âm tính giả; một thước đo khác, điểm F1, là trung bình điều hòa của precision và recall. Xem machine learning mastery để có phần giải thích rõ ràng về các thước đo này; cũng xem mục Wikipedia về ma trận nhầm lẫn và điểm F1.
k-láng giềng gần nhất: hiệu năng thực tế và phép chia train-test
Bây giờ chúng ta sẽ giới thiệu chuẩn hóa (scaling) và đưa về trung tâm (centering), những phương pháp cơ bản nhất để tiền xử lý dữ liệu số, và xem liệu chúng ảnh hưởng đến hiệu năng mô hình như thế nào.
Cơ chế của Tiền xử lý: Chuẩn hóa và Đưa về trung tâm
Trước khi chạy một mô hình, như hồi quy (dự đoán biến liên tục) hay phân loại (dự đoán biến rời rạc), bạn hầu như luôn muốn thực hiện một số tiền xử lý. Với các biến số, phổ biến là bạn sẽ chuẩn hóa về khoảng [0,1] (normalize) hoặc chuẩn hóa theo Z-score (standardize) dữ liệu. Các thuật ngữ này nghĩa là gì?
Normalize chỉ đơn giản là biến đổi dữ liệu sao cho giá trị nhỏ nhất là 0 và lớn nhất là 1. Để đạt được điều này, ta biến đổi mỗi điểm dữ liệu $x$ thành
$$x_{normalized} = \frac{x-x_{min}}{x_{max}-x_{min}}.$$Standardize hơi khác: mục tiêu là đưa dữ liệu về trung tâm quanh 0 và chuẩn hóa theo độ lệch chuẩn:
$$x_{standardized} = \frac{x-\mu}{\sigma},$$với $\mu$ và $\sigma$ lần lượt là trung bình và độ lệch chuẩn của tập dữ liệu. Trước hết lưu ý rằng các phép biến đổi này chỉ thay đổi khoảng giá trị chứ không thay đổi phân phối. Sau đó bạn có thể muốn dùng các biến đổi khác, như log hoặc Box-Cox, để dữ liệu trông giống phân phối Gauss hơn (hình chuông). Nhưng trước khi đi xa hơn, điều quan trọng là hỏi: vì sao ta chuẩn hóa dữ liệu? Khi nào thì phù hợp hơn? Ví dụ, liệu nó quan trọng hơn trong phân loại so với hồi quy không?
Hãy đào sâu vào các bài toán phân loại trước và xem việc chuẩn hóa ảnh hưởng đến hiệu năng của k-láng giềng gần nhất thế nào:
Tiền xử lý: chuẩn hóa trong thực hành
Dưới đây tôi sẽ (i) chuẩn hóa dữ liệu, (ii) dùng k-láng giềng gần nhất và (iii) kiểm tra hiệu năng mô hình. Tôi sẽ dùng hàm scale của scikit-learn, hàm này chuẩn hóa tất cả các đặc trưng (cột) trong mảng truyền vào.
Tất cả các thước đo đều cải thiện thêm 0,1, tức tăng 16% và là mức cải thiện đáng kể! Như đã gợi ý ở trên, trước khi chuẩn hóa có một số biến dự đoán có khoảng giá trị chênh lệch nhau nhiều bậc độ lớn, nghĩa là một hai biến có thể chi phối trong bối cảnh thuật toán như k-NN. Hai lý do chính để bạn chuẩn hóa dữ liệu là
Chúng ta đã thấy vị trí thiết yếu của tiền xử lý trong quy trình khoa học dữ liệu, ở dạng chuẩn hóa và đưa về trung tâm, và qua đó thúc đẩy cách tiếp cận tổng thể cho các thách thức máy học. Trong các bài viết sau, tôi hy vọng sẽ mở rộng thảo luận sang các dạng tiền xử lý khác, như biến đổi dữ liệu số và tiền xử lý dữ liệu phân loại, cả hai đều là thành phần thiết yếu trong bộ công cụ của mọi nhà khoa học dữ liệu. Trước khi chuyển sang nội dung này, ở bài tiếp theo tôi sẽ khám phá vai trò của chuẩn hóa trong các phương pháp hồi quy cho bài toán phân loại. Cụ thể, tôi sẽ xem hồi quy logistic và bạn sẽ thấy kết quả rất khác so với những gì vừa thấy trong bối cảnh k-láng giềng gần nhất.
Trong cửa sổ tương tác dưới đây, bạn có thể tự mình thử với dữ liệu. Hãy bắt đầu bằng cách thay đổi biến n_neig, là số láng giềng dùng trong thuật toán k-NN. Bạn cũng có thể chuẩn hóa dữ liệu bằng cách đặt sc = True, nếu muốn. Sau đó chạy toàn bộ script để xem độ chính xác của mô hình, kèm theo classification report.
Từ điển
Học có giám sát: Nhiệm vụ suy ra biến đích từ các biến dự đoán. Ví dụ, suy ra biến đích 'có bệnh tim' từ các biến dự đoán như 'tuổi', 'giới tính' và 'tình trạng hút thuốc'.
Nhiệm vụ phân loại: Một nhiệm vụ học có giám sát là nhiệm vụ phân loại nếu biến đích gồm các hạng mục (ví dụ 'nhấp' hoặc 'không', khối u 'ác tính' hoặc 'lành tính').
Nhiệm vụ hồi quy: Một nhiệm vụ học có giám sát là nhiệm vụ hồi quy nếu biến đích là biến thay đổi liên tục (ví dụ giá nhà) hoặc biến phân loại có thứ tự như 'xếp hạng chất lượng rượu'.
k-láng giềng gần nhất: Thuật toán cho nhiệm vụ phân loại, trong đó một điểm dữ liệu được gán nhãn theo kết quả bỏ phiếu đa số của k láng giềng gần nhất của nó.
Tiền xử lý: Nhiều thao tác mà các nhà khoa học dữ liệu dùng để đưa dữ liệu về dạng phù hợp hơn với mục đích phân tích. Ví dụ, trước khi phân tích cảm xúc dữ liệu Twitter, bạn có thể loại bỏ thẻ html, khoảng trắng thừa, mở rộng chữ viết tắt và tách tweet thành danh sách các từ chứa trong đó.
Đưa về trung tâm và Chuẩn hóa: Cả hai đều là dạng tiền xử lý dữ liệu số, tức dữ liệu là con số, trái với dữ liệu phân loại hay chuỗi; đưa về trung tâm một biến nghĩa là trừ đi giá trị trung bình của biến đó khỏi mỗi điểm dữ liệu để biến mới có trung bình bằng 0; chuẩn hóa một biến nghĩa là nhân mỗi điểm dữ liệu với một hằng số để thay đổi khoảng giá trị. Xem phần nội dung bài viết để biết tầm quan trọng và ví dụ minh họa.
Bài viết này được tạo từ một Jupyter notebook. Bạn có thể tải notebook tại đây.