本文将比拟各种降维技术在机器学习工作中对表格数据的有效性。咱们将降维办法利用于数据集,并通过回归和分类剖析评估其有效性。咱们将降维办法利用于从与不同畛域相干的 UCI 中获取的各种数据集。总共抉择了 15 个数据集,其中 7 个将用于回归,8 个用于分类。
为了使本文易于浏览和了解,仅显示了一个数据集的预处理和剖析。试验从加载数据集开始。数据集被分成训练集和测试集,而后在均值为 0 且标准差为 1 的状况下进行标准化。
而后会将降维技术利用于训练数据,并应用雷同的参数对测试集进行变换以进行降维。对于回归,应用主成分剖析(PCA)和奇怪值合成(SVD)进行降维,另一方面对于分类,应用线性判别分析(LDA)
降维后就训练多个机器学习模型进行测试,并比拟了不同模型在通过不同降维办法取得的不同数据集上的性能。
数据处理
让咱们通过加载第一个数据集开始这个过程,
import pandas as pd ## for data manipulation
df = pd.read_excel(r'Regression\AirQualityUCI.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)
线性降维的 PCA 办法升高了数据的维数,同时保留了尽可能多的数据方差。
这里将应用 Python sklearn.decomposition 模块的 PCA 办法。要保留的组件数量是通过这个参数指定的,这个数字会影响在较小的特色空间中蕴含多少维度。作为一种代替办法,咱们能够设定要保留的指标方差,它依据捕捉的数据中的方差量建设组件的数量,咱们这里设置为 0.95
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
X_train_pca
上述特色代表什么? 主成分剖析 (PCA) 将数据投射到低维空间,试图尽可能多地保留数据中的不同之处。尽管这可能有助于特定的操作,但也可能使数据更难以了解。,PCA 能够辨认数据中的新轴,这些轴是初始特色的线性交融。
奇怪值合成(SVD)
SVD 是一种线性降维技术,它将数据方差较小的特色投影到低维空间。咱们须要设置降维后要保留的组件数量。这里咱们将把维度升高 2/3。
from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=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
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 维。
- 就机器学习性能而言,数据集的原始模式绝对更好。造成这种状况的一个潜在起因可能是,当咱们应用这种技术升高维数时,在这个过程中会产生信息损失。
- 然而线性回归、反对向量回归和梯度加强回归在原始和 PCA 案例中的体现是统一的。
- 在咱们通过 SVD 失去的数据上,所有模型的性能都降落了。
- 在降维状况下,因为特色变量的维数较低,模型所破费的工夫缩小了。
将相似的过程利用于其余六个数据集进行测试,失去以下后果:
咱们在各种数据集上应用了 SVD 和 PCA,并比照了在原始高维特色空间上训练的回归模型与在约简特色空间上训练的模型的有效性
- 原始数据集始终优于由降维办法创立的低维数据。这阐明在降维过程中可能失落了一些信息。
- 当用于更大的数据集时,降维办法有助于显著缩小数据集中的特色数量,从而进步机器学习模型的有效性。对于较小的数据集,改影响并不显著。
- 模型的性能在 original 和 pca_reduced 两种模式下保持一致。如果一个模型在原始数据集上体现得更好,那么它在 PCA 模式下也会体现得更好。同样,较差的模型也没有失去改良。
- 在 SVD 的状况下,模型的性能降落比拟显著。这可能是 n_components 数量抉择的问题,因为太小数量必定会失落数据。
- 决策树在 SVD 数据集时始终是十分差的,因为它原本就是一个弱学习器
训练分类模型
对于分类咱们将应用另一种降维办法: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。
- LDA 数据集通常优于原始模式的数据和由其余降维办法创立的低维数据,因为它旨在辨认最无效区分类的特色的线性组合,而原始数据和其余无监督降维技术不关怀数据集的标签。
- 降维技术在利用于更大的数据集时,能够极大地缩小了数据集中的特色数量,这进步了机器学习模型的效率。在较小的数据集上,影响不是特地显著。除了 LDA(它在这些状况下也很无效),因为它们在一些状况下,如二元分类,能够将数据集的维度缩小到只有一个。
- 当咱们在寻找肯定的性能时,LDA 能够是分类问题的一个十分好的终点。
- SVD 与回归一样,模型的性能降落很显著。须要调整 n_components 的抉择。
总结
咱们比拟了一些降维技术的性能,如奇怪值合成 (SVD)、主成分剖析(PCA) 和线性判别分析(LDA)。咱们的钻研结果表明,办法的抉择取决于特定的数据集和手头的工作。
对于回归工作,咱们发现 PCA 通常比 SVD 体现得更好。在分类的状况下,LDA 优于 SVD 和 PCA,以及原始数据集。线性判别分析 (LDA) 在分类工作中始终击败主成分剖析 (PCA) 的这个是很重要的,但这并不意味着 LDA 在个别状况下是一种更好的技术。这是因为 LDA 是一种监督学习算法,它依赖于有标签的数据来定位数据中最具甄别性的特色,而 PCA 是一种无监督技术,它不须要有标签的数据,并寻求在数据中放弃尽可能多的方差。因而,PCA 可能更适宜于无监督的工作或可解释性至关重要的状况,而 LDA 可能更适宜波及标记数据的工作。
尽管降维技术能够帮忙缩小数据集中的特色数量,并进步机器学习模型的效率,但重要的是要思考对模型性能和后果可解释性的潜在影响。
本文残缺代码:
https://avoid.overfit.cn/post/df739d6749f54ca99690ff819dacc497
作者:Salman Khan