本文將比較各種降維技術在機器學習任務中對表格資料的有效性。我們將降維方法應用於資料集,並透過迴歸和分類分析評估其有效性。我們將降維方法應用於從與不同領域相關的 UCI 中取得的各種資料集。總共選擇了 15 個資料集,其中 7 個將用於迴歸,8 個用於分類。
為了讓本文易於閱讀和理解,僅顯示了一個資料集的預處理和分析。實驗從載入資料集開始。資料集被分成訓練集和測試集,然後在平均值為 0 且標準差為 1 的情況下進行標準化。
然後會將降維技術應用於訓練數據,並使用相同的參數對測試集進行變換以進行降維。對於迴歸,使用主成分分析(PCA)和奇異值分解(SVD)進行降維,另一方面對於分類,使用線性判別分析(LDA)
降維後就訓練多個機器學習模型進行測試,並比較了不同模型在不同降維方法獲得的不同資料集上的表現。
讓我們透過載入第一個資料集開始這個過程,
import pandas as pd ## for data manipulation df = pd.read_excel(r'RegressionAirQualityUCI.xlsx') print(df.shape) df.head()
資料集包含15個列,其中一個是需要預測標籤。在繼續降維之前,日期和時間列也會被刪除。
X = df.drop(['CO(GT)', 'Date', 'Time'], axis=1) y = df['CO(GT)'] X.shape, y.shape #Output: ((9357, 12), (9357,))
為了訓練,我們需要將資料集分成訓練集和測試集,這樣可以評估降維方法和在降維特徵空間上訓練的機器學習模型的有效性。模型將使用訓練集進行訓練,表現將使用測試集進行評估。
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) X_train.shape, X_test.shape, y_train.shape, y_test.shape #Output: ((7485, 12), (1872, 12), (7485,), (1872,))
在對資料集使用降維技術之前,可以對輸入資料進行縮放,這樣可以保證所有特徵處於相同的比例上。這對於線性模型來說是至關重要的,因為某些降維方法可以根據資料是否標準化以及對特徵的大小敏感而改變其輸出。
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) X_train.shape, X_test.shape
線性降維的PCA方法降低了資料的維數,同時保留了盡可能多的資料變異數。
這裡將使用Python sklearn.decomposition模組的PCA方法。要保留的元件數量是透過這個參數指定的,這個數字會影響在較小的特徵空間中包含多少維度。作為一種替代方法,我們可以設定要保留的目標方差,它根據捕獲的資料中的方差量建立組件的數量,我們在這裡設定為0.95
from sklearn.decomposition import PCA pca = PCA(n_compnotallow=0.95) X_train_pca = pca.fit_transform(X_train) X_test_pca = pca.transform(X_test) X_train_pca
上述特徵代表什麼?主成分分析(PCA)將資料投射到低維空間,試圖盡可能保留資料中的不同之處。雖然這可能有助於特定的操作,但也可能使數據更難以理解。 ,PCA可以識別資料中的新軸,這些軸是初始特徵的線性融合。
SVD是一種線性降維技術,它將資料變異數較小的特徵投影到低維空間。我們需要設定降維後要保留的組件數量。這裡我們將把維度降低 2/3。
from sklearn.decomposition import TruncatedSVD svd = TruncatedSVD(n_compnotallow=int(X_train.shape[1]*0.33)) X_train_svd = svd.fit_transform(X_train) X_test_svd = svd.transform(X_test) X_train_svd
現在,我們將開始使用上述三種資料(原始資料集、PCA和SVD)對模型進行訓練和測試,並且我們使用多個模型進行比較。
import numpy as np from sklearn.linear_model import LinearRegression from sklearn.neighbors import KNeighborsRegressor from sklearn.svm import SVR from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor from sklearn.metrics import r2_score, mean_squared_error import time
train_test_ML:這個函數將完成與模型的訓練和測試相關的重複任務。透過計算rmse和r2_score來評估所有模型的效能。並傳回包含所有詳細資訊和計算值的資料集,還將記錄每個模型在各自的資料集上訓練和測試所花費的時間。
def train_test_ML(dataset, dataform, X_train, y_train, X_test, y_test): temp_df = pd.DataFrame(columns=['Data Set', 'Data Form', 'Dimensions', 'Model', 'R2 Score', 'RMSE', 'Time Taken']) for i in [LinearRegression, KNeighborsRegressor, SVR, DecisionTreeRegressor, RandomForestRegressor, GradientBoostingRegressor]: start_time = time.time() reg = i().fit(X_train, y_train) y_pred = reg.predict(X_test) r2 = np.round(r2_score(y_test, y_pred), 2) rmse = np.round(np.sqrt(mean_squared_error(y_test, y_pred)), 2) end_time = time.time() time_taken = np.round((end_time - start_time), 2) temp_df.loc[len(temp_df)] = [dataset, dataform, X_train.shape[1], str(i).split('.')[-1][:-2], r2, rmse, time_taken] return temp_df
original_df = train_test_ML('AirQualityUCI', 'Original', X_train, y_train, X_test, y_test) original_df
可以看到KNN迴歸器和隨機森林在輸入原始資料時表現相對較好,隨機森林的訓練時間是最長的。
pca_df = train_test_ML('AirQualityUCI', 'PCA Reduced', X_train_pca, y_train, X_test_pca, y_test) pca_df
与原始数据集相比,不同模型的性能有不同程度的下降。梯度增强回归和支持向量回归在两种情况下保持了一致性。这里一个主要的差异也是预期的是模型训练所花费的时间。与其他模型不同的是,SVR在这两种情况下花费的时间差不多。
SVD
svd_df = train_test_ML('AirQualityUCI', 'SVD Reduced', X_train_svd, y_train, X_test_svd, y_test) svd_df
与PCA相比,SVD以更大的比例降低了维度,随机森林和梯度增强回归器的表现相对优于其他模型。
对于这个数据集,使用主成分分析时,数据维数从12维降至5维,使用奇异值分析时,数据降至3维。
将类似的过程应用于其他六个数据集进行测试,得到以下结果:
我们在各种数据集上使用了SVD和PCA,并对比了在原始高维特征空间上训练的回归模型与在约简特征空间上训练的模型的有效性
对于分类我们将使用另一种降维方法:LDA。机器学习和模式识别任务经常使用被称为线性判别分析(LDA)的降维方法。这种监督学习技术旨在最大化几个类或类别之间的距离,同时将数据投影到低维空间。由于它的作用是最大化类之间的差异,因此只能用于分类任务。
from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier from sklearn.metrics import accuracy_score, f1_score, recall_score, precision_score
继续我们的训练方法
def train_test_ML2(dataset, dataform, X_train, y_train, X_test, y_test): temp_df = pd.DataFrame(columns=['Data Set', 'Data Form', 'Dimensions', 'Model', 'Accuracy', 'F1 Score', 'Recall', 'Precision', 'Time Taken']) for i in [LogisticRegression, KNeighborsClassifier, SVC, DecisionTreeClassifier, RandomForestClassifier, GradientBoostingClassifier]: start_time = time.time() reg = i().fit(X_train, y_train) y_pred = reg.predict(X_test) accuracy = np.round(accuracy_score(y_test, y_pred), 2) f1 = np.round(f1_score(y_test, y_pred, average='weighted'), 2) recall = np.round(recall_score(y_test, y_pred, average='weighted'), 2) precision = np.round(precision_score(y_test, y_pred, average='weighted'), 2) end_time = time.time() time_taken = np.round((end_time - start_time), 2) temp_df.loc[len(temp_df)] = [dataset, dataform, X_train.shape[1], str(i).split('.')[-1][:-2], accuracy, f1, recall, precision, time_taken] return temp_df
开始训练
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda = LinearDiscriminantAnalysis() X_train_lda = lda.fit_transform(X_train, y_train) X_test_lda = lda.transform(X_test)
预处理、分割和数据集的缩放,都与回归部分相同。在对8个不同的数据集进行新联后我们得到了下面结果:
我们比较了上面所有的三种方法SVD、LDA和PCA。
我们比较了一些降维技术的性能,如奇异值分解(SVD)、主成分分析(PCA)和线性判别分析(LDA)。我们的研究结果表明,方法的选择取决于特定的数据集和手头的任务。
對於迴歸任務,我們發現PCA通常比SVD表現得更好。在分類的情況下,LDA優於SVD和PCA,以及原始資料集。線性判別分析(LDA)在分類任務中始終擊敗主成分分析(PCA)的這個是很重要的,但這並不意味著LDA在一般情況下是一種更好的技術。這是因為LDA是一種監督學習演算法,它依賴有標籤的數據來定位數據中最具鑑別性的特徵,而PCA是一種無監督技術,它不需要有標籤的數據,並尋求在數據中保持盡可能多的變異數。因此,PCA可能更適合於無監督的任務或可解釋性至關重要的情況,而LDA可能更適合涉及標記資料的任務。
雖然降維技術可以幫助減少資料集中的特徵數量,並提高機器學習模型的效率,但重要的是要考慮對模型性能和結果可解釋性的潛在影響。
本文完整程式碼:
https://github.com/salmankhi/DimensionalityReduction/blob/main/Notebook_25373.ipynb
以上是常見降維技術比較:保持資訊完整性下降低資料維度的可行性分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!