当前位置: 首页 > 后端技术 > Python

常用降维技术比较:能否在不丢失信息的情况下对数据进行降维

时间:2023-03-25 20:09:24 Python

本文将在机器学习任务中比较各种降维技术对表格数据的有效性。我们将降维方法应用于数据集,并通过回归和分类分析评估其有效性。我们将我们的降维方法应用于从与不同领域相关的UCI获得的各种数据集。总共选择了15个数据集,其中7个将用于回归,8个用于分类。为了使本文易于阅读和理解,仅展示了一个数据集的预处理和分析。实验从加载数据集开始。将数据集分为训练集和测试集,然后用均值为0和标准差为1的方式进行归一化。然后将降维技术应用于训练数据,并使用相同的参数对测试集进行降维转换。对于回归,主成分分析(PCA)和奇异值分解(SVD)用于降维。另一方面,对于分类,使用线性判别分析(LDA)降维后训练多个机器学习模型进行测试,并比较不同模型在不同降维方法得到的不同数据集上的性能。数据操作让我们通过加载我们的第一个数据集来开始这个过程,将pandas导入为pd##进行数据操作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,))为了进行训练,我们需要将数据集分为训练集和测试集,这样才能评估降维方法和在降维特征空间上训练的机器学习模型的有效性。模型将使用训练集进行训练,性能将使用测试集进行评估。从sklearn.model_selectionimporttrain_test_splitX_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,))在对数据集应用降维技术之前,可以对输入数据进行缩放,使所有特征都处于同一比例。这对于线性模型至关重要,因为一些降维方法可以根据数据是否归一化来改变它们的输出,并且对特征的大小敏感。fromsklearn.preprocessingimportStandardScalerscaler=StandardScaler()X_train=scaler.fit_transform(X_train)X_test=scaler.transform(X_test)X_train.shape,X_test.shape主成分分析(PCA)线性降维PCA方法对数据进行降维数,同时保留尽可能多的数据方差。这里我们将使用Pythonsklearn.decomposition模块的PCA方法。要保留的组件数量通过此参数指定,此数量会影响较小特征空间中包含的维度数量。作为替代方案,我们可以设置要保留的目标方差,它根据捕获数据中的方差量确定组件数量,我们在此处将其设置为0.95fromsklearn.decompositionimportPCApca=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。fromsklearn.decompositionimportTruncatedSVDsvd=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)训练和测试模型,我们使用多个模型进行比较。importnumpyasnpfromsklearn.linear_modelimportLinearRegressionfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.svmimportSVRfromsklearn.treeimportDecisionTreeRegressorfromsklearn.ensembleimportRandomForestRegressor,GradientBoostingRegressorfromsklearn.metricsimportr2_score,mean_squared_errorimporttimetrain_test_ML:这个函数将完成与模型的训练和测试相关的重复性任务。所有模型的性能通过计算rmse和r2_score来评估。并返回包含所有详细信息和计算值的数据集,还记录每个模型在其各自数据集上进行训练和测试所花费的时间。deftrain_test_ML(dataset,dataform,X_train,y_train,X_test,y_test):temp_df=pd.DataFrame(columns=['数据集','数据形式','维度','模型','R2分数','RMSE','TimeTaken'])foriin[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]returntemp_dforiginaldata:original_df=train_test_ML('AirQualityUCI','Original',X_train,y_train,X_test,y_test)original_df可以看到KNNregressor和randomforest在输入原始数据的时候表现比较好,随机森林训练时间最长。PCApca_df=train_test_ML('AirQualityUCI','PCAReduced',X_train_pca,y_train,X_test_pca,y_test)pca_df与原始数据集相比,不同模型的性能有不同程度的下降。梯度提升回归和支持向量回归在这两种情况下保持一致性。这里和预期的一个主要区别是模型训练所花费的时间。与其他模型不同,SVR在这两种情况下花费的时间大致相同。SVDsvd_df=train_test_ML('AirQualityUCI','SVDReduced',X_train_svd,y_train,X_test_svd,y_test)svd_df与PCA相比,SVD在更大范围内降维,随机森林和梯度提升回归器的表现相对优于其他模型。回归模型分析对于该数据集,使用主成分分析时数据维度从12维降为5维,使用奇异值分析时降为3维。数据集的原始形式在机器学习性能方面相对更好。造成这种情况的一个潜在原因可能是,当我们使用这种技术降低维度时,在此过程中会发生信息丢失。但线性回归、支持向量回归和梯度提升回归在原始和PCA案例中的表现相同。在我们通过SVD获得的数据上,所有模型的性能都下降了。在降维的情况下,由于特征变量的维数较低,花在模型上的时间减少。对其他六个数据集应用类似的程序进行测试,我们得到了以下结果:我们在各种数据集上使用了SVD和PCA,并比较了在原始高维特征空间和在缩减特征空间上训练的回归模型的有效性。在空间原始数据集上训练的模型始终优于通过降维方法创建的低维数据。这表明在降维过程中可能会丢失一些信息。当应用于更大的数据集时,降维方法有助于显着减少数据集中的特征数量,从而提高机器学习模型的有效性。对于较小的数据集,影响并不显着。模型的性能在原始模式和pca_reduced模式下都是一致的。如果一个模型在原始数据集上表现更好,那么它在PCA模式下的表现也会更好。同样,较差的模型也没有得到改进。在SVD的情况下,模型的性能下降更为明显。这可能是n_components数量选择的问题,因为数量太小肯定会丢失数据。决策树在SVD数据集上的表现一直很差,因为它天生就是一个训练分类模型的弱学习器。对于分类,我们将使用另一种降维方法:LDA。机器学习和模式识别任务通常使用称为线性判别分析(LDA)的降维方法。这种监督学习技术旨在最大化几个类或类别之间的距离,同时将数据投影到低维空间。由于其作用是最大化类间差异,因此只能用于分类任务。fromsklearn.linear_modelimportLogisticRegressionfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.svmimportSVCfromsklearn.treeimportDecisionTreeClassifierfromsklearn.ensembleimportRandomForestClassifier,GradientBoostingClassifierfromsklearn.metricsimportaccuracy_score,f1_score,recall_score,precision_score继续我们的训练方法deftrain_test_ML2(dataset,dataform,X_train,y_train,X_test,y_test):temp_df=pd.DataFrame(columns=['DataSet','DataForm','Dimensions','Model','Accuracy','F1Score','Recall','Precision','TimeTaken'])foriin[LogisticRegression,KNeighborsClassifier,SVC,DecisionTreeClassifier,RandomForestClassifier,GradientBoostingClassifier]:start_time=time.time()reg=i().fit(X_train,y_train)y_pred=reg。预测(X_test)精度=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]returntemp_df从sklearn.discriminant_analysisimportLinearDiscriminantAnalysislda=LinearDiscriminantAnalysis()X_train_lda=lda.fit_transform(X_transform,y_train)X_test_lda=lda.集合的缩放,与回归部分相同。在重新连接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作者:SalmanKhan