在处理问题时,您总是希望充分利用可用的数据。您希望获得尽可能高的准确率。
通常,最大的收获在于更好地理解您正在解决的问题。这就是为什么我强调您要花大量时间来定义问题,分析数据,以及为模型准备数据集。
数据准备的一个关键部分是创建数据集的转换,例如重新缩放的属性值和分解为其组成部分的属性,所有这些都是为了向建模算法公开更多有用的结构。
在准备数据集时,一套重要的方法是使用自动特征选择算法。在本文中,您将了解特征选择、简单特征选择的好处以及如何在 Weka 中最好地利用这些算法处理您的数据集。
通过我的新书《Weka 机器学习精通》开启您的项目,其中包含分步教程和所有示例的清晰截图。
让我们开始吧。

仔细选择数据集中的特征
照片由 Gabe Photos 拍摄,部分权利保留
并非所有属性都相同
无论您是自己选择和收集样本数据,还是由领域专家提供,属性的选择都至关重要。它很重要,因为它可能意味着在成功地、有意义地对问题进行建模与否之间的区别。
误导性
包含冗余属性可能会误导建模算法。基于实例的方法,如 K 最近邻,使用属性空间中的小邻域来确定分类和回归预测。这些预测可能会因冗余属性而严重倾斜。
过拟合
在数据集中保留不相关的属性可能导致过拟合。像 C4.5 这样的决策树算法试图在属性值上做出最佳划分。与预测相关性更高的属性会首先被用来划分。在树的更深处,使用不太相关和不相关的属性来做预测决策,这些决策可能仅仅是偶然地对训练数据集有益。这种对训练数据的过拟合可能会对方法的建模能力产生负面影响,并削弱预测准确性。
在评估算法之前,从数据集中删除冗余和不相关的属性非常重要。此任务应在应用机器学习过程的准备数据步骤中完成。
在Weka机器学习方面需要更多帮助吗?
参加我为期14天的免费电子邮件课程,逐步探索如何使用该平台。
点击注册,同时获得该课程的免费PDF电子书版本。
特征选择
特征选择或属性选择是一个过程,通过该过程您可以自动搜索数据集中最佳的属性子集。“最佳”的概念与您尝试解决的问题相关,但通常意味着最高的准确率。
理解属性选择问题的一种有用方法是将其视为一个状态空间搜索。搜索空间是离散的,由您可以从数据集中选择的所有可能的属性组合组成。目标是通过搜索空间进行导航,找到一个能够提高相对于选择所有属性的性能的最佳组合或足够好的组合。
在数据上执行特征选择的三个关键好处是:
- 减少过拟合:冗余数据越少意味着基于噪声做出决策的机会越少。
- 提高准确性:误导性数据越少意味着建模准确性越高。
- 减少训练时间:数据量少意味着算法训练得更快。
Weka 中的属性选择
Weka 提供了一个属性选择工具。该过程分为两部分:
- 属性评估器:评估属性子集的方法。
- 搜索方法:搜索可能子集空间的方法。
属性评估器
属性评估器是评估属性子集的方法。例如,它们可能通过构建模型并评估模型的准确率来评估。
属性评估方法的一些示例包括:
- CfsSubsetEval:评估与类值高度相关且彼此之间相关性低的子集。
- ClassifierSubsetEval:使用预测算法和您指定的另一个数据集来评估子集。
- WrapperSubsetEval:使用您指定的分类器和 n 折交叉验证来评估子集。
搜索方法
搜索方法是基于子集评估来导航可能属性子集搜索空间的结构化方式。基线方法包括随机搜索和穷举搜索,尽管图搜索算法很受欢迎,例如最佳优先搜索。
属性评估方法的一些示例包括:
- 穷举搜索:测试所有属性组合。
- 最佳优先搜索:使用最佳优先搜索策略导航属性子集。
- 贪婪逐步搜索:使用前向(加性)或后向(减性)逐步策略导航属性子集。
如何在 Weka 中使用属性选择
在本节中,我想与您分享三种在 Weka 中使用属性选择的巧妙方法。
1. 探索属性选择
当您刚开始进行属性选择时,我建议您在 Weka Explorer 中尝试几种方法。
加载数据集,然后点击“选择属性”选项卡。在数据集上尝试不同的属性评估器和搜索方法,并在输出窗口中查看结果。
这样做的目的是为了让您了解 1) 选择多少以及 2) 为您的问题选择了哪些属性。您可以将此信息用于后续的下一步或两者。
2. 使用属性选择准备数据
下一步将是在数据准备步骤中使用属性选择。
您可以使用一个过滤器在预处理数据集时运行属性选择方案,然后将数据集修剪为仅包含选定的属性。该过滤器在“无监督属性过滤器”下称为“AttributeSelection”。
然后,您可以保存数据集以在进行算法抽样检查的实验中使用。
3. 结合属性选择运行算法
最后,还有一种更巧妙的方法可以将属性选择结合起来,那就是直接将其与算法结合。
您可以使用一种元算法,在实验中包含该算法,它会在运行算法时选择属性。该算法在算法的“meta”组下称为“AttributeSelectedClassifier”。您可以配置此算法以使用您选择的算法以及您选择的属性评估器和搜索方法。
您可以包含此元算法的多个版本,并配置不同的属性选择方案变体和配置,并查看它们之间的比较。
总结
在本文中,您了解了特征选择作为一套方法,它可以提高模型准确率、减少模型训练时间并减少过拟合。
您还了解到特征选择方法已内置于 Weka 中,并且您学会了三种在 Weka 中对数据集使用特征选择方法的巧妙方法,即通过探索、准备数据以及将其与算法结合在元分类器中。
维基百科有一个关于特征选择的良好条目。
如果您正在寻找下一步,我推荐这本书《特征提取:基础与应用》。它汇集了学术界的文章,涵盖了特征选择相关的各种问题。虽然价格昂贵,但由于这些方法在解决您的问题方面可以产生差异,因此非常值得。
有关 Weka 特征选择的更新观点,请参阅文章
您可能会发现另一本有用的书(Kindle 上更便宜)是《特征选择计算方法》。
Weka 软件中使用的离散方法是什么?
这是哪个版本的 Weka?
我在创建这篇文章时使用了 OS X 上的 Weka 版本 3.6.10。
你好,
非常感谢这些技巧!我读到有人说不能通过 GUI 进行属性选择;您的文章真的让我心情大好。
我注意到一个小问题。在我使用的 Weka 3.7.1.1 版本中,我们需要使用的过滤器(属性选择器)位于监督类别下,而不是您发布的无监督类别下。
在特征选择之后,我测试的模型准确率有所下降。通常,我认为准确率应该会提高。
对于朴素贝叶斯,准确率大幅下降。从 45% 降至 36%。
这会不会是我的数据集有问题?我的数据集很小,有 5 个类别,每个类别有 30 个实例。
属性选择可以帮助您剔除那些因以某种方式误导而损害您准确率的属性(Jason 的文章很好地涵盖了它的含义)。如果您只有 5 个属性,那么您的模型可能需要所有这些属性。当您有很多属性时(一般来说,我至少需要几十个,但这取决于数据和模型)或者您认为某些属性可能导致问题时,属性选择会很有帮助。
在应用特征选择并查看用于去除最低秩属性的秩序列后,我应用了朴素贝叶斯和 J48 分类器,在这两种情况下,我的准确率都比移除最低秩属性之前有所下降。
有什么想法为什么会这样吗?
谢谢。
我如何决定使用哪些属性选择算法来提高模型准确率?我拥有超过 1000 个特征,并且我将使用该模型对应用程序进行分类,以根据二进制特征将其归类为好或恶意。
我的数据集有 62 个属性和 300 条记录。
我应用了特征选择,它告诉我选择了 41 个属性。
我删除了这些属性。
我使用了随机森林、KNN、贝叶斯网络和神经网络。
但有些分类器的准确率有所提高,有些则没有。有些分类器的准确率甚至比最初的 62 个属性的准确率还要低。
为什么会这样?我还有另一个 PCA 用于预处理。有什么区别?
特征选择方法是启发式的,它们只是一个关于什么可能有效的好主意,而不是保证。
我建议构建来自您数据的多种不同“视图”的模型,然后在一个集成中组合预测。结果通常会好得多。
您好,Jason Brownlee 博士,我对我如何不写代码来学习机器学习感兴趣,您能帮助我吗?我来自印度。
是的,从这里开始
https://machinelearning.org.cn/start-here/#weka
您好,Jason 博士。
我对数据挖掘有点陌生。我从事预测建模。
我可以问一下如何确定分类器构建的训练时间/处理时间吗?以及可以使用什么工具?
谢谢。
您的意思是确切什么?训练模型的实际运行时间?
如果是这样,您通常可以通过在训练模型的同时编写代码来实现。
嗨,杰森博士,
我打算在用户界面适应系统中应用机器学习。目的是预测系统对使用上下文变化的反应。我的数据集包含 14 个属性(标称、数值和二进制)。代表类的第 14 个属性是标称的,包含系统可以执行的 12 种操作。其他属性指的是上下文参数。我测试了几个 Weka 算法,但我无法确定哪个最适合我的问题。我的问题是如何选择更合适的算法来进行预测?特征选择在这种情况下是否有帮助?
谢谢
也许您可以创建数据的多个副本,一个保持不变,另一个尝试将所有特征转换为数值,另一个转换为类别,依此类推,并在每个数据视图上评估算法,看看是否有任何东西能够脱颖而出。
感谢您的快速回复。我找到了您发布的另一个教程,地址是“https://machinelearning.org.cn/save-machine-learning-model-make-predictions-weka/”。它真的帮了我很多。所以,我使用了逻辑回归算法来进行预测。与其他算法相比,它给了我最好的结果。
训练步骤
正确分类实例 216 86.747 %
错误分类实例 33 13.253 %
Kappa 统计量 0.83
平均绝对误差 0.0232
均方根误差 0.1076
相对绝对误差 17.7309 %
均方根相对误差 42.2221 %
总实例数 249
测试步骤
正确分类实例 8 66.6667 %
错误分类实例 4 33.3333 %
Kappa 统计量 0.6066
平均绝对误差 0.0463
均方根误差 0.1525
总实例数 12
我现在只想知道这些结果是否令人满意,可以采用这个解决方案。我需要它用于我的博士论文。如果没有,我该如何提高预测能力?
非常感谢
还有另一个问题,请问。逻辑回归是否适用于多类别分类问题?(我的类别有 12 个可能的标称值)
一般不。逻辑回归用于二元分类。
“好”实际上是由您的领域定义的。也许您可以将“好”定义为相对于 ZeroR 算法的分数?
这篇文章列出了我提升模型技能的所有最佳想法。
https://machinelearning.org.cn/machine-learning-performance-improvement-cheat-sheet/
我不太明白您对“将‘好’定义为相对于 ZeroR 算法的分数”的确切意思,但我会阅读这篇文章并尝试理解。
再次感谢您。
我的意思是,所有模型要超越的基线技能将是 ZeroR 算法的分数。
您好 Jason,感谢您的教程。
我正在处理 IDS,并且首先我想进行特征选择。当使用 CFS 和 IG 进行时,效果很好。但是对于包装器,无论是什么,它都花费了太多时间。我知道与基于过滤器的方法相比,它应该花费更多时间,因为我们使用 ML 算法,但它花费的时间超过了正常水平,可能需要 1 天仍然没有给出任何结果。起初,是内存问题,但我解决了。然后我以为是 CPU 问题,但在检查 CPU 时,我只看到它使用了 35%。我想知道问题可能是什么……
谢谢
也许您可以使用更小的数据样本进行特征选择?
感谢教程。看起来 Weka 在您的机器学习过程中确实帮助了您。我会尝试一下。
是的。我在 2000 年代初开始使用它,后来才转向 R 和 Python。
您好,我有一个关于训练时间定义的问题?神经网络的训练时间包含哪些内容?它是否仅包含运行最佳网络架构(隐藏层和神经元)代码的时间,还是也包括确定最佳架构的时间,即 k 折交叉验证和其他步骤?
训练时间是指训练轮次的执行。从随机初始模型到训练好的模型。
您好 Jason Brownlee,Weka 中有粗糙集理论的概念吗?
据我所知,没有。
先生,我需要您的帮助。我想使用过滤器方法进行特征选择以诊断甲状腺疾病。请推荐好的算法??例如 JMIM、置换、limma、杂质和 sym.uncert。请告诉我哪些对于诊断疾病以及可以使用哪种分类器以获得最佳准确率?
好问题,我建议遵循这个过程:
https://machinelearning.org.cn/start-here/#process