最常见的数据准备方法是研究数据集,审查机器学习算法的期望,然后仔细选择最合适的数据准备技术来转换原始数据数据以最好地满足算法的期望。它速度慢、价格昂贵,并且需要大量的专业知识。数据准备的另一种方法是将一组通用且常用的数据准备技术并行应用于原始数据,并将所有转换的结果组合成一个大数据集,从中可以拟合和评估模型。这是另一种数据准备哲学,将数据转换视为从原始数据中提取显着特征的一种方式,从而将问题的结构暴露给学习算法。它需要学习缩放加权输入特征并使用与预测目标最相关的输入特征的算法。这种方法需要较少的专业知识,与数据准备方法的全网格搜索相比计算效率更高,并且可以帮助发现非直观的数据准备解决方案以实现给定的预测建模问题。良好或最佳性能。在本文中,我们描述了如何使用特征提取来准备表格数据。特征提取为表格数据的数据准备提供了一种替代方法,其中所有数据转换都并行应用于原始输入数据并组合以创建大型数据集。如何使用特征提取方法进行数据准备以提高标准分类数据集的基准性能。.如何将特征选择添加到特征提取建模管道以进一步提高标准数据集的建模性能。本文分为三个部分:1.特征提取技术的数据准备2.数据集和性能基准葡萄酒分类数据集基准模型性能3.特征提取方法特征提取技术的数据准备数据准备可能具有挑战性。最常见和遵循的方法是分析数据集,检查算法的要求,并转换原始数据以最好地满足算法的期望。这可能是高效的,但它也很慢,并且可能需要数据分析和机器学习算法方面的专业知识。另一种方法是将输入变量的准备考虑为建模管道的超参数,并在选择算法和算法配置时对其进行调整。虽然它可能在计算上很昂贵,但它也是一种暴露不直观解决方案并且需要很少专业知识的有效方法。在这两种数据准备方法之间找到合适的匹配是将输入数据的转换视为特征工程或特征提取过程。这涉及将一组通用或常用的数据准备技术应用于原始数据,然后将所有特征聚合在一起以创建大型数据集,然后根据该数据拟合和评估模型。该方法的基本原理将每种数据准备技术视为一种转换,可以从原始数据中提取显着特征以呈现给学习算法。理想情况下,此类转换将理清复杂的关系和复合输入变量,从而允许使用更简单的建模算法,例如线性机器学习技术。由于没有更好的名称,我们将其称为“特征工程方法”或“特征提取方法”,用于为预测建模项目配置数据准备。它允许将数据分析和算法专业知识用于选择数据准备方法,并且可以找到不直观但计算成本低得多的解决方案。排除输入特征的数量也可以通过使用特征选择技术来明确解决,这些技术试图对大量提取特征的重要性或价值进行排序,并仅选择与预测目标最相关的一小部分变量。我们可以通过一个工作示例来探索这种数据准备方法。在深入示例之前,让我们首先选择一个标准数据集并开发一个性能基准。数据集和性能基准我们将首先选择一个标准的机器学习数据集,并为这个数据集建立一个性能基准。这将为探索数据准备的特征提取方法提供背景。葡萄酒分类数据集我们将使用葡萄酒分类数据集。该数据集有13个输入变量,用于描述葡萄酒样本的化学成分,并被要求将葡萄酒分为三种类型之一。该示例加载数据集并将其拆分为输入和输出列,然后汇总数据数组。#exampleofloadingandsummarizingthewinedatasetfrompandasimportread_csv#definethelocationofthedataseturl='https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'#loadthedatasetasadataframedf=read_csv(url,header=None)#retrievethenumpyarraydata=df.values#inplitthecoutable=[:,:-1],data[:,-1]#summarizetheshapeoftheloadeddataprint(X.shape,y.shape)#(178,13)(178,)运行例子可以看到数据集加载正确,并且有179行数据,13个输入变量和一个目标变量。接下来,让我们评估此数据集上的模型并建立性能基线。基准模型性能通过评估原始输入数据的模型,我们可以为葡萄酒分类任务建立性能基准。在这种情况下,我们将评估逻辑回归模型。首先,我们可以通过确保输入变量是数字变量和目标变量是标签编码来执行最少的数据准备,正如scikit-learn库所期望的那样。#minimallypreparedsetX=X.astype('float')y=LabelEncoder().fit_transform(y.astype('str'))接下来,我们可以定义我们的预测模型。#definethemodelmodel=LogisticRegression(solver='liblinear')我们将使用重复分层k折交叉验证(10次重复和3次重复)的标准评估模型。模型性能将通过分类准确性进行评估。model=LogisticRegression(solver='liblinear')#definethecross-validationprocedurecv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#evaluatemodelscores=cross_val_score(model,X,y,scoring='accuracy',cv=cv,n_jobs=-1)在运行结束时,我们将报告在所有重复和评估折叠中收集的准确性分数的平均值和标准偏差。#reportperformanceprint('Accuracy:%.3f(%.3f)'%(mean(scores),std(scores)))综上所述,列出了在原始葡萄酒分类数据集上评估逻辑回归模型的完整示例以下。#baselinemodelperformanceonthewinedatasetfromnumpyimportmeanfromnumpyimportstdfrompandasimportread_csvfromsklearn.preprocessingimportLabelEncoderfromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.model_selectionimportcross_val_scorefromsklearn.linear_modelimportLogisticRegression#loadthedataseturl='https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'df=read_csv(url,header=None)data=df.valuesX,y=data[:,:-1],data[:,-1]#minimallypreparedsetX=X.astype('float')y=LabelEncoder().fit_transform(y.astype('str'))#definethemodelmodel=逻辑回归(solver='liblinear')#definethecross-validationprocedurecv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#evaluatemodelscores=cross_val_score(model,X,y,scoring='accuracy',cv=cv,n_jobs=-1)#reportperformanceprint('Accuracy:%.3f(%.3f)'%(mean(scores),std(scores)))#Accuracy:0.953(0.048)通过运行示例评估模型性能并报告均值和标准差分类准确性。您的结果可能会因学习算法的随机性、评估程序以及机器之间的准确性差异而有所不同。尝试运行该示例几次。在这种情况下,我们可以看到,将逻辑回归模型拟合到原始输入数据会产生大约95.3%的平均分类准确率,为性能提供基准。接下来,让我们探讨一下使用基于特征提取的数据准备方法是否可以提高性能。特征提取方法数据准备的第一步是选择一组通用和常用的数据准备技术。在这种情况下,假设输入变量是数值型的,我们将使用一系列变换来改变输入变量的尺度,例如MinMaxScaler、StandardScaler和RobustScaler,以及链接输入变量分布的变换,例如QuantileTransformer和KBinsDiscretizer。最后,我们还将使用转换来消除输入变量之间的线性依赖关系,例如PCA和TruncatedSVD。FeatureUnion类可用于定义要执行的转换列表,其结果将聚合在一起。这将创建一个包含大量列的新数据集。列数的估计值是13个输入变量乘以5个转换或65加上来自PCA和SVD降维方法的14列输出,总共产生大约79个特征。#transformsforthefeatureuniontransforms=list()transforms.append(('mms',MinMaxScaler()))transforms.append(('ss',StandardScaler()))transforms.append(('rs',RobustScaler()))转换。append(('qt',QuantileTransformer(n_quantiles=100,output_distribution='normal')))transforms.append(('kbd',KBinsDiscretizer(n_bins=10,encode='ordinal',strategy='uniform')))transforms.append(('pca',PCA(n_components=7)))transforms.append(('svd',TruncatedSVD(n_components=7)))#createthefeatureunionfu=FeatureUnion(transforms)然后,我们可以使用FeatureUnion作为第一个步骤,并使用逻辑回归模型作为创建建模管道的最后一步。#definethemodelmodel=LogisticRegression(solver='liblinear')#definethepipelinesteps=list()steps.append(('fu',fu))steps.append(('m',model))pipeline=Pipeline(steps=steps)然后可以像以前一样使用重复的分层k折交叉验证来评估管道。下面列出了完整的示例。#datapreparationasfeatureengineeringforwinedatasetfromnumpyimportmeanfromnumpyimportstdfrompandasimportread_csvfromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.model_selectionimportcross_val_scorefromsklearn.linear_modelimportLogisticRegressionfromsklearn.pipelineimportPipelinefromsklearn.pipelineimportFeatureUnionfromsklearn.preprocessingimportLabelEncoderfromsklearn.preprocessingimportMinMaxScalerfromsklearn.preprocessingimportStandardScalerfromsklearn.preprocessingimportRobustScalerfromsklearn.preprocessingimportQuantileTransformerfromsklearn.preprocessingimportKBinsDiscretizerfromsklearn.decompositionimportPCAfromsklearn.decompositionimportTruncatedSVD#loadthedataseturl='https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'df=read_csv(url,header=None)data=df.valuesX,y=data[:,:-1],data[:,-1]#minimallyprepareddatasetX=X.astype('float')y=LabelEncoder().fit_transform(y.astype('str'))#transformsforthefeatureuniontransforms=list()transforms.append(('mms',MinMaxScaler()))transforms.append(('ss',StandardScaler()))transforms.append(('rs',RobustScaler()))transforms.append(('qt',QuantileTransformer(n_quantiles=100,output_distribution='normal')))transforms.append(('kbd',KBinsDiscretizer(n_bins=10,encode='ordinal',strategy='uniform')))transforms.append(('pca',PCA(n_components=7)))transforms.append(('svd',TruncatedSVD(n_components=7)))#createthefeatureunionfu=FeatureUnion(transforms)#definethemodelmodel=LogisticRegression(solver='liblinear')#definethepipelinesteps=list()steps.append(('fu',fu))steps.append(('m',model))pipeline=Pipeline(steps=steps)#definethecross-validationprocedurecv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#evaluatemodelscores=cross_val_score(pipeline,X,y,scoring='accuracy',cv=cv,n_jobs=-1)#reportperformanceprint('精度:%.3f(%.3f)'%(mean(scores),std(scores)))#Accuracy:0.968(0.037)通过运行显示示例评价模型性能,并报告均值和标准偏差分类准确您的结果可能会因学习算法的随机性、评估程序以及机器之间的准确性差异而有所不同。尝试运行该示例几次。在这种情况下,我们可以看到相对于基线性能的性能改进,实现了大约96.8%的平均分类准确率。尝试向FeatureUnion添加更多数据准备方法,看看是否能提高性能。我们还可以使用特征选择将大约80个提取的特征减少到与模型最相关的特征子集。除了降低模型的复杂性,它还可以通过去除不相关和冗余的输入特征来提高性能。在这种情况下,我们将使用递归特征消除(RFE)技术进行特征选择,并将其配置为选择15个最相关的特征。#definethefeatureselectionrfe=RFE(estimator=LogisticRegression(solver='liblinear'),n_features_to_select=15)然后,我们可以在FeatureUnion算法之后和LogisticRegression算法之前将RFE特征选择添加到建模管道中。#definethepipelinesteps=list()steps.append(('fu',fu))steps.append(('rfe',rfe))steps.append(('m',model))pipeline=管道(steps=steps)综上所述,下面列出了一个完整的特征选择数据准备方法示例。#datapreparationasfeatureengineeringwithfeatureselectionforwinedatasetfromnumpyimportmeanfromnumpyimportstdfrompandasimportread_csvfromsklearn.model_selectionimportRepeatedStratifiedKFoldfromsklearn.model_selectionimportcross_val_scorefromsklearn.linear_modelimportLogisticRegressionfromsklearn.pipelineimportPipelinefromsklearn.pipelineimportFeatureUnionfromsklearn.preprocessingimportLabelEncoderfromsklearn.preprocessingimportMinMaxScalerfromsklearn.preprocessingimportStandardScalerfromsklearn.preprocessingimportRobustScalerfromsklearn.preprocessingimportQuantileTransformerfromsklearn.preprocessingimportKBinsDiscretizerfromsklearn.feature_selectionimportRFEfromsklearn.decompositionimportPCAfromsklearn.decompositionimportTruncatedSVD#loadthedataseturl='https://raw.githubusercontent.com/jbrownlee/Datasets/master/wine.csv'df=read_csv(url,header=None)data=df.valuesX,y=data[:,:-1],data[:,-1]#minimallypreparedatasetX=X.astype('float')y=标签编码器().fit_transform(y.astype('str'))#transformsforthefeatureuniontransforms=list()transforms.append(('mms',MinMaxScaler()))transforms.append(('ss',StandardScaler()))transforms.append(('rs',RobustScaler()))transforms.append(('qt',QuantileTransformer(n_quantiles=100,output_distribution='normal')))transforms.append(('kbd',KBinsDiscretizer(n_bins=10,encode='ordinal',strategy='uniform')))transforms.append(('pca',PCA(n_components=7)))transforms.append(('svd',TruncatedSVD(n_components=7)))#createthefeatureunionfu=FeatureUnion(变换)#definethefeatureselectionrfe=RFE(估计器=LogisticRegression(求解器='liblinear'),n_features_to_select=15)#definethemodelmodel=LogisticRegression(求解器='liblinear')#definethepipelinesteps=list()steps.append(('fu',fu))steps.append(('rfe',rfe))steps.append(('m',model))pipeline=Pipeline(steps=steps)#definethecross-validationprocedurecv=RepeatedStratifiedKFold(n_splits=10,n_repeats=3,random_state=1)#evaluatemodelscores=cross_val_s核心(管道、X、y、评分='准确性'、cv=cv、n_jobs=-1)#reportperformanceprint('准确性:%.3f(%.3f)'%(平均值(分数)、标准(分数)))#Accuracy:0.989(0.022)运行实例以评估模型性能并报告均值和标准差分类准确度由于学习算法的随机性、评估过程以及机器之间的准确度差异,您的结果可能会有所不同。试着运行这个例子几次。同样,我们可以看到性能进一步提高,在建模前使用特征选择,从所有提取特征的96.8%到98.9。
