CHƯƠNG 1: TỔNG QUAN VỀ GIẢM CHIỀU DỮ LIỆU 1. KHÁI NIỆM VÀ MỘT SỐ TÍNH CHẤT CỦA GIẢM CHIỀU DỮ LIỆU 1. Khái niệm về Giảm chiều dữ liệu Giảm chiều dữ liệu (Dimensionality reduction hay dimension reduction), là sự biến đổi dữ liệu từ không gian chiều-cao thành không gian chiều-thấp để biểu diễn ở dạng chiều-thấp đồng thời giữ lại một số thuộc tính có ý nghĩa của dữ liệu gốc, có ý tưởng là gần với chiều nội tại (intrinsic dimension).1: Minh họa giảm chiều dữ liệu trong tập dữ liệu lớn Phân tích dữ liệu trong không gian chiều-cao có thể khó khăn vì nhiều lí do; dữ liệu thô thường có tính thưa thớt (Sparse matrix) là một hậu quả của việc biến đổi theo chiều, và do đó việc phân tích thường khó tính toán; hơn nữa các thuật toán có thể mất rất nhiều thời gian để xử lý dữ liệu. Giảm chiều dữ liệu là phổ biến trong các lĩnh vực có số lượng quan sát lớn hoặc số lượng biến lớn, chẳng hạn như xử lý tín hiệu, nhận dạng tiếng nói, thông tin học thần kinh và tin sinh học.
Các phương pháp giảm chiều dữ liệu thông thường được chia thành các phương pháp tiếp cận tuyến tính và phi tuyến tính. Các phương pháp cũng được chia thành chọn thuộc tính (Feature selection) và trích chọn đặc tính (Feature extraction). Giảm chiều dữ liệu có thể được sử dụng cho giảm nhiễu (noise reduction), trực quan hoá dữ liệu (data visualization), phân tích cụm, hoặc là một bước trung gian để tạo điều kiện thuận lời cho các phân tích khác. Vai trò của Giảm chiều dữ liệu Trong các bài toán học máy thì dữ liệu có kích thước rất lớn.
Máy tính có thể hiểu và thực thi các thuật toán trên dữ liệu này, tuy nhiên đối với con người để “nhìn” dữ liệu nhiều chiều rất khó. Vì vậy bài toán giảm chiều dữ liệu ra đời giúp đưa ra cái nhìn mới cho con người về dữ liệu nhiều chiều. Ngoài để trực quan dữ liệu, các phương pháp giảm chiều dữ liệu còn giúp đưa dữ liệu về một không gian mới giúp khai phá các thuộc tính ẩn mà trong chiều dữ liệu ban đầu không thể hiện rõ, hoặc đơn giản là giảm kích thước dữ liệu để tăng tốc độ thực thi cho máy tính.2: Ví dụ về tập dữ liệu huyền thoại Iris Ví dụ về tập dữ liệu huyền thoại Iris bao gồm 4 thuộc tính và 3 nhãn tương ứng với 3 loại hoa. Rất khó để có thể nhận biết rằng 4 thuộc tính này có phân tách với nhau theo mỗi loài hay không vì cần biểu diễn không gian này trên dữ liệu 4 chiều.
Vì vậy, thuật toán giảm dữ liệu giúp đưa về không gian 2 chiều để dễ dàng trực quan hoá trên hệ toạ độ Oxy, đổi lại là việc mất mát đi một lượng thông tin. Đây là kết quả: 6 Hình 1.3: Biểu đồ thể hiện dữ liệu sau khi được giảm chiều Nhìn vào đây, ta có thể dễ dàng phân tích hơn, có thể thấy lớp nào dễ nhầm lẫn với nhau, mức độ tách biệt giữa các lớp,… 1. CÁC PHƯƠNG PHÁP GIẢM CHIỀU DỮ LIỆU 1. Phương pháp chọn thuộc tính (Feature selection) Để xây dựng mô hình ta sẽ rất cần đến dữ liệu lớn.
Nhưng dữ liệu quá lớn cũng không thực sự tốt. Những hệ thống của các tập đoàn công nghệ lớn có thể có số lượng trường dữ liệu lên tới hàng trăm ngàn. Đây là một con số khổng lồ và sẽ gây ra những hạn chế đó là: - Tăng chi phí tính toán. - Quá nhiều biến giải thích có thể dẫn tới quá khớp (overfiting).
Tức hiện tượng mô hình hoạt động tốt trên tập huấn luyện nhưng kém trên tập kiểm tra. - Trong số các biến sẽ có những biến gây nhiễu và làm giảm chất lượng mô hình. - Rối loạn thông tin do không thể kiểm soát và hiểu hết các biến. 7 Chính vì thế ta cần phải có những phương pháp như giảm chiều dữ liệu hoặc lựa chọn biến quan trọng.
Về phương pháp giảm chiều dữ liệu sẽ được trình bày ở một chương khác. Trong chương này này ta sẽ làm quen với một số kĩ thuật lựa chọn biến thông dụng. Bên dưới là những thuật toán quan trọng được sử dụng để lựa chọn các biến. Phương pháp thống kê Một phương pháp quan trọng trong các phương pháp thống kê nhằm giảm số lượng biến là lựa chọn dựa trên phương sai.
Dựa trên phân tích các biến không biến động thì không có tác dụng gì trong việc phân loại hoặc dự báo bởi ta dường như đã biết được giá trị của chúng cho tất cả các quan sát. Do đó ý tưởng chính của phương pháp này là thông qua độ lớn phương sai của toàn bộ các biến numeric để loại bỏ những biến nếu nó nhỏ hơn một ngưỡi nhất định. Trong sklearn ta có thể sử dụng VarianceThreshold để lọc bỏ biến theo phương sai.feature_selection import VarianceThreshold from sklearn.datasets import make_classification # Khởi toạo dữ liệu example X, y = make_classification(n_samples=500, n_features=50, random_state=123) print('X shape:', X.shape) print('y shape:', y.shape) # Lọc bỏ các biến có phương sai nhỏ hơn 0.8 print('Total features with thres=0.shape)) # Lọc bỏ các biến có phương sai nhỏ hơn 1.fit_transform(X) print('Total features with thres=1.shape)) Ngoài phương pháp phương sai, ta có thể áp dụng kiểm định thống kê đơn biến. Phương pháp này sẽ đánh giá sự độc lập tuyến tính giữa hai biến ngẫu nhiên dựa trên phân phối chi-squared và Fisher để lựa chọn ra � biến tốt nhất.
Để hình dung kĩ hơn về hai phương pháp thống kê nêu trên, tiếp theo ta cùng thực hành lựa chọn biến và đánh giá hiệu quả mô hình.feature_selection import SelectKBest, f_classif from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score # Lựa chọn biến dựa trên phương pháp Fisher X_kbest = SelectKBest(f_classif, k = 5).fit_transform(X, y) print('X shape after applying statistical selection: ',X_kbest.shape) Ta sẽ đánh giá hiệu quả mô hình bằng cross-validation trước và sau lựa chọn biến với KFold = 5. # Hồi qui logistic logit = LogisticRegression(solver='lbfgs', random_state=1) # Cross validation cho: # 1.dữ liệu gốc acc_org = cross_val_score(logit, X, y, scoring = 'accuracy', cv = 5). Áp dụng phương sai acc_var = cross_val_score(logit, X_kvar, y, scoring = 'accuracy', cv = 5). Áp dụng phương pháp thống kê acc_stat = cross_val_score(logit, X_kbest, y, scoring = 'accuracy', cv = 5).
Sử dụng mô hình Đây là phương pháp rất thường xuyên được áp dụng trong các cuộc thi phân tích dữ liệu. ta sẽ dựa trên một số mô hình cơ sở để đánh giá mức độ quan trọng của các biến. Có hai lớp mô hình thường được sử dụng để đánh biến đó là Random Forest và Linear Regression. Ưu điểm của các phương pháp này là kết quả đánh giá rất chuẩn xác, tuy nhiên nhược điểm của chúng là phải xây dựng mô hình hồi qui rồi mới xác định được biến quan trọng.
Điều này dường như đi trái lại với thực tế phải lựa chọn biến trước khi huấn luyện mô hình. Để áp dụng phương pháp này ta thực hiện như sau: from sklearn.ensemble import RandomForestClassifier from sklearn.svm import LinearSVC from sklearn.linear_model import Lasso from sklearn.feature_selection import SelectFromModel from sklearn.model_selection import cross_val_score from sklearn.pipeline import make_pipeline # Hồi qui theo RandomForest rdFrt = RandomForestClassifier(n_estimators = 20, random_state = 1) 9 # Hồi qui theo LinearSVC lnSVC = LinearSVC(C=0.01, penalty="l1", dual=False) # Hồi qui theo Lasso lassoReg = Lasso(alpha = 1.0) # Tạo một pipeline thực hiện lựa chọn biến từ RandomForest model và hồi qui theo logit pipe1 = make_pipeline(StandardScaler(), SelectFromModel(estimator = rdFrt), logit) # Tạo một pipeline thực hiện lựa chọn biến từ Linear SVC model và hồi qui theo logit pipe2 = make_pipeline(StandardScaler(), SelectFromModel(estimator = lnSVC), logit) # Cross validate đối với # 1. Mô hình logit acc_log = cross_val_score(logit, X, y, scoring = 'accuracy', cv = 5). Mô hình RandomForest acc_rdf = cross_val_score(rdFrt, X, y, scoring = 'accuracy', cv = 5).
Mô hình pipe1 acc_pip1 = cross_val_score(pipe1, X, y, scoring = 'accuracy', cv = 5). Mô hình pipe2 acc_pip2 = cross_val_score(pipe2, X, y, scoring = 'accuracy', cv = 5).mean() print('Accuracy theo logit:', acc_log) print('Accuracy theo random forest:', acc_rdf) print('Accuracy theo pipeline 1:', acc_pip1) print('Accuracy theo pipeline 2:', acc_pip2) Như vậy select dựa trên mô hình Random Forest và Linear SVC đã có hiệu quả trong việc cải thiện độ chính xác của mô hình. Bên cạnh việc thực hiện lựa chọn biến dựa trên model, ta còn có thể lựa chọn biến theo grid search. Sử dụng Search a, Exhaustive Search Ý tưởng chính của phương pháp này là tìm ra một tập con các đặc trưng tốt nhất trong số các đặc trung đầu vào dựa trên một thước đo mô hình cụ thể (chẳng hạn như accuracy).
Ví dụ, khi có tổng cộng n đặc trưng thì cần huấn luyện mô hình trên tất cả các kết hợp từ 1,2,3,…,n đặc trưng. Tổng số lượng các kết hợp có thể sẽ là: 𝑛 𝑛 𝑛 𝑛 ( ) + ( ) + ( ) + ⋯ + ( ) = 2𝑛 − 1 1 2 3 𝑛 Đây là số lượng không hề nhỏ nếu bộ dữ liệu của bạn có số lượng đặc trưng lớn. Chính vì thế phương pháp này được coi là Exhaustive và chỉ phù hợp với những bộ dữ liệu có số lượng đặc trưng nhỏ. Ưu điểm của phương pháp này mang 10 lại đó là giúp tìm ra được tập con đặc trưng tốt nhất trực tiếp thông qua đánh giá Accuracy.
b, Sequential Feature Selection Nếu như ta tìm kiếm trên toàn bộ các bộ kết hợp đặc trưng đầu vào của mô hình sẽ rất lâu. Do đó việc đầu tiên ta cần thực hiện là giới hạn không gian tìm kiếm. Tuỳ theo hướng tìm kiếm là tăng biến hoặc giảm biến mà phương pháp này bao gồm hai hai lựa chọn là: forward hoặc backward tương ứng. Theo lựa chọn forward thì ban đầu ta xuất phát từ lựa chọn 1 đặc trưng đầu vào mà mô hình có kết quả tốt nhất.
Ở các bước tiếp theo ta sẽ tìm ra một đặc trưng phù hợp nhất để thêm vào mô hình sao cho thước đo đánh giá mô hình là lớn nhất. Quá trình này tiếp tục cho đến khi số lượng các đặc trưng được thêm vào đạt mức tối đa k_features hoặc tới khi hàm loss fuction mô hình không giảm nữa. Theo chiều ngược lại, bắt đầu từ toàn bộ các đặc trưng và loại dần đặc trưng thì sẽ là backward. So với phương pháp Exhaustive Search thì Sequential Feature Selection ít tốn kém hơn về chi phí nhưng không đảm bảo chắc chắn rằng tập hợp đặc trưng tìm được là tối ưu.
Hướng di chuyển tìm kiếm theo forward và backward cũng hoàn toàn là lựa chọn may rủi. Bên dưới ta sẽ tiến hành áp dụng phương pháp Sequential Feature Selection để tìm kiếm đặc trưng theo backward với số biến cần lựa chọn là k_features=3. %%script echo skipping !pip install mlxtend from mlxtend.feature_selection import SequentialFeatureSelector selector = SequentialFeatureSelector(logit, scoring = 'accuracy', verbose = 2, k_features = 3, forward = False, n_jobs = -1) selector.