当前位置: 首页 > 科技观察

机器学习特征选择Python工具

时间:2023-03-18 11:48:01 科技观察

特征选择是在数据集中寻找和选择最有用的特征的过程,是机器学习流水线中的关键步骤。不必要的特征会减慢训练速度,降低模型的可解释性,最重要的是,会降低测试集的泛化性能。由于发现自己一遍又一遍地将临时特征选择方法应用于机器学习问题而感到沮丧,我在GitHub上用Python构建了一个特征选择类。FeatureSelector包括一些最常见的特征选择方法:具有高百分比缺失值的特征具有共线性(高相关性)的特征在基于树的模型中具有零重要性的特征具有低重要性的特征具有单个唯一值的特征在本文中,我们将在示例机器学习数据集上使用FeatureSelector。我们将看到这如何使我们能够快速实施这些方法,从而产生更高效的工作流程。完整代码可在GitHub上获得,我鼓励任何贡献。FeatureSelector正在开发中,将根据社区需求不断完善!示例数据集在此示例中,我们将使用来自Kaggle的HomeCreditDefaultRisk机器学习竞赛数据。(要开始比赛,请参阅本文)。整个数据集都可以下载,这里我们将用一个例子来演示它。示例数据,TARGET是分类的标签这个比赛是一个监督分类问题,这是一个很好的数据集,因为它有很多缺失值,很多高度相关(共线)的特征,还有一些不相关的特征,这对机器学习模型没有帮助.创建实例要创建FeatureSelector类的实例,我们需要传入包含行和列中的特征的结构化数据集。我们可以使用一些仅限特征的方法,但基于重要性的方法也需要训练标签。由于我们有一个监督分类任务,我们将使用一组特征和一组标签。(确保在与feature_selector.py相同的目录中运行此脚本)方法特征选择器有五种方法用于查找要删除的特征。我们可以访问任何已识别的特征并手动将其从数据中删除,或者使用特征选择器中的“删除”功能。在这里,我们详细描述了每种识别方法,并展示了如何同时运行所有5种方法。FeatureSelector还具有一些绘图功能,因为视觉检测数据是机器学习的关键组成部分。缺失值第一种找到要移除的特征的方法很简单:查看哪些特征的缺失值比例大于某个阈值。下面的调用识别缺失值超过60%的特征。fs.identify_missing(missing_threshold=0.6)17个特征大于0.60个缺失值。我们可以看到dataframe中每一列缺失值的比例:fs.missing_stats.head()要查看要去除的特征,我们访问FeatureSelector的ops属性,它是一个Python字典,其值为功能列表。missing_features=fs.ops['missing']missing_features[:5]['OWN_CAR_AGE','YEARS_BUILD_AVG','COMMONAREA_AVG','FLOORSMIN_AVG','LIVINGAPARTMENTS_AVG']最后,我们绘制所有特征缺失值的分布图:fs.plot_missing()共线特征共线特征是彼此高度相关的特征。在机器学习中,由于方差大和模型可解释性差,测试集泛化性能下降。identify_collinear方法根据指定的相关系数值查找共线特征。对于每一对相关特征,它标识一个要删除的特征(因为我们只需要删除一个):fs.identify_collinear(correlation_threshold=0.98)21featureswithacorrelationmagnitudegreaterthan0.98。我们可以用相关性做一个清晰的可视化,那就是热图。这显示了至少有一个相关特征高于阈值的所有特征:fs.plot_collinear()如前所述,我们可以访问将被删除的相关特征的整个列表,或者查看数据框中高度相关的特征对。#listofcollinearfeaturestoremovecollinear_features=fs.ops['collinear']#dataframeofcollinearfeaturesfs.record_collinear.head()如果我们想调查我们的数据集,我们还可以通过将plot_all=True传递给call:zero来绘制数据中的所有相关性Importancefeatures第一个两种方法可以应用于任何结构化数据集并且是确定性的——对于给定的阈值,结果每次都是相同的。下一种方法仅适用于有监督的机器学习问题,其中我们有训练模型的标签并且是不确定的。identify_zero_importance函数基于梯度提升机(GBM)学习模型查找不重要的特征。使用基于树的机器学习模型,例如增强集成,我们可以找到特征重要性。重要性的绝对值不如相对值重要,可用于确定与任务最相关的特征。我们还可以通过删除重要性为零的特征来执行特征选择。在基于树的模型中,不使用零重要性特征来分割任何节点,因此我们可以在不影响模型性能的情况下删除它们。FeatureSelector使用LightGBM库中的梯度提升机来查找特征重要性。为了减少方差,对GBM的10个训练会话的特征重要性进行平均。此外,该模型使用带有验证集的提前停止(可以选择关闭验证集)进行训练,以防止过度拟合训练数据。以下代码调用此方法提取零重要性特征:我们传入以下参数:任务:问题的“分类”或“回归”eval_metric:用于提前停止的指标(如果禁用提前停止则不需要)使用这个指标)n_iteration:训练次数,用于提前平均特征重要性ly_stop:是否使用提前停止来训练模型=12)124featuresrequiredfor0.99ofcumulativeimportance左边我们有plot_n个最重要的特征(根据归一化重要性求和绘制到1)在右边,我们具有相对于特征数量的累积重要性。垂直线绘制在累积重要性的“阈值”处,在本例中为99%。对于基于重要性的方法,有两个注意事项需要牢记:梯度提升机是随机训练的,这意味着每次运行模型时特征输入都会改变。这应该不会产生重大影响(最重要的功能不会突然变得最不重要),但它会改变某些功能的顺序。它还会影响已识别的零重要性特征的数量。如果特征的重要性每次都发生变化,请不要感到惊讶!要训??练机器学习模型,首先要对特征进行“单热编码”。这意味着一些重要性为0的特征可能是在建模过程中添加的单热编码特征。当我们到达特征移除阶段时,有一个选项可以移除任何添加的单热编码特征。但是,如果我们在特征选择之后进行机器学习,我们仍然必须对特征进行one-hot编码!低重要性特征下一个方法建立在零重要性函数的基础上,并利用模型的特征输入进行进一步选择。函数identify_low_importance找到对总重要性影响很小的最低重要性特征。例如,以下调用找到99%的总重要性不需要的最不重要的特征:fs.identify_low_importance(cumulative_importance=0.99)123featuresrequiredforcumulativeimportanceof0.99afteronehotencoding.116featuresdonotcontributetocumulativeimportanceof0.99。基于累积重要性图和这些信息,梯度提升机器考虑了许多与学习无关的特征。同样,这种方法的结果将随着每次训练运行而改变。要查看数据帧中的所有重要特征:fs.feature_importances.head(10)low_importance方法借鉴了使用主成分分析(PCA)的方法,该方法通常只保留一定百分比的方差(例如95%)PC。总重要性的百分比基于相同的想法。基于特征重要性的方法只有在我们使用基于树的模型进行预测时才真正适用。除了随机性之外,基于重要性的方法是一种黑盒方法,因为我们不知道为什么模型认为这些特征不相关。如果使用这些方法,请多次运行它们以查看结果如何变化,并可能创建具有不同参数的多个数据集进行测试!单个唯一值的特征最后一种方法相当基本:找到任何只有一个唯一值的列。只有一个唯一值的特征对机器学习没有用,因为该特征的方差为零。例如,基于树的模型永远不能根据只有一个值的特征进行拆分(因为没有分组来划分观察值)。这里没有参数选择,不像其他方法:fs.identify_single_unique()4featureswithasingleuniquevalue。我们可以绘制每个类别中唯一值数量的直方图:fs.plot_unique()需要记住的一件事是,默认情况下,在pandas中,NaN在唯一值之前被删除。移除特征一旦我们确定了要丢弃的特征,我们有两种选择来移除它们。所有要移除的特征都存储在FeatureSelector的ops字典中,我们可以使用列表手动移除特征。另一种选择是使用“删除”内置功能。对于这个方法,我们传入了移除特征的方法。如果我们想使用所有实现的方法,我们只需传递methods='all'。#Removethefeaturesfrommallmethods(returnsadf)train_removed=fs.remove(methods='all')['missing','single_unique','collinear','zero_importance','low_importance']methodshavebeenrunRemoved140特征。此方法返回一个删除了特征的数据框。也可以删除在机器学习期间创建的单热编码特征:train_removed_all=fs.remove(methods='all',keep_one_hot=False)删除了187个特征,包括单热特征。在继续之前,检查哪些功能将被删除可能是个好主意!原始数据集作为备份存储在FeatureSelector的数据属性中!要一次运行所有方法,我们可以使用identify_all而不是单独使用这些方法。这需要每个方法的参数字典:请注意,当我们重新运行模型时,总特征数会发生变化。然后可以调用“删除”功能来删除这些功能。小结在训练机器学习模型之前,FeatureSelector类实现了几个删除特征的常用操作。它提供了用于识别要删除的特征以及可视化的特征。方法可以单独运行或同时运行,以实现高效的工作流程。missing、collinear和single_unique方法是确定性的,而基于特征重要性的方法会随着每次运行而改变。与机器学习领域一样,特征选择在很大程度上是经验性的,需要测试多种组合才能找到最佳答案。最佳做法是在管道中尝试多种配置,特征选择器提供了一种快速评估特征选择参数的方法。