就像您已经观察到的一样,对功能的选择(功能选择)可能会影响算法的最佳超参数,对算法选择的超参数可能会对最佳的功能选择产生影响。
因此,是的,如果您真的很想从模型中压缩每个性能的百分比,并且可以负担所需的计算量,则最佳解决方案可能是“同时”进行特征选择和超参数调整。不过,这可能并不容易(取决于您选择功能的方式)。我想象它的工作方式就像是将不同的特征集作为候选者,并将所有那些候选者集中的一组特征的选择视为额外的超参数。
实际上,这实际上可能并不可行。通常,如果您无法负担所有可能的组合的评估费用,我建议:
非常宽松地优化超参数,只是为了确保您没有为某些超参数分配非常差的值。如果您对超参数有一个很好的直观了解,通常可以通过手工完成,也可以使用非常简单的超参数优化过程(仅使用一堆您认为相当不错的功能)来完成。
特征选择,其超参数可能未进行100%优化,但至少也并非十分糟糕。如果您已经至少配置了某种程度不错的机器学习算法,那么与微优化超参数相比,拥有良好的功能对您的性能将更为重要。极端示例:如果没有功能,则无法预测任何事情。如果您具有包含类标签的作弊功能,则可以对所有内容进行完美分类。
使用上一步中选择的功能优化超参数。现在这应该是一个很好的功能集,实际上可能值得对超参数进行一些优化。
为了解决Nikolas在评论中发布的另一个问题,让所有这些事情(功能选择,超参数优化)与k折交叉验证相互作用:我会说这取决于。
每当您完全使用某一个折叠中的数据,然后评估同一折叠上的性能时,您都会对性能有偏差的估计(您会高估性能)。因此,如果您在特征选择步骤的所有折叠中都使用数据,然后评估每个折叠的性能,则会对每个折叠的性能都有偏差的估计(不好)。同样,如果您进行数据驱动的超参数优化,并使用某些折叠(或所有折叠)中的数据,然后对这些折叠进行评估,那么您将再次获得性能的有偏估计。可能的解决方案是:
分别在每个折叠内重复完整的管线(例如,在每个折叠内,进行特征选择+超参数优化和训练模型)。这样做意味着k倍交叉验证可为您完整地评估整个管道的性能。
将您的初始数据集分为“预处理数据集”和“训练/测试数据集”。您可以在“预处理数据集”上进行特征选择+超参数优化。然后,您修复选定的特征和超参数,并在“训练/测试数据集”上进行k折交叉验证。这样做意味着k倍交叉验证可在给定固定的特征集和超参数值的情况下为您的ML算法性能提供无偏估计。
请注意,这两种解决方案如何导致对性能的估算略有不同。哪个更有趣取决于您的用例,取决于您计划如何在实践中部署机器学习解决方案。例如,如果您是一家打算每天,每周,每月,每年/无论什么时候自动运行功能选择+超参数优化+培训的完整渠道的公司,您也会对该功能的完整表现感兴趣管道,您将需要第一个解决方案。
另一方面,如果您只能承受一次生命中的特征选择+超参数优化的费用,然后仅定期对算法进行一定程度的重新训练(固定特征集和超参数值),那么性能只有这一步才是您感兴趣的,您应该选择第二个解决方案