特征选择简介

你应该使用哪些特征来创建一个预测模型

这是一个难题,可能需要对问题领域有深入的了解。

我们可以自动选择数据中最有用或与你正在处理的问题最相关的特征。这个过程被称为特征选择。

在这篇文章中,你将了解什么是特征选择、可以使用的各种方法类型,以及一个方便的清单,下次你需要为机器学习模型选择特征时可以遵循。

通过我的新书《机器学习的数据准备》来**启动你的项目**,书中包含所有示例的*分步教程*和*Python源代码*文件。

让我们开始吧。

feature selection

特征选择简介
照片由John Tann拍摄,保留部分权利

什么是特征选择

特征选择也称为变量选择或属性选择。

它是自动选择数据中的属性(例如表格数据中的列),这些属性与你正在处理的预测建模问题最相关。

特征选择……是为模型构建选择相关特征子集的过程

特征选择,维基百科词条。

特征选择不同于降维。这两种方法都旨在减少数据集中的属性数量,但降维方法通过创建属性的新组合来实现,而特征选择方法则是在不改变数据中现有属性的情况下,包含或排除它们。

降维方法的例子包括主成分分析、奇异值分解和萨蒙映射。

特征选择本身很有用,但它主要起到一个过滤器的作用,除了你现有的特征之外,还能屏蔽掉那些无用的特征。

— Robert Neuhaus,在回答“你认为特征选择在机器学习中有多大价值?”时所说

想开始学习数据准备吗?

立即参加我为期7天的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

特征选择解决的问题

特征选择方法有助于你创建准确的预测模型。它们通过选择那些只需更少数据就能获得同等或更高准确度的特征来帮助你。

特征选择方法可用于识别和移除数据中那些对预测模型准确性没有贡献,甚至可能降低模型准确性的不必要、不相关和冗余的属性。

属性越少越好,因为它降低了模型的复杂性,而一个更简单的模型更容易理解和解释。

变量选择的目标有三个:提高预测器的预测性能,提供更快、更具成本效益的预测器,以及更好地理解生成数据的底层过程。

— Guyon和Elisseeff在《变量和特征选择入门》(PDF)中

特征选择算法

特征选择算法通常分为三类:过滤法、包装法和嵌入法。

过滤法 (Filter Methods)

过滤式特征选择方法应用统计度量为每个特征打分。特征按分数排名,然后决定是保留还是从数据集中移除。这些方法通常是单变量的,独立地考虑特征,或者考虑特征与因变量的关系。

一些过滤法的例子包括卡方检验、信息增益和相关系数分数

包装法 (Wrapper Methods)

包装法将特征子集的选择视为一个搜索问题,其中不同的组合被准备、评估并与其他组合进行比较。它使用一个预测模型来评估一个特征组合,并根据模型准确性给出一个分数。

搜索过程可以是有条不紊的,如最佳优先搜索;也可以是随机的,如随机爬山算法;或者它可以使用启发式方法,如前向和后向选择来添加和删除特征。

包装法的一个例子是递归特征消除算法。

嵌入法 (Embedded Methods)

嵌入法在模型创建过程中学习哪些特征对模型的准确性贡献最大。最常见的嵌入式特征选择方法是正则化方法。

正则化方法也称为惩罚方法,它们在预测算法(如回归算法)的优化过程中引入额外的约束,使模型倾向于更低的复杂度(更少的系数)。

正则化算法的例子有LASSO、弹性网络和岭回归。

特征选择教程和实践

我们在这个博客上已经看过一些特征选择的例子。

选择特征时的一个陷阱

特征选择是应用机器学习过程中的另一个关键部分,就像模型选择一样。你不能“一劳永逸”。

将特征选择视为模型选择过程的一部分非常重要。如果你不这样做,你可能会无意中给模型引入偏差,从而导致过拟合。

……你应该在与训练[你的预测模型]不同的数据集上进行特征选择……不这样做的后果是,你将使你的训练数据过拟合。

— Ben Allison 回答“使用相同的数据进行特征选择和交叉验证是否存在偏差?

例如,当你使用交叉验证等准确性评估方法时,必须将特征选择包含在内循环中。这意味着特征选择是在模型训练之前,在准备好的折叠数据上进行的。一个错误的做法是先进行特征选择来准备数据,然后在选定的特征上进行模型选择和训练。

如果我们采用正确的程序,在每个折叠中都进行特征选择,那么在该折叠中所选特征的选择过程中就不再包含任何关于留存案例的信息。

— Dikran Marsupial 回答“在机器学习中进行交叉验证时,最终模型的特征选择

原因是选择特征的决策是基于整个训练集做出的,这些决策又会传递给模型。这可能导致某个模型因为选定的特征而比其他被测试的模型表现更好,而实际上这是一个有偏差的结果。

如果你对所有数据执行特征选择,然后进行交叉验证,那么交叉验证过程中每个折叠的测试数据也被用来选择特征,这正是导致性能分析产生偏差的原因。

— Dikran Marsupial 回答“特征选择与交叉验证

特征选择清单

Isabelle Guyon 和 Andre Elisseeff,即《变量和特征选择入门》(PDF)一文的作者,提供了一个非常好的清单,你下次为预测建模问题选择数据特征时可以使用。

我在这里重现了清单中的要点

  1. 你是否有领域知识? 如果有,构建一组更好的“ad hoc”(特设)特征。
  2. 你的特征是否可比较? 如果不是,考虑对它们进行归一化。
  3. 你是否怀疑特征之间存在相互依赖? 如果是,在你的计算机资源允许的情况下,通过构建合取特征或特征的乘积来扩展你的特征集。
  4. 你是否需要削减输入变量(例如,出于成本、速度或数据理解的原因)? 如果不需要,构建析取特征或特征的加权和。
  5. 你是否需要单独评估特征(例如,为了了解它们对系统的影响,或者因为它们的数量太大需要进行初步筛选)? 如果是,使用变量排序方法;否则,无论如何都这样做以获得基线结果。
  6. 你需要一个预测器吗? 如果不需要,停止。
  7. 你是否怀疑你的数据是“脏”的(含有一些无意义的输入模式和/或噪声输出或错误的类别标签)? 如果是,使用在步骤5中获得的顶级变量作为表示来检测异常样本;检查和/或丢弃它们。
  8. 你知道首先该尝试什么吗? 如果不知道,使用线性预测器。使用前向选择方法,以“探针”法作为停止标准,或者使用0范数嵌入方法进行比较。遵循步骤5的排序,使用不断增加的特征子集构建一系列相同性质的预测器。你能用更小的子集达到或提高性能吗?如果可以,尝试用该子集使用非线性预测器。
  9. 你有新的想法、时间、计算资源和足够多的样本吗? 如果有,比较几种特征选择方法,包括你的新想法、相关系数、后向选择和嵌入式方法。使用线性和非线性预测器。通过模型选择来选出最佳方法。
  10. 你想要一个稳定的解决方案(以提高性能和/或理解)吗? 如果是,对你的数据进行子抽样,并对多个“bootstrap”样本重复你的分析。

进一步阅读

在特定平台上需要特征选择方面的帮助吗?以下是一些可以让你快速上手的教程

要更深入地了解该主题,你可以选择一本专门的书籍,例如以下任何一本

你可能想在这篇文章中更深入地了解特征工程

掌握现代数据准备!

Data Preparation for Machine Learning

在几分钟内准备好您的机器学习数据

...只需几行python代码

在我的新电子书中探索如何实现
机器学习数据准备

它提供**自学教程**,并附有关于以下内容的**完整工作代码**:
*特征选择*、*RFE*、*数据清洗*、*数据转换*、*缩放*、*降维*,以及更多...

将现代数据准备技术引入
您的机器学习项目


查看内容

特征选择入门的224条回应

  1. Zvi Boger 2015年10月2日,上午12:05 #

    大家可以使用我发表的自动特征维度缩减算法

    Z. Boger and H. Guterman, Knowledge extraction from artificial neural networks models. Proceedings of the IEEE International Conference on Systems Man and Cybernetics, SMC’97, Orlando, Florida, Oct. 1997, pp. 3030-3035.

    或者通过 optimal@peeron.com 联系我获取论文副本。

    该算法分析了已训练模型的隐藏神经元输出的“活动”。如果一个特征对这些活动没有贡献,那么它要么在数据中是“平坦”的,要么分配给它的连接权重太小。

    在这两种情况下,它都可以被安全地丢弃,并用缩减后的维度重新训练人工神经网络。

  2. Joseph 2015年12月29日,下午2:38 #

    好文章,Jason。这篇文章让我大开眼界,我已经找了很久了。但我的挑战可能有些不同,我的数据集仍然是原始形式,包含不同的关系表。如何选择最佳特征以及如何为我的预测模型构建新矩阵是我面临的主要挑战。

    谢谢

    • Jason Brownlee 2015年12月29日,下午4:12 #

      谢谢,Joseph。

      我想知道你是否可以从关于特征工程的文章(上面已链接)中获得更多帮助?

  3. doug 2016年2月9日,下午4:22 #

    关于f/s(特征选择)的一些“主要来源”(Guyon等人)的总结非常好。

  4. bura 2016年2月9日,下午4:58 #

    你好
    我们能否对值为数值的数据集使用选择技术来找出最佳特征?

    • Jason Brownlee 2016年7月20日,上午5:27 #

      你好 bura,如果你指的是整数值,那么是的,可以。

  5. swati 2016年3月6日,晚上10:07 #

    卡方统计特征选择算法如何在数据缩减中起作用?

    • Jason Brownlee 2016年7月20日,上午5:31 #

      计算出的卡方统计量可以在过滤式选择方法中使用。

      • Poornima 2017年7月21日,下午2:40 #

        哪个是进行卡方特征选择的最佳工具?

        • Jason Brownlee 2017年7月22日,上午8:30 #

          大多数平台都支持它。

          • Poornima 2017年7月24日,下午3:36 #

            实际上,我想应用卡方检验来找出两个属性之间的独立性,从而找出它们之间的冗余。支持卡方特征选择的工具只能计算属性与类别属性之间的独立性水平。我的问题是...使用卡方检验来找出两个属性之间的独立性水平的确切公式是什么?附注:我不能使用现有工具...谢谢

          • Jason Brownlee 2017年7月25日,上午9:32 #

            抱歉,我手头没有公式。我建议查阅一本好的统计学教材或者维基百科。
            https://en.wikipedia.org/wiki/Chi-squared_test

  6. Ralf 2016年5月2日,下午5:56 #

    随机森林的特征重要性标准作为一种特征选择技术,属于哪一类?

    • Jason Brownlee 2016年7月20日,上午5:29 #

      好问题,Ralf。

      来自随机森林和梯度提升的相对特征重要性分数可以在过滤方法中使用。

      如果分数在0-1之间归一化,可以在过滤时为重要性分数指定一个截止值。

      • yerart 2019年7月25日,上午12:25 #

        嗯,Jason和Ralf,我首先会认为它们(随机森林,梯度提升)是嵌入式的,因为它们将特征选择作为算法本身的一部分来执行。然后我会想到,我可以将它们的变量重要性副产品用作分数,并结合一个截止值,在包装法特征选择中使用。但作为过滤法……为什么呢,我以为过滤法是关于使用任何其他(统计?)方法,而不是使用模型来获得分数来评估或排序一个(搜索到的或其他方式的)选定特征子集。我错了吗或者被误导了?

        • Jason Brownlee 2019年7月25日,上午7:53 #

          是的,这个区别不太清晰。

          我会将来自树集成的特征重要性分数视为一种过滤方法。

  7. swati 2016年6月23日,晚上10:58 #

    卡方特征选择算法是NP-HARD还是NP-COMPLETE?

    • Jason Brownlee 2016年7月20日,上午5:29 #

      我不确定,swati,但这重要吗?

      • Vicky 2019年9月11日,下午5:42 #

        嗨 Jason,希望你一切都好,非常感谢你的帖子。我刚开始学习特征选择。对于初学者,你有什么建议?

        • Jason Brownlee 2019年9月12日,上午5:15 #

          好问题,我推荐RFE。

          • Waqar Khan 2019年9月12日,上午11:59 #

            谢谢 Jason

  8. Mohammed AbdelAal 2016年6月26日,晚上9:53 #

    大家好,
    感谢 Jason Brownlee 这篇精彩的文章。

    我有一个小问题。在交叉验证的内循环中执行特征选择时,如果特征选择方法没有选择任何特征怎么办?我应该将所有特征都传递给分类器,还是该怎么办?

    • Jason Brownlee 2016年6月27日,上午5:42 #

      好问题。如果发生这种情况,你需要制定一个策略。选择所有特征对我来说听起来是个好办法。

  9. Dado 2016年7月19日,晚上10:20 #

    你好,Jason!

    很棒的网站和很棒的文章。不过我对特征选择方法的分类感到困惑。

    过滤方法总是进行排序吗?它们不能使用像‘序列前向选择’或‘最佳优先’这样的子集搜索策略吗?

    包装法或嵌入法不能进行排序吗?例如,当我在sklearn的‘SelectFromModel’函数中选择‘线性SVM’或“LASSO”作为估计器时,它似乎是单独检查每个特征的。文档中没有提到任何搜索策略。

    • Jason Brownlee 2016年7月20日,上午5:34 #

      好问题,Dado。

      可以使用包装法中的一种技术来创建和评估特征子集,这不属于过滤法。

      你可以在包装法中使用嵌入法,但我预计结果可能不会那么有启发性。

  10. Youssef 2016年8月9日,晚上7:09 #

    嗨,感谢大家的分享
    我有一个关于这些方法在特征数量方面的局限性的问题。在我的研究领域,我们处理的是小样本量(n=20到40)和大量特征(最多50个)。
    有些人建议做所有组合以获得高预测性能。
    你怎么看?

    • Jason Brownlee 2016年8月15日,上午11:14 #

      我认为可以尝试多种技术,看看哪种最适合你的问题。

  11. Jarking 2016年8月9日,晚上9:28 #

    嗨,我正在学习使用分层和声搜索进行特征选择,但我不知道如何
    开始?你能给我一些建议吗?

  12. L K 2016年9月3日,凌晨3:06 #

    你好,
    我想使用特征提取器来检测食品中的金属,通过幅度和相位等特征。哪种算法或滤波器最适合?

  13. laxmi k 2016年9月3日,下午2:05 #

    我想要Matlab的版本。

  14. Jaggi 2016年9月20日,上午5:53 #

    你好 Jason,

    根据我的理解,当我们谈论‘维度’时,我们实际上指的是特征或属性。维度诅咒是一种罪过,维度太多,可能达到数万,而算法不够鲁棒,无法处理如此高的维度,即特征空间。

    为了减少维度或特征,我们使用像主成分分析这样的算法。它会创建现有特征的组合,试图解释最大的方差。

    问题:既然这些成分是使用现有特征创建的,没有特征被移除,那么复杂性是如何降低的?这有什么好处?
    比如说,有10000个特征,每个成分,即PC1,将使用这10000个特征创建。特征并没有减少,而是创建了这些特征的数学组合。

    不使用PCA:再见 ~ 1*完成工作 + 1*会议 + 1*完成里程碑
    使用PCA:再见 ~ PC1
    PC1=0.7*完成工作 + 0.2*会议 +0.4*完成里程碑

    • Jason Brownlee 2016年9月20日,上午8:37 #

      是的,Jaggi,特征就是维度。

      我们正在压缩特征空间,一些信息(我们认为我们不需要的)可能/会被丢失。

      从线性代数的角度来看,你的观点很有趣,但机器学习算法在特征空间中通常是朴素的。另一方面,深度学习可能不同,它有特征学习。隐藏层可能在开始工作前做了一些类似PCA的事情。

  15. sai 2016年11月13日,晚上11:43 #

    在特征选择领域攻读博士学位有前途吗?

    • Jason Brownlee 2016年11月14日,上午7:43 #

      也许有,Sai,我建议你和你的导师谈谈。

  16. Poornima 2016年12月6日,下午6:29 #

    在文本挖掘或更具体的情感分析中,最佳的特征选择策略是什么?特征向量的大小约为28,000!

    • Jason Brownlee 2016年12月7日,上午8:55 #

      抱歉 Poornima,我不知道。我还没有对自然语言处理中的特征选择做过研究。

  17. Lekan 2016年12月22日,上午6:31 #

    我们在特征选择中可以使用多少个变量或特征?我正在使用布谷鸟搜索算法进行特征选择,以预测学生的学业表现。请您帮忙,先生。

    • Jason Brownlee 2016年12月22日,上午6:39 #

      除了你的硬件或工具的限制之外,没有其他限制。

  18. Arun 2017年1月11日,凌晨2:21 #

    你能给一些使用森林优化算法进行特征选择的Java示例代码吗?

  19. Amina 2017年2月17日,凌晨4:07 #

    请问综合度量特征选择也是特征选择方法的一部分吗?

    • Jason Brownlee 2017年2月17日,上午10:01 #

      嗨 Amina,我没听说过“综合度量特征选择”,但听起来像是一种特征选择方法。

  20. Birendra 2017年2月28日,晚上10:06 #

    嗨,Jason,
    我是机器学习新手。我将sklearn中的RFE应用到了SVM的非线性核上。
    它给我报错了。有什么办法可以减少数据集中的特征吗?

    • Jason Brownlee 2017年3月1日,上午8:37 #

      是的,这篇文章描述了多种减少数据集中特征数量的方法。

      你具体遇到了什么错误?你使用的是哪个平台?

  21. Abdel 2017年4月6日,上午6:37 #

    嗨,Jason,

    在预测问题中,这些方法中哪一个是最好的?

    LASSO方法对这类问题是否很好?

    • Jason Brownlee 2017年4月9日,下午2:37 #

      我建议你尝试一套方法,看看哪种最适合你的问题。

  22. Al 2017年4月26日,下午6:05 #

    很棒的文章,Jason,非常感谢这篇帮助我更多地了解特征选择的文章。

    例如,如果我已经运行了下面的代码进行特征选择

    test = SelectKBest(score_func=chi2, k=4)
    fit = test.fit(X_train, y_train.ravel())

    我该如何将其输入到我的KNN模型中?是否只是简单地

    knn = KNeighborsClassifier()
    knn.fit(fit) – 这里是特征选择起作用的地方吗?
    KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
    metric_params=None, n_jobs=1, n_neighbors=5, p=2,
    weights='uniform')
    predicted = knn.predict(X_test)

  23. Nisha t m 2017年5月14日,凌晨2:21 #

    先生,
    我有多个数据集。我想对每个子集执行LASSO回归进行特征选择。我如何得到[0,1]向量集作为输出?

  24. Simone 2017年5月30日,下午6:51 #

    好文章!

    如果我没理解错第8步,一个好的流程是*先*应用线性预测器,然后再用之前找到的特征来使用非线性预测器。这样对吗?

    • Jason Brownlee 2017年6月2日,下午12:34 #

      在原始和选定特征上尝试线性和非线性算法,并加倍投入于效果最好的方法。

  25. akram 2017年6月10日,上午6:03 #

    你好 Jason Brownlee,谢谢你的这篇文章,
    我正在研究入侵检测系统(IDS),我想请你给我一些关于最佳特征选择算法的建议,以及为什么?
    提前感谢。

  26. karthika 2017年7月28日,下午6:43 #

    请告诉我特征选择算法的评估指标

    • Jason Brownlee 2017年7月29日,上午8:10 #

      最终是模型进行预测的能力。

      毕竟,这才是我们项目的目标!

  27. Swati 2017年7月31日,凌晨4:19 #

    嗨!

    我有一组大约300万个特征。我想应用LASSO进行特征选择/降维。我该怎么做?我正在使用MATLAB。

  28. Elakkiya 2017年9月5日,晚上8:45 #

    嗨..
    我需要你的一些建议。假设我有3个特征集和3个模型。例如f1, f2, f3集。每个集在百分比上产生不同的输出结果。我需要分配权重来对特征集进行排名。有没有什么数学方法可以根据三个模型的输出来给特征集分配权重?

    • Jason Brownlee 2017年9月7日,下午12:44 #

      是的,这正是线性机器学习算法所做的,比如回归算法。

      • Elakkiya 2017年9月8日,下午3:39 #

        谢谢你。不过,要弄清楚回归算法如何有助于分配权重还是有些困难。你能推荐一些阅读材料或链接吗?

  29. Marie J 2017年10月4日,上午5:18 #

    嗨,Jason!谢谢你的文章——过去几周你教了我很多东西。🙂

    一个小问题——根据你的经验,训练模型的最佳样本量是多少?我的数据集中有290个特征和大约500行数据。这被认为是足够的吗?还是说经验法则是试一试,看看它的表现如何?

    非常感谢!

  30. gene 2017年10月18日,下午6:02 #

    你好 Jason,

    我仍然对你关于将特征选择与模型选择集成的观点感到困惑。根据你建议的第一个链接,建议是取出一部分训练集来进行特征选择。然后在训练集中剩余的数据上开始模型选择。

    • Jason Brownlee 2017年10月19日,上午5:34 #

      请看这篇关于训练/测试/验证集差异的文章
      https://machinelearning.org.cn/difference-test-validation-datasets/

      这有帮助吗?

      • gene 2017年10月22日,上午12:18 #

        是的,谢谢你的这篇文章。
        但在实践中,在使用 scikit-learn 的 GridSearchCV 时,有什么方法可以将特征选择集成到模型选择中吗?

          • Sara 2019年5月9日,上午11:05 #

            嗨,Jason,谢谢你,过去几周我从你的文章中学到了很多。

            我想将特征选择集成到模型选择中,正如你所说,“将特征选择视为模型选择过程的一部分非常重要。”
            我尝试使用你上面推荐的scikit-learn Pipeline。然而,pipeline就像一个黑匣子,我无法跟踪它在做什么。

            我正在尝试将特征选择(RFECV)作为循环集成到模型选择(gridsearchCV)中,如下所示

            param_grid = [{'estimator__C': [0.01, 0.1, 1, 10.0, 100, 1000]}]
            F1 = RFECV(estimator=svm.SVR(kernel="linear"), step=1)
            M1 = GridSearchCV(estimator=F1, param_grid, cv=5)
            M1.fit(X_train, y_train)
            print(M1.best_params_)
            print(M1.best_score_)
            print(M1.best_estimator_)

            这段代码不会报错,但是,这是一种正确的进行特征选择和模型选择的方式吗?

          • Jason Brownlee 2019年5月9日,下午2:08 #

            嗯,我觉得交叉验证用得太多了,除非你有大量数据。

            一个好的管道可能是 [[数据准备] + [算法]],然后对整个流程应用网格搜索交叉验证。

          • Sara 2019年5月10日,上午6:43 #

            我将网格搜索CV应用到一个管道中,结果出错了。

            如果你能看看下面的错误,那就太好了

            pipeline1 = Pipeline([ ('feature_selection',SelectFromModel(svm.SVC(kernel='linear'))),
            ('filter' , SelectKBest(k=11)),
            ('classification' , svm.SVC(kernel='linear'))
            ])
            gridparams = [{'C': [0.01, 0.1, 1, 10, 100, 1000]}]
            model = GridSearchCV(pipeline1, gridparams, cv=5)
            model.fit(X, y)

            然而它给出了这个错误
            ValueError: Invalid parameter estimator for estimator Pipeline(memory=None,
            steps=[('feature_union', FeatureUnion(n_jobs=None,
            transformer_list=[('filter', SelectKBest(k='all', score_func=)), ('feature_selection', SelectFromModel(estimator=SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
            decision_function_shape='ovr...r', max_iter=-1, probability=False, random_state=None,
            shrinking=True, tol=0.001, verbose=False))]). 请使用 `estimator.get_params().keys()` 检查可用参数列表。

          • Jason Brownlee 2019年5月10日,上午8:21 #

            抱歉,我没有能力调试你的示例。

            我在这里有一些建议
            https://machinelearning.org.cn/faq/single-faq/can-you-read-review-or-debug-my-code

          • yerart 2019年7月25日,上午5:04 #

            嗯,Sara,Jason,我做到了 :)

            也许Sara过了这么久已经解决了这个问题。

            首先,我成功复现了这个错误,对吧?当时我很困惑,因为我固执地遵循了手册(我是说,特别是Jason的指南 https://machinelearning.org.cn/automate-machine-learning-workflows-pipelines-python-scikit-learn/ 以及scikit-learn关于Pipeline, GridearchCV, SVC, SelectFormModel的文档)。但是当进行fit时……同样的错误出现了。

            所以像往常一样,我变得好奇起来,经过两个小时(是的,好吧,我自己也是scikit-learn和Python的新手)……我搞明白了!我忍不住要提醒大家仔细阅读错误信息的重要性。当我这么做时,我在流水线估计器上运行了 estimator.get_params().keys(),发现参数有全名。是的。这很重要,我会向你展示。

            Sara,你在包装器特征选择和分类任务中使用了相同的估计器,即SVC(顺便说一下,这需要很长时间来拟合)。它们都有一个C超参数。所以当你定义你的参数网格并命名超参数为'C'时......你是在告诉GridSearchCV迭代哪个C?是包装器阶段使用的估计器的C,还是流水线分类阶段的C?这正是GridSearchCV在拟合时遇到的未解决的问题,也是导致错误的原因。

            所以Sara需要做的是运行model..get_params().keys(),找到以“__C”结尾的参数名称,选择她想要的那个参数的全名,并在参数网格定义中更改名称。

            不客气 😉

            附言:这是我的尝试

          • Jason Brownlee 2019年7月25日,上午7:59 #

            令人印象深刻,感谢分享!

  31. gene 2017年11月12日,上午8:32 #

    又是我!
    我的特征空间有超过8000个属性。在应用RFE时,我该如何选择合适的特征数量?通过构建多个分类器(NB, SVM, DT),每个分类器都返回不同的结果。

    • Jason Brownlee 2017年11月12日,上午9:11 #

      没有一个最佳的集合,也没有一个最佳的模型,只有很多选项供你比较。这就是应用机器学习的工作。

      尝试用每个集合构建一个模型,看看哪个在未见数据上表现更好。

      • gene 2017年11月12日,晚上7:44 #

        我想发表我的研究结果。报告说每个模型我使用了不同的特征集和不同数量的顶级特征,这样可以吗?

        • Jason Brownlee 2017年11月13日,上午10:13 #

          在报告结果时,你应该提供足够的信息,以便其他人可以复现你的结果。

  32. gene 2017年11月13日,下午6:44 #

    是的,我明白,但我的意思是这个结果看起来合理吗?

  33. Hardik Sahi 2018年1月8日,下午12:12 #


    我在交叉验证步骤中应用特征选择这部分有点困惑。
    我明白我们应该在不同于我们用来训练模型的数据集上执行特征选择 [我们称之为 FS 集]。[称之为训练集]。

    我理解以下步骤
    1) 在 FS 集上执行特征选择。
    2) 将上述选定的特征用于训练集,并拟合所需的模型,如逻辑回归模型。
    3) 现在,我们想在未见过的数据上评估上述拟合模型的性能 [样本外数据,因此执行 CV]

    对于CV阶段的每个折叠,我们有trainSet和ValidSet。现在我必须再次为每个折叠执行特征选择[& 得到可能与步骤1中选择的特征相同/不同的特征]。为此,我必须再次在不同于trainSet和ValidSet的数据集上执行特征选择。

    对所有k个折叠执行此操作,并将准确率平均,以获得步骤2中预测模型的样本外准确率。

    我对于CV的样本外准确率如何作为步骤2中模型泛化准确率的指标存有疑问。很明显,两个步骤中使用的特征集将是不同的。

    另外,一旦我从步骤2中得到一个选择了m<p个特征的模型。我将如何在全新的数据[TestData]上测试它?(TestData有p个特征,而模型是在有m个特征的数据上训练的。剩下的p-m个特征怎么办?)

    谢谢

    • Jason Brownlee 2018年1月8日,下午3:54 #

      一个简单的方法是使用训练数据进行特征选择。

      我建议将训练数据分为训练集和验证集。在每个CV折叠内(自动)执行特征选择。

      一旦你选定了最终的模型+流程,就在训练数据集上进行拟合,并使用验证数据集作为健全性检查。

  34. Molood 2018年3月9日,上午8:07 #

    谢谢你 Jason 的文章,非常有帮助!我正在处理一组数据,我需要在这些变量中找到一个商业策略。你提到的这些方法中有没有无监督的?我的数据集没有目标标签。如果有无监督的机器学习方法,你是否知道在github或任何代码库中有现成的代码?

  35. Rag 2018年3月15日,下午5:24 #

    先生,有没有什么方法可以找到神经网络的特征重要性度量?

    • Jason Brownlee 2018年3月16日,上午6:10 #

      可能有,抱歉我不太了解。试试在谷歌学术上搜索。

  36. Yosra 2018年3月22日,凌晨4:35 #

    感谢您这篇有帮助的介绍。不过,您有使用粒子群优化进行特征选择的代码吗?

    • Yosra 2018年3月22日,凌晨4:36 #

      使用 R 语言的代码

    • Jason Brownlee 2018年3月22日,上午6:26 #

      抱歉,我没有。

  37. Satya 2018年3月28日,凌晨1:20 #

    早上好,Jason,
    一篇非常好的文章。我有一个小问题。请帮我解答一下。我正在使用网上找到的用于梯度下降的R代码。数据集‘women’是R的一个数据集,只有15个数据点。我是这样调用梯度下降的。

    n = length(women[,1])
    x = women[,1]
    y = women[,2]

    gradientDesc(x, y, 0.00045, 0.0000001, n, 25000000)

    它需要这么多次迭代才能收敛,而且学习率这么小。对于任何更高的学习率它都无法收敛。我也尝试过使用特征缩放(单个特征),如下所示,但也没有帮助——在单个特征的情况下,缩放可能并不真正适用。

    x = (women[,1] – mean(women[,1]))/max(women[,1])

    非常感谢任何帮助

    谢谢
    Satya

    • Jason Brownlee 2018年3月28日 at 6:28 am #

      也许可以问问写代码的人,它是如何工作的?

  38. Satya 2018年3月28日 at 1:22 am #

    顺便说一下,0.00045是学习率,0.0000001是阈值。

  39. Sara 2018年4月21日 at 12:57 pm #

    你好,
    可以说PCA不仅是一种降维方法,也是一种特征缩减过程,因为在PCA中,载荷较低的特征应该从主成分中排除吗?

    • Jason Brownlee 2018年4月22日 at 5:56 am #

      是的,我们可以将降维和特征缩减视为同义词。

    • yerart 2019年7月25日 at 8:43 pm #

      Jason使用“同义词”是正确的。像往常一样,关键在于细节。到目前为止我学到的是,PCA有一个小问题,那就是“可解释性”。你会得到一些新特征(有人会称之为特征提取),理想情况下比原始特征的数量少得多。这些新特征是原始特征以特殊方式加权的(线性)组合。所以,如果你真的有(深入的)领域知识,那么你可以赋予这些新特征意义,并希望能够解释模型使用它们产生的结果。而使用特征选择方法(过滤式、包裹式、嵌入式或其组合),你会得到一个排序列表或一个理想情况下重要且非冗余的原始特征子集,你可以在模型中使用它们时进行解释(即使你只有浅显的领域知识,也可以通过阅读数据集元数据描述来解释)。

      我曾在气象数据集(气候/天气)中看到PCA主成分非常有意义。但比如说基因组学呢?哇哦🙂

      附言:有一些方法可以在“主成分”内部找到一些意义,这涉及到像双标图和载荷这些我目前还不懂的可怕东西(也不知道我是否会懂……)

      • Jason Brownlee 2019年7月26日 at 8:22 am #

        几乎所有情况下,这些特征都是不可解释的,最好将它们视为一种旨在帮助模型更好地学习映射问题结构的投影。

  40. Sarah 2018年6月11日 at 6:39 am #

    嗨,Jason,

    很棒且有用的文章——谢谢你!!

    我一直在对我的数据进行弹性网络和梯度提升机分析。这些都是特征选择的方法,对吗?那么,是否应该选择那些显著或最具影响力的预测变量,并将它们作为新的弹性网络或梯度提升模型中唯一的预测变量?

    • Sarah 2018年6月11日 at 6:57 am #

      另外,glmnet找到的显著特征远少于gbm。我应该只依赖于更保守的glmnet吗?谢谢!

      • Jason Brownlee 2018年6月11日 at 1:50 pm #

        总的来说,更简单的模型是首选。它们更容易理解、解释,并且通常更不容易过拟合。

    • Jason Brownlee 2018年6月11日 at 1:49 pm #

      通常,我建议在你的问题上测试一套方法,以发现哪种方法效果最好。

      • Sarah Paul 2018年6月12日 at 8:59 am #

        谢谢你的回答!
        但是,我应该使用最具影响力的预测变量(通过glmnet或gbm等找到的)作为新的glmnet或gbm(或决策树、随机森林等)模型中唯一的预测变量吗?这似乎并没有提高我的准确率。并且/或者,将它们用作非机器学习统计分析(例如,多项式回归)的输入是否可取?
        再次感谢您!

        • Jason Brownlee 2018年6月12日 at 2:26 pm #

          理想情况下,你只想使用构建一个有效模型所需的变量。

          试试建议的参数,并将拟合模型的性能与在所有参数上训练的模型的性能进行比较。

  41. Pratik 2018年6月14日 at 4:59 pm #

    嗨,Jason,感谢这篇精彩的文章!!

    我需要找出特定特征集与类别标签之间的相关性。是否可以找出所有特征仅相对于类别标签的相关性?

  42. Anthony The Koala 2018年6月27日 at 8:46 pm #

    尊敬的Jason博士,
    能否请您区分一下用于预测建模的特征选择(以减少因子)和用于提高执行和计算速度的卷积神经网络(CNN)剪枝。
    谢谢你,
    悉尼的Anthony

    • Jason Brownlee 2018年6月28日 at 6:18 am #

      什么是“剪枝CNNs”?

      • Anthony The Koala 2018年6月28日 at 11:50 am #

        据我理解,剪枝CNNs或剪枝卷积神经网络是一种减小CNN大小的方法,以使CNN更小、计算更快。剪枝CNN背后的思想是移除对最终CNN输出贡献很小的节点。每个节点都被分配一个权重并进行排序。

        那些权重很小的节点被消除。结果是一个更小的CNN,计算速度更快。然而,在将实际物体与存储的CNN匹配的准确性方面存在权衡。软件和论文表明,剪枝的方法不止一种。

        例如 1 https://tensorflowcn.cn/api_docs/python/tf/contrib/model_pruning/Pruning

        例如 2 在keras中的实现, https://www.reddit.com/r/MachineLearning/comments/6vmnp6/p_kerassurgeon_pruning_keras_models_in_python/

        例如 3 一篇论文 https://arxiv.org/abs/1611.06440 这不是唯一关于剪枝的论文。

        剪枝CNNs和您的(这篇)文章之间有什么关联?答案是:剪枝CNNs涉及移除CNN的冗余节点,而像Weka中那样对模型中的变量进行剪枝https://machinelearning.org.cn/feature-selection-to-improve-accuracy-and-decrease-training-time/ 减少了您希望预测的模型中的变量数量。

        是的,它们是完全不同的话题,但其思想是(i)减少计算量,(ii)简约性。

        谢谢你,
        悉尼的Anthony

        • Jason Brownlee 2018年6月28日 at 2:10 pm #

          我明白了,就像90年代的经典神经网络剪枝一样。

          剪枝作用于已学习的模型,无论其形状或形式如何。特征选择作用于模型的输入。

          这就是区别,模型和输入数据。

          它们都在降低复杂性,但方式不同,一个是“一个已经学习到的映射”,另一个是“什么可以被映射”到输出。一个是在映射的假设空间的一个小区域内进行调整,另一个是限制正在搜索的假设空间。

  43. Ellen 2018年7月17日 at 3:36 am #

    嗨,Jason。我发现您的文章真的很有帮助。我有一个与特征选择高度相关但又不完全相同的问题。我的特征之间存在相关性,我认为如果我应用标准的特征选择方法,会导致一些特征因为与一个被选中的特征相关而获得较小的权重/重要性,从而显得冗余。但我想知道您是否有什么建议的方法,能够考虑到特征相关性,并为高度相关的特征分配相对相等的权重/重要性?

    • Jason Brownlee 2018年7月17日 at 6:20 am #

      决策树的集成方法很擅长处理不相关的特征,例如梯度提升机和随机森林。

      • Yanda Jiang 2020年4月17日 at 8:06 am #

        嗨,Jason,

        我很好奇,像随机森林这样的集成学习的特征选择,是在建树之前完成,还是在每次节点分裂时进行?换句话说,我想知道在整个过程中是否所有的特征都会被用于决策树,还是只使用那些事先选择好的特征?

        非常感谢

        • Jason Brownlee 2020年4月17日 at 1:28 pm #

          好问题。

          像随机森林和装袋树这样的决策树集成方法,其创建方式使得结果是一组只对与做出预测最相关的特征做决策的树——这是一种在模型构建过程中自动进行的特征选择。

  44. Chris 2018年8月7日 at 10:26 am #

    写得很好。我发现,在我的数据中,最重要的特征(Boruta和递归特征消除法)往往具有最低的相关系数,反之亦然。您能解释一下这是怎么回事吗?

    • Jason Brownlee 2018年8月7日 at 2:31 pm #

      谢谢。

      很难说,也许是您数据集的一个特殊之处?

  45. Harsh 2018年8月16日 at 2:51 pm #

    好文章,真的很有帮助

    你写道,不经意间给你的模型引入了偏差,这可能导致过拟合。但是高偏差模型主要会欠拟合训练数据。

    如果我说错了请纠正我

    • Jason Brownlee 2018年8月17日 at 6:24 am #

      您能详细说明一下我“不经意间写了”什么吗?

  46. Guru 2018年10月18日 at 11:37 pm #

    嗨,Jason,关于下面的陈述我有一个疑问

    “将特征选择视为模型选择过程的一部分非常重要。如果你不这样做,你可能会无意中给你的模型引入偏差,从而导致过拟合。”

    如果我们的模型有偏差,那么它应该会欠拟合,我只是想理解上面这句话,偏差是如何导致过拟合的。

    • Jason Brownlee 2018年10月19日 at 6:05 am #

      不,偏差也可能导致过拟合。偏差就像是对方差的一个限制,其方向可能是有益的,也可能是有害的。

      使用测试集和训练数据集一起训练模型是一种有益的偏差,它会让你的模型表现更好,但任何对测试集的评估都会变得不那么有用——这是数据泄露的一个极端例子。更多信息在这里:
      https://machinelearning.org.cn/data-leakage-machine-learning/

  47. Yoshitaka <在使用 RandomForest 和 Scikit-learn 的特征选择以及 XGBoost 的特征重要性方法时,你如何确定截止值?date">2018年11月21日 at 5:38 pm #

    在使用Scikit-learn的RandomForest和XGBoost的特征重要性方法进行特征选择时,您如何确定截断值?

    我只是凭经验,凭感觉选择。
    我认为使用网格搜索或其他优化方法会更好。

    • Jason Brownlee 2018年11月22日 at 6:22 am #

      通过反复试验,选择能产生最有效模型的截断值。

  48. cnRZcn 2018年12月17日 at 12:28 am #

    我们如何组合不同的特征向量(特征加权)?如果我们从图像中获得了两个或三个不同大小的特征向量,我们如何组合这些特征?

  49. Jasio Zauha 2018年12月19日 at 3:03 am #

    嗨,Jason,

    这是一篇写得很好且简明扼要的文章。如果我试图预测将A更改为B所带来的效应大小,您会推荐什么方法:我应该输入两个特征数组,一个用于A,另一个用于B,还是应该提供一个差异数组(A-B)或类似的东西?

    • Jason Brownlee 2018年12月19日 at 6:37 am #

      也许可以尝试进行敏感性分析,改变A的值来观察对B的影响。

  50. Win Pa Pa San 2019年1月24日 at 3:27 am #

    亲爱的Jason;
    感谢您解释回归和分类之间的区别,让我能够理解。

  51. Sufyan Danish 2019年2月13日 at 1:37 am #

    您好,先生,希望您一切安好……

    请指导我如何在weka中使用主成分分析...
    我知道如何应用PCA,但应用之后我不知道如何使用、处理、保存数据,以及如何将它提供给机器学习算法。

  52. Sangeeth 2019年3月3日 at 5:30 am #

    嗨,感谢您的这篇文章。用于提取输入空间基本动态的塔肯斯嵌入定理(Taken's Embedding Theorem)是一种过滤方法吗?谢谢。

    • Jason Brownlee 2019年3月3日 at 8:04 am #

      好问题!

      不,它与此相关,但它可能是“特征提取”或“投影”。

  53. Avijit 2019年3月21日 at 1:07 am #

    先生,您能用一个例子讨论一下“混合特征选择(HFS-SVM)”吗?这将是很大的帮助。

    • Jason Brownlee 2019年3月21日 at 8:17 am #

      感谢您的建议。

      混合特征选择(HFS-SVM)究竟是什么?

      • Avijit 2019年3月22日 at 1:05 am #

        多种特征选择技术的混合。

        • Jason Brownlee 2019年3月22日 at 8:30 am #

          好的,谢谢。

          • Avijit 2019年3月22日 at 10:46 pm #

            也谢谢你

  54. Saeed Ahmed 2019年3月25日 at 3:49 pm #

    是否有可能在每一折(fold)上应用特征选择算法,并且在每一折都选择不同的属性?所以我的问题是,我们能基于这种特征来训练模型吗?

    • Jason Brownlee 2019年3月26日 at 8:00 am #

      在这种情况下,你是在测试方法论,而不是具体选择的特征。这是一个好方法。

  55. Saeed Ahmed 2019年3月26日 at 11:23 am #

    如果我使用SVM分类器,那么会有两个困惑。第一个是,如果我们在每个折叠(Fold)上应用特征选择算法,它可能会在每个折叠上选择不同的特征,那么如何找到优化的c和g值呢?因为折叠1的数据可能与折叠2的数据不同,以此类推。第二个是,如果在每个折叠中选择了不同的特征,那么当我们在未见过的数据或独立数据上测试最终模型时,应该从独立数据中选择哪些特征呢?

    • Jason Brownlee 2019年3月26日 at 2:18 pm #

      通常,交叉验证(CV)过程测试的是选择特征/调优的程序,而不是特定的特征集/配置——但如果你愿意,也可以通过取各折的平均值来以后者的方式使用它。

  56. Shehwar 2019年3月27日 at 10:03 pm #

    很棒的教程!

    我是一名计算机科学学士学生,正在尝试探索Keras和Tensorflow。我的问题是,在制作KERAS CNN分类模型时,我们如何知道在训练中选择了哪些特征?

    • Jason Brownlee 2019年3月28日 at 8:13 am #

      好问题,答案是选择的特征会带来性能更好的模型。

      你必须发现哪些特征能带来性能最好的模型,以及使用哪个模型,什么数据等等。这就是应用机器学习的挑战。

  57. Gary 2019年4月10日 at 6:55 pm #

    你好,

    对于用一个特征子集来查询一个有10个特征的模型,有什么推荐的方法/最佳实践吗?

    比如说我创建了一个有10个特征的模型,但之后我想只用5个特征来进行预测。

    有没有最适合这个用例的模型?

    我试过线性分类器,但它需要全部10个特征。

    你可以为这5个特征添加真实值,但为未知的特征添加中位数/平均值,但这些仍然是值。

    有什么建议吗?

    谢谢 & 此致,

    Gary

    • Jason Brownlee 2019年4月11日 at 6:33 am #

      也许你可以使用一个支持缺失值或在缺失值上使用掩码的模型?

      也许可以训练模型以期望有时出现0(例如随机缺失值)?然后为缺失值提供0值?

      或许可以尝试用插补值来训练模型处理缺失值,做法和上面一样?

      发挥创意,多尝试!告诉我你的进展。

  58. Ellie 2019年4月18日 at 7:15 am #

    您好,Jason,感谢您发布非常有用的信息。
    我有两个问题。
    如果我们使用一个数据集比较不同的特征选择方法,而我们选择最佳方法的衡量标准之一是所选特征集的稳健性,那么我们是否可以通过在外部测试集上测试所建模型,并比较训练准确率与测试准确率,来看我们是否仍能在外部测试集上获得良好的准确率?

    如果我用这种方法来衡量特征选择方法所选特征的稳健性是正确的,那么对于PCA,我该怎么做呢?我应该为所有数据点(包括外部数据集)创建主成分吗?但这似乎不正确。

    感谢您的帮助,
    Ellie

  59. ZH 2019年5月3日 at 3:17 am #

    嗨,Jeson,感谢这篇很棒的文章!
    您在文章中说的一句话让我感到困惑:
    “一个错误的做法是,先进行特征选择来准备你的数据,然后在选择的特征上进行模型选择和训练。”
    我原以为先进行特征选择,然后在选择的特征上进行模型选择和训练,这种方法被称为基于过滤器的特征选择方法。
    – 那么为什么这是一个错误?
    – 使用仅依赖于数据集且与分类器无关的过滤式方法是一个错误吗?

    -“在使用交叉验证和网格搜索进行模型选择时,将特征选择包含在内循环中”,意思是我们在创建模型的同时进行特征选择,这是否被称为嵌入式方法?

    • Jason Brownlee 2019年5月3日 at 6:22 am #

      这会导致数据泄露。
      https://machinelearning.org.cn/data-leakage-machine-learning/

      • yerart 2019年7月25日 at 5:56 am #

        Jason,我读过你关于数据泄露的文章。那篇文章很好。我想我理解了这个概念以及使用管道来避免数据泄露的必要性。但我认为ZH的问题对我来说仍然存在。如果这是一个愚蠢的问题,请原谅,我只是个初学者。

        据我理解,过滤式特征选择方法在工作流程的下游是模型中立的。所以,比如说,在特定情境下,如果我想使用卡方检验、f_classif或互信息进行特征选择(在scikit-learn中称为过滤式或单变量方法)作为数据准备步骤...为什么我应该将它放在一个管道中,然后对这个管道进行交叉验证以进行模型选择或超参数优化,而不是事先“独立地”进行呢?这是否与我在特征选择阶段应用的“知识”以某种方式泄露到模型选择/超参数优化阶段有关?

        还有一个关于数据集清洗阶段的相关问题,即检测并移除或填补NA值和异常值。比如,我有一个像你在几篇文章中使用的皮马印第安人糖尿病数据集。根据你从哪里获得的版本(R中的mlbench包里两个都有),它可能含有NA值或异常值。我可以在数据准备阶段移除和填补异常值。我需要把这个过程也放进管道里吗?这个阶段会产生数据泄露吗?还是说,在进行机器学习准备(特征选择等)和任务(分类等)之前,将数据清洗作为一个独立的步骤来做是可以的?

        • Jason Brownlee 2019年7月25日 at 8:03 am #

          很棒的讨论。

          是的,使用所有数据来选择特征会将测试集的信息泄露给训练集。

          在交叉验证的每一折(fold)内进行特征选择,可以把这部分知识包含在内,并且测试的是数据准备和模型拟合的“整个流程”,而不仅仅是模型拟合。

          理想情况下,所有基于模型的数据准备过程都应该以这种方式进行。发现缺失值(NAs)不属于这种情况,因为它不涉及知识。但如果用均值来填补缺失值,则需要使用在每一折的训练集上计算出的均值。

          • yerart 2019年7月27日 at 11:38 pm #

            好的,太棒了!是的,插补是一种潜在的泄露。再想一想,如果数据清理任务是删除带有异常值的样本,而不是插补值呢?我想到的是皮马印第安人数据库,它的一些特征有异常值。其中一些特征的异常值(零值)可能会被删除,因为它们只占少数样本。值得注意的是,删除操作对(目标)阴性/阳性(糖尿病)子样本的影响是不同的(在数量上)。在数据分割之前对整个数据进行这种操作会泄露信息吗?

          • Jason Brownlee 2019年7月28日 at 6:47 am #

            理论上是的。

            你需要一个只在训练集上操作的程序/知识。交叉验证测试的是数据准备+拟合的整个过程。

            在某些情况下,知识可能对领域是通用的——例如,这一列中的0总是意味着……

    • Pranav Kamat 2019年9月8日 at 2:37 am #

      嗨,Jason,
      我是机器学习的初学者。
      目前我正在处理一个回归问题。它包含很多分类变量。

      对于分类变量,我应该使用哪种技术进行特征选择?
      我谷歌了,也上Kaggle查了,绞尽脑汁也没找到合适的答案。

      顺便说一下,我对分类变量使用了标签编码。

      • Jason Brownlee 2019年9月8日 at 5:19 am #

        好问题。

        卡方检验是一个不错的开始。
        https://machinelearning.org.cn/chi-squared-test-for-machine-learning/

        我想scikit-learn支持它。

        • Pranav Kamat 2019年9月8日 at 12:10 pm #

          Jason,据我所读,卡方检验可以用于分类预测变量和分类目标变量之间。

          但在回归问题中,我有分类预测变量,但目标变量是连续的。

          这就是我对应用卡方检验有疑问的地方????

          请多包涵,因为我是个新手????

          提前感谢

          • Jason Brownlee 2019年9月9日 at 5:11 am #

            好问题,我一下子也说不准,可能需要一些研究和实验。

            告诉我进展如何。

  60. Cathy 2019年7月13日 at 1:39 am #

    你好,我在我的项目中实施了自编码器,AUC提高了1%。其他的性能指标也略有提高。然而,在使用基于自编码器的SVM模型和一个使用原始完整特征的SVM模型对一个新的独立数据集进行预测时,两者之间存在很大的差异。我不知道哪里出了问题。对这个结果有什么可能的解释吗?

    • Jason Brownlee 2019年7月13日 at 6:58 am #

      一下子说不准,你可能需要调试模型的不同部分。

  61. Bushra 2019年7月27日 at 4:16 am #

    晚上好,博士。

    我想问一下如何使用机器学习来加密明文。

    我需要实现这个的步骤,拜托了。
    以及机器学习会比加密算法增加什么。

    我将满怀热情地等待您的回答。

    • Jason Brownlee 2019年7月27日 at 6:13 am #

      我不知道,抱歉。密码学不是我的专业领域。

  62. Leo 2019年10月12日 at 12:38 am #

    谢谢你的文章,Jason。
    根据我的理解,如果我没说错的话,包裹式方法是启发式的。那么,说它们不是最优的,因为它们没有测试特征幂集中的所有组合,这样说安全吗?

  63. Deepthi 2019年12月9日 at 6:50 pm #

    嗨,Jason,
    我有个疑问,在使用嵌入式方法选择特征后,我还需要在分类模型上训练数据吗?您能给我解释一下吗?

    • Jason Brownlee 2019年12月10日 at 7:29 am #

      你说的用嵌入方法选择特征是什么意思?

  64. Deepthi 2019年12月10日 at 4:42 pm #

    使用L1正则化或树模型选择特征。

    • Jason Brownlee 2019年12月11日 at 6:48 am #

      你具体指的是什么?

      • Deepthi 2019年12月11日 at 4:07 pm #

        假设我的数据集中有100个特征,经过统计预处理(填充缺失值、移除常数和低变异特征)后,我们需要选择最相关的特征来构建模型(特征缩减和选择)。如果我使用决策树分类器/Lasso回归来选择最佳特征,我还需要用选定的特征来训练决策树模型/Lasso吗?

        • Jason Brownlee 2019年12月12日 at 6:08 am #

          是的。

          最好是测试不同的“好”特征子集,以找到与你所选模型配合得最好的那个子集。

  65. Sarang 2019年12月11日 at 6:50 am #

    嗨,Jason,

    我正在创建一个涉及电影演员阵容的预测模型。我对每部电影的演员列表进行了独热编码(one-hot encoding)。

    这样做之后,即使是一个小到只有2000个数据点的数据集,也会生成长度超过6000的向量。用PCA来降维是正确的方法吗?

    当我尝试拟合PCA时,它仍然显示需要大约1500个主成分才能覆盖数据集0.7的方差。

  66. Hamed 2020年1月2日 at 3:25 pm #

    嗨,Jason,

    我有一个包含10个特征的数据集。
    其中6个的范围在1到10之间,另外4个在2500到52000之间。
    我尝试进行特征选择,但当我在特征选择前使用归一化时,得到的结果与不使用归一化时不同。
    我也读了几个教程,但没有一个明确提到在特征选择前我是否需要归一化。
    例如,在下面的教程中,特征范围差异很大,但作者没有使用归一化。
    https://towardsdatascience.com/feature-selection-techniques-in-machine-learning-with-python-f24e7da3f36e

    在我看来,我认为在我的情况下,我应该在特征选择之前使用归一化;如果您能告诉我您的想法,我将不胜感激。

    谢谢

    • Jason Brownlee 2020年1月3日 at 7:14 am #

      试试看,如果它能带来一个更有效的模型,就用它。

      • Hamed 2020年1月3日 at 4:42 pm #

        您的建议是什么?
        在我的情况下,是否应该在特征选择前进行归一化?

        • Jason Brownlee 2020年1月4日 at 8:25 am #

          我最好的建议是使用受控实验,测试两种组合,并使用能带来最有效模型的方法。

  67. Tiago Beltrão Lacerda 2020年2月29日 at 11:49 am #

    嗨,Jason,

    感谢您的博客和书籍,它们对我帮助很大。

    能给我一些帮助吗?

    我正在处理一个混合数据(分类和数值)的数据集。

    分类数据:我将其转换为虚拟变量。
    数值数据:我应用了标准化。

    接下来,我尝试了RFE。初看一切都好,但有一件事让我担心:没有一个数值特征被选中。

    我不知道这是真的还是我做错了什么。

    也许我应该分别对分类和数值特征进行特征选择,然后以某种方式融合结果?

    能给我一些指点吗?

    谢谢。

    • Tiago Beltrão Lacerda 2020年3月1日 at 12:24 am #

      补充一下

      我用RFE进行了一个循环(从1到特征数量),以找到最佳的特征数量。发现最佳值是42个特征。

      然后,列出这42个特征后,我发现它们全是分类特征。

      我有329个分类特征和28个数值特征,以及2456个样本。

      考虑到这个比例(11:1),我预料到RFE选出的大部分特征会是分类特征。但我如何能确定这是正确的呢?

      谢谢。

    • Jason Brownlee 2020年3月1日 at 5:20 am #

      不客气。

      或许可以探索使用特征重要性分数来进行特征选择?

      或许可以探索使用统计方法进行特征选择。
      https://machinelearning.org.cn/feature-selection-with-real-and-categorical-data/

  68. Tiago Beltrão Lacerda 2020年3月1日 at 1:50 am #

    注意:在我研究这个主题时,我发现特征选择算法有两类:最小最优问题和全相关问题。对于我的特定问题,我觉得了解所有相关的特征很有用。

    我发现Boruta算法实现了这一点,目前看来结果还不错。

    它从357个特征中选出了53个,包括分类和数值特征,一位领域专家也认同它们的相关性。

  69. Amir Boutaghou 2020年3月1日 at 4:27 pm #

    首先,非常感谢这篇精彩的文章。请允许我向您请教以下问题:

    当我删除一个与我试图解决的问题不相关的特征时,这个步骤是否被称为“特征提取”?例如,我之前在一个基于评分的推荐系统项目中工作,我有一个review.csv数据框,包含这4个特征(user_id, item_id, rating, comment_review)。因为我想创建一个基于评分的算法(例如协同过滤),我不需要第四个“comment_review”特征,因为我的项目不是自然语言处理项目,所以我把它删除了。那么我刚才做的这个操作是否被认为是特征选择(或者也叫特征消除)?

    注意:正如您所说,我知道特征选择是选择我们的模型将使用的特征子集的过程。

    • Jason Brownlee 2020年3月2日 at 6:15 am #

      不,那是特征选择。

      • Amir Boutaghou 2020年3月2日 at 10:44 am #

        对不起,我没理解您的回答。我的意思是,我只是问这是否是特征选择。而您的回答是“不”,但之后您又告诉我那是特征选择,可我刚才告诉您的就是这是否是特征选择!!

        请您再确认一下这是否是特征选择。如果不是特征选择,那我们该如何称呼这个步骤?

        提前感谢您的回答和时间 🙂

        • Jason Brownlee 2020年3月2日 at 1:16 pm #

          抱歉。

          你说你删掉了一个特征/列,然后问这是否是特征选择。我回答说不是。

  70. Zineb 2020年3月5日 at 11:57 pm #

    嗨,Jason,

    我想念你的文章了,我最近有点忙于我的博士学业。
    为什么当我们使用不同的模型和技术进行特征选择时,即使我们分析的是同一个数据集(相同的特征),也可能会得到不同的结果?特征毕竟是描述数据的,与模型或技术无关,那为什么无论用什么技术,我们都得不到相同的排名呢?

    非常感谢。

    • Jason Brownlee 2020年3月6日 at 5:35 am #

      不同的算法以不同的方式使用所提供的数据/特征,从而导致不同的结果。

  71. henry 2020年4月23日 at 12:23 pm #

    请问您推荐哪种特征选择技术用于3D面部表情识别?

    • Jason Brownlee 2020年4月23日 at 1:35 pm #

      我一下子说不上来,或许可以查阅一下关于这个主题的文献。

  72. David 2020年5月9日 at 1:08 am #

    嗨,博士,
    特征选择应该在独热编码(oneHotEncoder)之前还是之后进行?因为独热编码会创建更多的特征。(如果我们进行某种特征排序,这类特征会出现,但因为它们不属于原始集合,我不知道将它们纳入特征选择是否可以)

    另一个问题是,独热编码后对结果列进行缩放(例如应用标准化)是否可以?

    提前感谢!

    • Jason Brownlee 2020年5月9日 at 6:17 am #

      是的,在编码转换之前对原始数据进行特征选择。

      不需要对编码后的变量进行缩放。不过如果你想在实现上图省事,这样做也没什么坏处。

  73. David 2020年5月9日 at 8:52 pm #

    谢谢回复!

    但是这个回答引出了我另一个问题。如果我不对非数值(比如字符串)特征进行独热编码,我就无法应用一些机器学习的特征选择策略(比如selectKbest)。您建议怎么做呢?
    这是否意味着这类特征不应该被包含在特征选择过程中?

    • Jason Brownlee 2020年5月10日 at 6:10 am #

      标签通常是进行顺序编码或独热编码,而特征选择通常在编码之前进行,或者在顺序编码上进行。

      自由文本数据使用词袋模型或嵌入表示进行编码。这里的特征选择通常更多是基于专家驱动,根据你希望在该领域支持的词汇表,例如最常用词的子集或类似方法。

      • David 2020年5月10日 at 7:21 pm #

        非常感谢您的回复!我想我开始明白了。
        抱歉,我可能在上一个问题中没有说得很清楚。
        我的意思是,如果我同时有分类和数值特征,如果我不对它们进行独热编码,我就无法应用一些特征选择方法,因为有标签的存在。我说的对吗?在这种情况下我应该怎么做?我应该只对数值特征应用特征选择吗?

        很抱歉打扰您,再次感谢您的回复!

        • Jason Brownlee 2020年5月11日 at 5:58 am #

          不客气。

          啊,我明白了。也许可以先对变量进行编码,然后再应用特征选择。将结果与使用所有特征的结果进行比较。

  74. Masy 2020年5月17日 at 10:28 pm #

    你好 Jason,

    非常感谢您的努力。

    我一直在和我的同事争论关于特征选择方法以及哪种最适合文本数据,他认为在处理文本预测问题时,无监督方法比监督方法更好。我尝试了几种方法,发现统计方法(chi2)对我的问题最有效,能达到最佳性能。您怎么看?有什么建议吗?

    • Jason Brownlee 2020年5月18日 at 6:15 am #

      我认为你必须测试一套方法,并发现对于给定的数据集哪种方法效果最好,而不是去猜测普遍性。

  75. Huda 2020年5月23日 at 4:29 am #

    嗨,Jason,我目前正在对一个数据集进行特征选择方法的实验。它大约是2000x2000的维度。我目前在考虑是使用Python还是Matlab来选择特征(使用像PSO、GA等方法)。您能建议哪个工具更好吗?以及为什么。谢谢。

    • Jason Brownlee 2020年5月23日 at 6:32 am #

      我建议测试一套技术,以发现哪种最适合你的数据。

  76. Shrooq 2020年7月5日 at 1:43 am #

    我正在研究朴素贝叶斯模型,但我很困惑应该用什么来进行特征选择?

    • Jason Brownlee 2020年7月5日 at 7:06 am #

      或许可以评估一下使用和不使用特征选择的模型,然后比较一下性能。

  77. SWAROOP 2020年7月10日 at 4:04 pm #

    我是机器学习领域的新手。我有点困惑,请帮帮我。
    我们是应该先进行训练-测试集划分,然后(只在训练集上)进行特征选择,再训练模型;还是应该在整个数据集上进行特征选择,然后划分训练-测试集,再训练模型?

  78. DataCamp Copy? 2020年7月24日 at 12:51 am #

    您是否也写了DataCamp上关于这个主题的教程,或者允许他们复制?那篇教程几乎是这篇文章的逐字复制(做了一些改动,实际上让它更难理解/写得更差了)。链接在这里: https://www.datacamp.com/community/tutorials/feature-selection-python

    • Jason Brownlee 2020年7月24日 at 6:30 am #

      这是未经许可的复制。

      有些人真不知羞耻。

  79. Yaso Ali 2020年10月15日 at 3:23 am #

    感谢您提供的宝贵信息;

    我是这个领域的新手;所以脑海里有一个问题:入侵检测系统(IDs)检测到的入侵者特征是什么?

  80. Younes 2021年1月11日 at 5:56 am #

    能否请您介绍一下,是否有像多元自适应回归样条(MARS)这样的机器学习模型,它能够通过其内部算法(当初始数据集很大时)选择少量预测变量?

    换句话说,是否有任何机器学习模型能够通过其自身的算法来进行特征选择?

    • Jason Brownlee 2021年1月11日 at 6:23 am #

      是的,许多线性模型提供正则化功能,可以执行自动特征选择(例如LASSO)。

      此外,决策树的集成方法也可以执行自动特征选择(例如随机森林,xgboost)。

  81. Younes 2021年1月11日 at 6:34 am #

    非常感谢您的回复,请问您对偏最小二乘回归(PLSR)有何看法?

    PLSR是否只选择一部分预测变量并用它们来进行建模处理?

  82. Emmily 2021年2月22日 at 4:20 am #

    通过应用机器视觉环境的概念,您如何理解和解释这个过程:特征集-->选择最佳特征-->学习算法-->性能?请用一个例子或任何文章来解释。
    vision environment? Explain with an example or any article.

    • Jason Brownlee 2021年2月22日 at 5:05 am #

      听起来像是作业或面试问题……

      • Emmily 2021年2月22日 at 5:09 am #

        如果您能解决它,我将非常感谢您。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。