Hướng dẫn data reduction in python - giảm dữ liệu trong python

Introduction

Với kỷ nguyên dữ liệu như hiện nay, một tập dữ liệu high-dimension (đa chiều) với hàng nghìn feature hay cột đã trở thành điều không quá xa lạ. High-dimension data mở hướng cho nhiều cách xử lý các bài toán phức tạp trong thực tế, có thể kể đến dự đoán cấu trúc protein liên quan COVID-19, phân tích hình ảnh MEG scan não, v.v. Tuy nhiên, một tập dữ liệu high-dimension lại thường chứa các feature kém (không đóng góp nhiều vào kết quả) dẫn đến việc giảm hiệu năng của mô hình. Và việc lựa chọn trong rất nhiều feature để chọn ra feature có ảnh hưởng lớn đến kết quả cũng trở nên khó khăn hơn.

Một phương pháp thường được áp dụng là kỹ thuật dimensional reduction (hay giảm chiều dữ liệu nghe khá hiển nhiên). Ưu điểm của phương pháp này bao gồm:

nghe khá hiển nhiên). Ưu điểm của phương pháp này bao gồm:

  • Cải thiện độ chính xác của model do giảm thiểu điểm dữ liệu dư thừa, nhiễu
  • Model huấn luyện nhanh hơn (do dimension đã giảm) và giảm tài nguyên sử dụng để tính toán.
  • Kết quả của mô hình có thể được phân tích dễ dàng hơn
  • Giảm overfitting trong nhiều trường hợp. Với quá nhiều feature trong dữ liệu, mô hình trở nên phức tạp và có xu hướng overfit trên tập huấn luyện
  • Dễ dàng hơn trong việc visualize dữ liệu (plot trên miền 2D hay 3D)
  • Giảm thiểu trường hợp multicolinearity (đa cộng tuyến tính). Trong các bài toán regression, multicolinearity xảy ra khi các biến độc lập trong mô hình phụ thuộc tuyến tính lẫn nhau

Các phương pháp thường chia thành hai hướng:

  • Feature Selection: lựa chọn và giữ lại các feature tốt
  • Feature Extraction (hay dimensionality reduction): Giảm chiều dữ liệu bằng các kết hợp các feature đang có

Trong đó cách thứ hai thường chia thành phương pháp linear và non-linear (hay manifold learning)

1. Feature Selection + Elimination

Phương pháp dễ hiểu và thực hiện nhất. Một vài phương pháp phổ biến thường được dùng có thể kể đến như

  • Missing values ratio: Các cột hay feature thiếu nhiều giá trị sẽ hầu như không đóng góp vào mô hình machine learning. Vì vậy, việc chọn feature bỏ có thể dựa trên threshold tỉ lệ giá trị missing của feature đó. Giá trị threshold càng cao thì độ reduction càng lớn. Các cột hay feature thiếu nhiều giá trị sẽ hầu như không đóng góp vào mô hình machine learning. Vì vậy, việc chọn feature bỏ có thể dựa trên threshold tỉ lệ giá trị missing của feature đó. Giá trị threshold càng cao thì độ reduction càng lớn.
import pandas as pd df = pd.read_csv('ANSUR.csv') missing_values=df.isnum().sum()/len(def)*100 ratios = [ratio for ratio in (df.isna().sum()/len(df))] print([pair for pair in list(zip(df.columns, ratios)) if pair[1] > 0]) variable = [ ] for i in range(df.columns.shape[0]): if a[i]<=40: #setting the threshold as 40% variable.append(variables[i]) new_data = df[variable]
  • Low-variance filter: Feature có variance (phương sai) thấp sẽ không đóng góp nhiều trong mô hình. Vậy tương tự cách trên, nếu dưới threshold nhất định thì sẽ loại bỏ feature đó. Feature có variance (phương sai) thấp sẽ không đóng góp nhiều trong mô hình. Vậy tương tự cách trên, nếu dưới threshold nhất định thì sẽ loại bỏ feature đó.
from sklearn.preprocessing import normalize variance = df.var() variable = [ ] for i in range(0,len(variance)): if variance[i]>=0.006: #setting the threshold as 1% variable.append(columns[i]) new_data = df[variable]
  • High-correlation filter Các feature nếu có sự tương quan có thể được coi như nhau trong mô hình. Điều này khiến việc tồn tại nhiều feature giống nhau không cần thiết. Nếu giữ lại nhiều feature tương quan sẽ giảm hiệu năng mô hình đáng kể (đặc biệt các mô hình linear hay logistic regression). Các feature nếu có sự tương quan có thể được coi như nhau trong mô hình. Điều này khiến việc tồn tại nhiều feature giống nhau không cần thiết. Nếu giữ lại nhiều feature tương quan sẽ giảm hiệu năng mô hình đáng kể (đặc biệt các mô hình linear hay logistic regression).
import numpy as np from sklearn.preprocessing import normalize import pandas as pd norm = normalize(df) df_norm = pd.DataFrame.from_records(norm, columns=df.columns) corr_matrix = df_norm.corr().abs() mask = np.triu(np.ones_like(corr_matrix, dtype=bool)) tri_df = corr_matrix.mask(mask) results = {} for i in np.linspace(0.85,0.99,15): i = round(i,2) to_drop = [c for c in tri_df.columns if any(tri_df[c] >= i)] reduce_high_corr_df = df.drop(to_drop, axis=1) reduce_high_corr_df = reduce_high_corr_df.drop('Component', axis=1) mean = rfc_mean(reduce_high_corr_df, df['Component']) results[i] = round(mean,4) high_acc = max(results, key=results.get) print(results) print("Correlation coefficient with the highest predictive accuracy ", high_acc) to_drop = [c for c in tri_df.columns if any(tri_df[c] >= 0.88)] print("Number of feature's dropped ",len(to_drop))
  • Random Forest: Phương pháp này cũng tương đối phổ biến và có ích. Việc sử dụng decision tree có thể tận dụng lợi thế thống kê học để tìm ra feature chứa nhiều thông tin để giữ lại nhất. Thuật toán random forest (sklearn) chỉ nhận giá trị số, nên cần phải hot encoding. Phương pháp này cũng tương đối phổ biến và có ích. Việc sử dụng decision tree có thể tận dụng lợi thế thống kê học để tìm ra feature chứa nhiều thông tin để giữ lại nhất. Thuật toán random forest (sklearn) chỉ nhận giá trị số, nên cần phải hot encoding.
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score def rfc_test_accuracy(X, y): """ Function which takes the predictor and target variables and returns the test accuracy of the model. """ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) RFC = RandomForestClassifier(random_state=123) RFC.fit(X_train,y_train) test_accuracy = accuracy_score(y_test, RFC.predict(X_test)) return test_accuracy def rfc_mean(X,y,trails=20): """ Print the mean value of Random forest classifier for n trails. """ result = [rfc_test_accuracy(X,y) for i in range(trails)] mean = np.array(result).mean() return mean print("Predictive accuracy of base random forrest classifier ",round(rfc_mean(df.drop('Component', axis=1),df['Component']),3))
  • Backwards-feature elimination: Tiếp cận hướng top down, bắt đầu với tất cả feature, và loại bỏ từng feature cho đến hết. Tiếp cận hướng top down, bắt đầu với tất cả feature, và loại bỏ từng feature cho đến hết.
from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt def MAN_RFE(X,df,trails=20): accuracy = [] for i in range(df.shape[1],1,-1): X_train, X_test, y_train, y_test = train_test_split(X, df['Component'], test_size=0.2, random_state=123) for j in range(trails): rfe = RandomForestClassifier() rfe.fit(X_train, y_train) acc = accuracy_score(y_test, rfe.predict(X_test)) accuracy.append(acc) feat_import = dict(zip(X.columns, rfe.feature_importances_)) X = X.drop(min(feat_import, key=feat_import.get), axis=1) return list(np.array(accuracy).reshape(100,20)) df_no_com = df.drop('Component',axis=1) accuracy = MAN_RFE(df_no_com, df) plt.figure(figsize=(20, 6)) plt.boxplot(accuracy, sym="") plt.ylim(0.5,0.7) plt.xticks(rotation = 90) plt.xlabel('Number of features removed') plt.ylabel('Accuracy') plt.show()

Có thể tham khảo cụ thể hơn tại đây

  • Forward Feature Selection: Ngược lại phương pháp trước, từ một feature và tăng dần các feature tới khi mô hình đạt giá trị tối ưu. Ngược lại phương pháp trước, từ một feature và tăng dần các feature tới khi mô hình đạt giá trị tối ưu.
from sklearn.feature_selection import f_regression f_val, p_val = f_regression(X_train, y_train)

hoặc mlxtend

from mlxtend.feature_selection import SequentialFeatureSelector as sfs from sklearn.linear_model import LinearRegression lreg = LinearRegression() sfs1 = sfs(lreg, k_features=3, forward=True, verbose=2, scoring='neg_mean_squared_error') sfs1 = sfs1.fit(X, y)

Lưu ý là cả Backward Feature Elimination và Forward Feature Selection đều rất tốn thời gian và tài nguyên tính toán. Nên phương pháp chỉ thường chỉ sử dụng với các tập dữ liệu nhỏ, không nhiều feature.

Ngoài ra thư viện scikit-learn cũng support một vài method tự động cho để chọn các feature tốt như Univariate Selection, recursive feature elimination...

Với Feature Extraction, hãy sử dụng tập dữ liệu lớn hơn chút Fashion MNIST để thử nghiệm. Tập dữ liệu này bao gồm 70,000 ảnh với 60,000 ảnh train và 10,000 ảnh test.

2. Phương pháp Linear

Với Feature extraction, bộ dữ liệu FashionMNIST được sử dụng để visualize tốt hơn. Chắc data này không còn lạ lẫm và hoàn toàn có thể tìm thấy trên google. Tuy nhiên mình cũng để 1 file link drive để tiện cho việc sử dụng với colab hơn nếu các bạn cần. Here

  • Factor Analysis: Các biến được gộp thành nhóm chung theo correlation. Mỗi nhóm này được coi như là một factor, với số lượng factor nhỏ hơn số chiều gốc của tập dữ liệu. Tuy nhiên điểm trừ là hơi khó quan sát sự tách biệt giữa các factor khi visualize Các biến được gộp thành nhóm chung theo correlation. Mỗi nhóm này được coi như là một factor, với số lượng factor nhỏ hơn số chiều gốc của tập dữ liệu. Tuy nhiên điểm trừ là hơi khó quan sát sự tách biệt giữa các factor khi visualize
import pandas as pd import numpy as np from glob import glob import cv2 # Load data images = [cv2.imread(file) for file in glob('train/*.png')] images = np.array(images) image = [] for i in range(0,60000): img = images[i].flatten() image.append(img) image = np.array(image) train = pd.read_csv("train.csv") # Give the complete path of your train.csv file feat_cols = [ 'pixel'+str(i) for i in range(image.shape[1]) ] df = pd.DataFrame(image,columns=feat_cols) df['label'] = train['label'] # Factor Analysis from sklearn.decomposition import FactorAnalysis FA = FactorAnalysis(n_components = 3).fit_transform(df[feat_cols].values) # Visualize %matplotlib inline import matplotlib.pyplot as plt plt.figure(figsize=(12,8)) plt.title('Factor Analysis Components') plt.scatter(FA[:,0], FA[:,1]) plt.scatter(FA[:,1], FA[:,2]) plt.scatter(FA[:,2],FA[:,0])

  • Principal component analysis: aka PCA. Đây là một thuật toán unsupervised giúp giảm chiều dữ liệu và vẫn giữ được nhiều thông tin nhất có thể. Thường được sử dụng với kiểu dữ liên tục: PCA xoay và chiếu điểm dữ liệu theo chiều tăng của phương sai PCA có thể hiểu là một quy trình thống kê trong đó phép biến đổi trực giao tập dữ liệu nn chiều thành nn chiều principal component. PCA là thuật toán giảm chiều tuyến tính bằng cách biến đổi các biến tương quan (p) trở thành các biến k không ràng buộc (với k aka PCA. Đây là một thuật toán unsupervised giúp giảm chiều dữ liệu và vẫn giữ được nhiều thông tin nhất có thể. Thường được sử dụng với kiểu dữ liên tục: PCA xoay và chiếu điểm dữ liệu theo chiều tăng của phương sai PCA có thể hiểu là một quy trình thống kê trong đó phép biến đổi trực giao tập dữ liệu nn chiều thành nn chiều principal component.
    PCA là thuật toán giảm chiều tuyến tính bằng cách biến đổi các biến tương quan (p) trở thành các biến k không ràng buộc (với k

Chủ đề