你好,游客 登录
背景:
阅读新闻

一文学会在Python中利用过滤器方法进行深度学习特征选择

[日期:2018-11-15] 来源:网络  作者: [字体: ]

  引言

  机器学习和深度学习算法都是从由不同类型的特征组成的数据中学习。机器学习算法的训练时间和性能在很大程度上取决于数据集中的特征。理想情况下,我们应该只在数据集中保留那些实际上有助于我们的机器学习模型学习的东西。

  不必要的冗余特征不仅减慢了算法的训练时间,而且还影响了算法的性能。选择用于训练机器学习模型的最合适特征的过程称为“特征选择”。

  在训练机器学习模型之前执行特征选择主要由以下几个方面的好处:

  具有较少特征的模型具有较高的可解释性

  具有较少特征的机器学习模型更容易

  较少的特征可以增强泛化,减少过度拟合

  特征选择可消除数据冗余

  具有较少特征的模型的训练时间显着降低

  具有较少特征的模型不容易出错

  人们已经提出了多种方法来为机器学习算法选择最佳特征,其中一类方法称为过滤器方法。在本文中,我们将学习一些用于特征选择的基本过滤方法。

  特征选择的过滤器方法

  过滤器方法属于特征选择方法的一种类别,其可以选择独立于机器学习算法模型之外的特征,使用过滤方法选择的特征可用作任何机器学习模型的输入,这是过滤方法的最大优点之一。过滤器方法的另一个优点是速度非常快。

  过滤器方法可大致分为两类:单变量过滤器方法和多变量过滤器方法。

  单变量过滤器方法是根据特定标准对各个特征进行排序,然后选择前N个特征。可以将不同类型的排名标准用于单变量过滤器方法,例如费舍尔得分(fisher score),互信息(mutual information)和特征方差。

  单变量滤波器方法的主要缺点之一是它可能会选择冗余特征,因为在做出决策时不考虑各个特征之间的关系,单变量滤波器方法非常适合从数据中去除常量和准常量特征。

  多变量过滤器方法能够考虑特征之间的相互关系,从数据中删除冗余特征。

  在本文中,我们将看到如何在Python的帮助下从数据集中删除常量,准常量,重复和相关的特征。

  一、删除常量特征

  常量特征是仅包含数据集中所有输出的一个值的特征,其不提供任何有助于对记录进行分类的信息。因此,建议从数据集中删除所有常量特征。

  让我们看看如何从数据集中删除常量特征。我们采用的数据集是Santandar Customer Satisfaction数据集,可以从Kaggle下载,我们将使用“train.csv”。但是,为了方便,我们将其重命名为“santandar_data.csv”。

  导入所需的库和数据集

  常量特征的值具有零方差,因为所有值都相同。我们可以使用Python的Scikit Learn库的VarianceThreshold函数找到常量列。执行以下代码以导入所需的库和数据集:

  在输出中,您应该看到(40000,371),这意味着我们的数据集中有4万行和371列。

  将数据拆分为训练集和测试集

  需要注意的是,为了避免过拟合,特征选择应仅应用于训练集。我们将数据划分为训练和测试集。执行以下脚本:

  使用方差阈值删除常量特征

  为删除常量特征,我们将使用之前导入的VarianceThreshold函数。该函数需要输入阈值参数的值,为参数传递零值将过滤所有具有零方差的特征。 执行以下脚本以创建常量特征的过滤器:

  constant_filter = VarianceThreshold(threshold=0)

  接下来,用一下代码将其应用于我们的训练集:

  constant_filter.fit(train_features)

  现在,要获得非常量的所有特征,我们可以使用我们创建的过滤器的get_support()方法。 执行以下代码以查看非常量特征的数量:

  len(train_features.columns[constant_filter.get_support()])

  在输出中,您应该看到320,这意味着训练集的370个特征中有320个不是常量的特征。

  同样,您可以用以下代码查看常量特征的数量:

  以下代码查看所有常量列:

  for column in constant_columns:

  print(column)

  最后,要从训练集和测试集中删除常量特征,我们可以使用constant_filter的transform()方法。执行以下代码来进行此操作:

  train_features = constant_filter.transform(train_features)

  test_features = constant_filter.transform(test_features)

  train_features.shape, test_features.shape

  如果执行了上面的代码,您将看到我们的训练集和测试集现在都包含320列,因为已经删除了50个常量列。

  二、删除准常量特征

  准常量特征,顾名思义,是几乎不变的特征。换句话说,这些特征对于非常大的输出子集具有几乎相同的值。这些特征对于进行预测并不是非常有用。关于准常量特征方差的阈值没有具体规则。但是,根据经验,应该删除输出观测值具有99%以上相似值的准常量特征。

  在本节中,我们将借助VarianceThreshold函数创建一个准常量过滤器。但是,我们这次是传递0.01,而不是传递0作为阈值参数的值,这意味着如果列中值的方差小于0.01,则删除该列。换句话说,删除大约99%的相似值的特征列。

  这些步骤与上一节非常相似。我们将导入数据集和库,拆分训练集和数据集,并首先删除常量特征。

  导入所需的库和数据集

  执行以下代码以导入数据集和所需的库:

  将数据拆分为训练集和测试集

  使用方差阈值删除常量特征

  在我们删除准常量特征之前,我们应该先删除常量特征。通过以下代码来执行此操作:

  使用方差阈值去除准常量特征

  执行以下代码,使用我们创建的准常量过滤器:

  qconstant_filter = VarianceThreshold(threshold=0.01)

  其余步骤是相同的。我们需要使用fit()方法将过滤器应用于我们的训练集,如下所示:

  qconstant_filter.fit(train_features)

  让我们查看一下非准常量列的数量。执行以下代码:

  len(train_features.columns[qconstant_filter.get_support()])

  在输出中,您应该看到265,这意味着在删除常量特征后我们获得的320列中,55列是准常量。

  要验证准常量列的数量,请执行以下脚本:

  输出应该是55列。

  用一下代码查看所有准常量列的名字:

  for column in qconstant_columns:

  print(column)

  最后,为了查看我们的训练集和测试集是否只包含非常量和非准常量列,我们可以使用qconstant_filter的transform()方法。执行以下代码:

  如果执行了上面的脚本,您将看到我们的训练集和测试集现在都包含265列,因为已从原始的370列中删除了50个常量列和55个准常量列。

  三、删除重复的特征

  重复特征是具有相似值的特征,其不会为算法学习提供任何价值,而是会增加训练时间。 因此,始终建议在训练之前从数据集中删除重复的特征。

  导入所需的库和数据集

  执行以下代码以导入数据集和所需的库:

  删除重复列的计算成本很高,因为我们必须先数据矩阵进行转置,然后才能删除重复的特征。 因此,在上面的代码中,我们只从本文中使用的santandar客户满意度数据中导入前2万条记录。

  将数据拆分为训练集和测试集

  使用转置删除重复的特征

  与常量和准常量特征不同,我们没有可以删除重复特征的Python内置方法。但是,pandas库可以帮助我们识别数据中的重复特征。我们将使用此方法首先对数据集进行转置,如下所示:

  train_features_T = train_features.T

  train_features_T.shape

  在上面的代码中,我们将训练数据转置并存储在train_features_T数据帧中。我们的初始训练集包含16000行和370列,如果您查看转置训练集的形状,您将看到它包含370行和16000列。

  幸运的是,在pandas中我们有duplicated()方法,它可以帮助我们从数据中找到重复的行。请记住,转置数据框的行实际上是原始数据框的列或特征。

  让我们使用sum()方法找到数据集中重复特征的总数,并使用duplicated()方法链接,如下所示:

  print(train_features_T.duplicated().sum())

  在输出中,您应该看到94。

  最后,我们可以使用drop_duplicates()方法删除重复的行。如果首先将字符串值传递给drop_duplicates()方法的keep参数,则除第一个副本外,将删除所有重复行。在下一步中,我们将删除所有重复的行,并将转置训练集以获得不包含任何重复列的原始训练集。执行以下代码:

  unique_features = train_features_T.drop_duplicates(keep='first').T

  现在,让我们查看一下没有重复特征的新训练集的情况:

  unique_features.shape

  在输出中,您应该看到(16000,276),您可以看到在删除94个重复列后,我们的特征集的大小已经显著减少。

  要查看重复列的名称,请执行以下代码:

  duplicated_features = [dup_col for dup_col in train_features.columns if dup_col not in unique_features.columns]

  duplicated_features

  四、删除相关的特征

  除了重复的特征外,数据集还可能包含相关的特征。如果两个或两个以上的特征在线性空间中彼此接近,则它们是相关的。

  以水果篮的特征集为例,水果篮的重量通常与价格相关。重量越大,价格越高。

  输出观测值与输入特征之间的相关性非常重要,应保留这些特征。但是,如果两个或两个以上的特征相互关联,它们会将冗余信息传递给模型,因此只应保留一个相关特征以减少特征的数量。

  我们将用于本节的数据集是BNP Paribas Cardif索赔管理数据集,可以从Kaggle下载。按照以下步骤从数据集中查找和删除相关特征。

  导入所需的库和数据集

  执行以下代码以导入数据集和所需的库:

  在上面的代码中,我们导入了数据集以及所需的库。接下来,我们print了数据框的结构。在输出中,您应该看到(20000,133),这意味着我们的数据集包含2万行和133个特征。

  为了找到特征之间的相关性,我们只需要数据集中的数字特征。为了过滤掉除数字特征之外的所有特征,我们需要预处理我们的数据。

  数据预处理

  执行以下代码,从数据集中删除非数字特征:

  在上面代码的第一行中,我们定义了一个列表,其中包含我们要在数据集中保留的列的数据类型。接下来,我们在数据集上调用select_dtypes()方法,并向其传递包含我们要保留的列类型的num_colums列表。 select_dtypes()方法将返回指定数字列的名称,我们将其存储在numeric_columns列表中。接下来,我们借助于numeric_colums列表从paribas_data数据帧中过滤我们的列。让我们执行以下代码查看一下paribas_data数据的结构,看看我们有多少个数字列:

  paribas_data.shape

  在输出中,您应该看到(20000,114),这意味着现在我们的数据集包含2万条记录和114个特征,之前我们有133个特征。

  将数据拆分为训练集和测试集

  像前面一样,我们需要在删除任何相关特征之前将数据拆分为训练集和测试集,执行以下代码将数据划分为训练集和测试集:

  使用corr()方法删除相关特征

  要删除相关的特征,我们可以使用pandas数据框的corr()方法。corr()方法返回一个包含数据框所有列之间相关性的相关矩阵。然后,我们可以遍历相关矩阵,查看两列之间的相关性是否大于阈值,如果大于阈值则将该列添加到相关特征的集合中,然后我们可以从实际数据集中删除该列数据。

  让我们首先为数据集中的列创建相关矩阵,并创建一个包含所有相关特征的空集。执行以下代码:

  correlated_features = set()

  correlation_matrix = paribas_data.corr()

  在上面的代码中,我们为数据集中的所有列创建相关矩阵correlation_matrix。我们还创建了一个correlated_features集合,其中包含所有相关特征的名称。

  接下来,我们将循环遍历correlation_matrix中的所有列,并设置将相关系数大于0.8的列添加到correlated_features,如下所示。当然,你也可以设置自己的相关系数阈值。

  让我们看一下数据集中的总列数,相关值大于0.8,至少有一列。 执行以下代码:

  len(correlated_features)

  您应该在输出中看到55,这几乎是数据集中原始特征数量的40%,说明我们的数据集包含太多冗余信息。执行以下代码以查看这些特征的名称:

  print(correlated_features)

  输出如下:

  这些相关列将类似的信息传递给学习算法,因此应该删除。

  执行以下代码从数据集中删除这些列:

  train_features.drop(labels=correlated_features, axis=1, inplace=True)

  test_features.drop(labels=correlated_features, axis=1, inplace=True)

  结论

  特征选择在任何机器学习模型的训练和性能方面都起着至关重要的作用。在本文中,我们研究了使用Python进行特征选择的不同类型的过滤器方法。

 

  在下一篇文章中,我们将介绍一些其他类型的特征选择方法,不见不散!

收藏 推荐 打印 | 录入:Cstor | 阅读:
相关新闻      
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款