机器学习挑战:诊断Java/Groovy程序(数据挖掘,机器学习)

20
我计划用Java开发一个提供诊断的程序。数据集分为两部分,一部分用于训练,另一部分用于测试。我的程序应该从训练数据中学习分类(顺便提一下,每个新列中都包含30个问题的答案,每个记录都在新行中,最后一列将是0或1的诊断,在测试数据的诊断列将为空 - 数据集包含约1000个记录),然后在测试数据的预测中进行预测 :/
我从未做过类似的事情,因此我将感激任何关于类似问题的解决方案的建议或信息。
我正在考虑使用Java机器学习库或Java数据挖掘包,但我不确定是否是正确的方向...?而且我仍然不确定如何解决这个挑战...
请给予建议。
祝一切顺利!

5
为了抵消负评:这似乎是一个有趣的问题。 - Jim Ferrans
诊断什么?如果您试图诊断程序中的问题,您将遇到停机问题。 - monksy
5个回答

13

我强烈推荐你使用Weka完成你的任务。

它是一个机器学习算法集合,具有用户友好的前端,方便许多不同种类的特征和模型选择策略。

你可以在不需要编写代码或进行数学运算的情况下,使用它来处理许多非常复杂的任务。

该软件的制造商还出版了一本相当不错的实用数据挖掘教材

一旦你掌握了它,你可以使用它的API将任何分类器集成到你自己的Java程序中。


谢谢,我会在Weka上看一下。 - Registered User
3
这款软件和教材真的很适合了解机器学习,我非常推荐它们。 - gverdouw

7

你好,像Gann Bierner说的一样,这是一个分类问题。我所知道的最适合你需要的分类算法是Ross Quinlan算法。它在概念上非常易于理解。

对于现成的分类算法实现,最好的选择是Weka。它可以在这里找到:http://www.cs.waikato.ac.nz/ml/weka/。我学习过Weka,但发现它有点晚。

我使用了一个更简单的实现叫做JadTi。它对于像你这样的小数据集效果非常好。我用过它很多次,所以可以自信地说这一点。JadTi可以在这里找到:

http://www.run.montefiore.ulg.ac.be/~francois/software/jaDTi/

话虽如此,你面临的挑战将是在web上构建可用的界面。要做到这一点,数据集的用处有限。数据集基本上依赖于你已经有了训练集,而你只需一步就可以将新的测试数据集输入其中,并立即得出答案。

但是我的应用程序,可能也是你的应用程序,是一个逐步用户发现的过程,具有在决策树节点上来回移动的功能。

为了构建这样的应用程序,我从我的训练集中创建了一个PMML文档,并建立了一个Java引擎,遍历每个树节点,要求用户给出输入(文本/收音机/列表),并将值用作下一个可能节点谓词的输入。

可以在这里找到PMML标准:http://www.dmg.org/。这里只需要TreeModel。NetBeans XML插件是一个良好的模式感知编辑器,用于PMML创作。Altova XML可以做得更好,但需要花费$。

还可以使用RDBMS存储数据集并自动生成PMML!我没有尝试过。

祝你的项目顺利,如果你需要进一步的输入,请随时告诉我。


1
你怎么能如此明确地说决策树是手头任务的最佳算法呢? - Steve Lianoglou
1
你说得对,抱歉。我想我会先尝试通过SVM运行它,因为这样很容易快速完成(例如,只需将数据放入libsvm理解的格式中并运行即可),而且通常相对于要做的工作量提供出色的性能。您可以尝试提升,朴素贝叶斯,(惩罚)逻辑回归(查看“glmnet”与相关阅读)...虽然我很难选择一个作为“最好的”。 - Steve Lianoglou

6
有许多算法属于“机器学习”范畴,哪种适合你的情况取决于你正在处理的数据类型。如果你的数据基本上包括一组问题映射到一组诊断,每个诊断都可以是是/否,则我认为可能适用的方法包括神经网络和基于测试数据自动构建决策树的方法。建议查看一些标准文本,如Russel&Norvig(“人工智能:现代方法”)和其他AI /机器学习介绍,并查看是否可以轻松地将他们提到的算法调整到您特定的数据中。另请参考O'Reilly的“Programming Collective Intelligence”,其中包含一两个可适用于您的案例的算法的Python示例代码。如果您会阅读西班牙语,则墨西哥出版社Alfaomega近年来还出版了各种优秀的AI相关介绍。

1
@ Neil Coffey - 我不懂西班牙语 :( 但我会查看 O'Reilly 的书。谢谢。 - Registered User

6
这是一个分类问题,不是真正的数据挖掘。一般的方法是从每个数据实例中提取特征,然后让分类算法从特征和结果(对于您来说是0或1)中学习模型。假设您的30个问题中的每个问题都是它自己的特征。
有许多可以使用的分类技术。支持向量机和最大熵都很流行。我没有使用Java机器学习库,但是一眼看去,我没有看到这两个。OpenNLP项目有最大熵实现。LibSVM有支持向量机实现。您几乎肯定需要将数据修改为库可以理解的格式。
祝你好运!
更新:我同意其他评论者的观点,Russel和Norvig是一本很棒的AI书籍,其中讨论了一些问题。如果您对细节感兴趣,Bishop的“模式识别和机器学习”深入讨论了分类问题。

2
谢谢,我已经拥有了这本书的副本,确实很棒! - Registered User

3
你的任务是典型的神经网络问题,主要用于解决分类任务。神经网络在任何语言中都有相当简单的实现方式,并且它是“机器学习”的“主流”,比其他任何东西更接近人工智能。 你只需要实现(或获取现有实现)标准神经网络,例如通过误差反向传播进行学习的多层网络,并在循环中给它提供学习示例。经过一段时间的学习后,您将使它在真实示例上正常工作。 您可以从以下链接开始了解更多关于神经网络的知识: http://en.wikipedia.org/wiki/Neural_network http://en.wikipedia.org/wiki/Artificial_neural_network 此外,您还可以在以下链接中获得许多现成的实现: http://en.wikipedia.org/wiki/Neural_network_software

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接