Phương pháp lựa chọn feature trong Machine Learning.
- 10-10-2021
- chuong xuan
- 0 Comments
Trên thực tế thì không phải data nào cũng clear, các feature đều có ích cho model. Chẳng hạn như khi ta muốn dự đoán giá một căn nhà thì feature chủ nhà là trai hay gái không quan trọng lắm. Do vậy, việc lựa chọn những features có ích với model là khá quan trọng, giúp giảm số chiều dữ liệu đầu vào.
Cơ bản thì chúng ta sẽ xử dụng xác suất để tính toán mối quan hệ giữa mỗi feature và trường mục tiêu cần dự đoán. Nhưng ý tưởng là vậy còn xử dụng công thức, thước đo nào để xác định feature đó không tốt thì còn là một thánh thức lớn. Trong bài viết này tôi và bạn cùng tìm hiểu qua một số công thức và cách tính nha!
Mục lục
Phương pháp lựa chọn feature
Feature selection algorithm có thể được chia làm 3 loại: filter methods, wrapper methods, embedded methods.
Filter
Thằng này thì có một số đặc điểm sau:
- Phụ thuộc vào đặc điểm của dữ liệu (feature characteristics)
- Sẽ cho hiệu suất thấp hơn so với wrapper methods hoặc embedded methods.
- Phương thức: Variance, Correlation, Univariate selection, Multivariate selection.
Giới thiệu về Constant, quasi-constant, duplicated features.
Constant features: chỉ hiển thị một giá trị cho tất cả observations trong dataset.
Phương pháp đơn giản nhất để xử lý constant features. Ta sẽ đặt ra một ngưỡng (threshold) cho phương sai, features nào không đáp ứng ngưỡng đó thì sẽ bị loại bỏ. (Có thể sử dụng sklearn để xử lý)
from sklearn.feature_selection import VarianceThreshold sel = VarianceThreshold(threshold=0) # fit finds the features with zero variance. sel.fit(X_train) # get_support() method returns which features are retained. retained_features = sel.get_support()
Nó sẽ trả ra một dãy bool, ta chỉ cần quan sát vào đó sẽ biết những feature nào không thỏa mãn điều kiện.
Quasi-constant features: Tương tự như constant features ở bên trên thôi, chỉ là ta có thể điều chỉnh ngưỡng threshold để điều kiện xét nghiêm ngặt hơn (ví dụ: threshold = 0.01 thì feature đó sẽ bị drop khi có 99% giá trị giống nhau).
Duplicated features: Là những feature tương đương nhau, ví dụ là một feature gốc và có một feature khác là label encoder của feature gốc, thì hai feature đó là tương đương nhau, ta có thể drop một feature đi. Hay là nhiều hàng giống nhau.
Phương pháp:
- Với small dataset: Trong pandas có chức năng đánh giá xem một dataframe có chứa hàng duplicated không. Còn để kiểm tra các cột ta vẫn sử dụng hàm duplicated() chỉ cần transpose matrix là được.
- Với big dataset: Nếu dùng transpose với dữ liệu lớn chắc chắn là rất tốn bộ nhớ và không khả thi. Do vậy chúng ta có thể sử dụng vòng lặp để tìm duplicated columns hoặc sử dụng thử viện numpy.
for_, idx = np.unique(df.to_numpy(), axis=1, return_index=True) df_uniq = df.iloc[:, np.sort(idx)]
Độ tương quan (Correlation)
Sử dụng độ tương quan giữa 2 hay nhiều biến cũng là một cách hay để loại bỏ những feature có độ tương quan thấp. Việc loại bỏ các feature có độ tương quan cao với nhau giúp mô hình linear hoạt động tốt hơn, tránh bias giữa các features.
- Có thể kiểm tra feature với target xác định độ tương quan thấp chúng ta có thể drop feature.
- Hay kiểm tra tương quan giữa feature và feature nếu 2 feature có độ tương quan cao với nhau thì có thể hai feature đó có cùng thông tin và ta có thể drop 1 feature giúp giảm số chiều của dữ liệu đầu vào.
Cách xác định hệ số tương quan.
Pearson’s correlation coefficient
sum((x1 -x1.mean) * (x2 - x2.mean) * (xn - xn.mean)) / var(x1) * var(x2) * var(xn)
- Pearson’s coefficient có giá trị trong khoảng [-1,1]
- Ý tưởng là sẽ tính toán độ tương quan giữa các feature với nhau, nếu 2 feature có độ tương quan lớn hơn threshold mà mình đặt ra thì sẽ drop một trong 2 feature đó.
corrmat = X_train.corr() # plot fig, ax = plt.subplots() fig.set_size_inches(11,11) sns.heatmap(corrmat) def correlation(df, threshold): col_corr = set() corrmat = df.corr() for i in range(len(corrmat.columns)): for j in range(i): # interested in abs coefficient values if abs(corrmat.iloc[i, j]) > threshold: col_corr.add(corrmat.columns[i]) return col_corr corr_feats = correlation(X_train, 0.8) X_train.drop(labels=corr_feats, axis=1, inplace=True)
Phương pháp thống kê (Statistical measures)
Có một vài phương pháp và tiêu chí để lựa chọn feature theo phương pháp thống kê như sau:
- Thông tin tương hỗ (Information Gain )
- Univariate ROC-AUC/RMSE
Với mỗi cách trên cơ bản thì sẽ có 2 bước như sau:
- Đánh giá features theo một tiêu chí nhất định: Mỗi một feature sẽ có một đánh giá độc lập với những feature khác khi xét mối quan hệ với target.
- Lựa chọn fetures có ranking cao: Chúng ta có thể áp dụng classification hay regression models để đánh giá một feature có ranking cao hay không?. Và đương nhiên mức nào để biết ranking là cao hay thấp thì còn phụ thuộc vào mình.
Một vài lưu ý: chúng ta có thể áp dụng duplicated hay corelated features trước khi thực hiện bước này. Và phương pháp này còn có một nhược điểm lớn là có thể có 2 feature kết hợp với nhau thì sẽ ảnh hướng tới target và nếu ta chỉ áp dụng phương pháp này với mỗi feature xét với tagert thì có thể dẫn tới sai lầm. Do vần cần áp dụng thêm nhiều phương pháp để đánh giá giữa các feature với target.
Mutual information (information Gain)
Phương pháp này so sánh xác suất x và y xảy ra đồng thời qua phân phối và kết hợp với trường hợp khi 2 phân phối này độc lập.
mutual information = sum{i,y} P(xi, yj) * log(P(xi,yj)/P(xi)*P(yj))
Nếu x và y là độc lập thì mutual information sẽ bằng 0.
Ta có thể sử dụng thư viện của python để chọn features:
- Sử dụng
sklearn.feature_selection.mutual_info_regression
trên model regression. - Và
mutual_info_classif
để chọn với model classification.
Tiến hành tính toán mutual information giữa các biến và mục tiêu. Trả về mutual information của mỗi feature. Nếu giá trị càng nhỏ thì thông tin của feature đó với target càng thấp. (Nên preprocessing trước khi áp dụng phương pháp này).
Univariate ROC-AUC/RMSE
Ý tưởng là sẽ tính ROC-AUC của mỗi feature từ đó dùng model machine learning để dự dự đoán target. Ở đây chúng ta có thể sử dụng decision tree và đánh giá theo ROC-AUC hoặc RMSE. Từ đó sẽ lựa chọn features có metrics cao.
# use bnp-paribas dataset roc_vals = [] for feat in X_train.columns: clf = DecisionTreeClassifier() clf.fit(X_train[feat].fillna(0).to_frame(), y_train) y_scored = clf.predict_proba(X_test[feat].fillna(0).to_frame()) roc_vals.append(roc_auc_score(y_test, y_scored[:,1]))
rocvals = pd.Series(roc_vals) rocvals.index = X_train.columns rocvals.sort_values(ascending=False) # number of features shows a roc-auc value higher than random. len(rocvals[rocvals>0.5])
Tổng kết:
Qua bài tìm hiểu này tôi và các bạn đã tìm hiểu một số phương pháp lựa chọn feature, làm giảm số chiều đầu vào giúp cho việc training model dễ dàng hơn.