什么机器学习算法适合这种情况

时间:2013-02-21 14:05:40

标签: machine-learning data-mining expert-system

我有一个PHP / MySQL应用程序,可以存储症状和适当的药物。我应该使用什么机器学习算法来预测任何症状的药物。另外,训练集的格式是什么?

7 个答案:

答案 0 :(得分:2)

在ML中没有针对这种情况的“最佳解决方案”,这种方法/数据几乎总能满足我的需求吗?因此,尝试使用简单的ML技术(例如决策树),如果它不起作用,尝试更复杂的东西。如果不起作用,请尝试更改数据......

答案 1 :(得分:2)

你的数据最终会像这样:

row_id  symptom_x symptom_y degree_of_symptom_z ... best_drug

1       false     true      0.8                     drug_x
2       true      null      0.0                     drug_q

您将使用统计分类器根据症状学习最佳药物。然后你会喂它新的症状,它会表明最好的药物。

可能存在许多可用的症状,因此算法需要能够处理许多列。

我将从支持向量机开始,并尝试Logistic回归。

查看RapidMiner。

答案 2 :(得分:1)

我认为您最好的办法是确定一个可以很好地集成到您环境中的可靠库。

一般来说:

  • 良好的数据几乎总能帮助您:即预处理您的数据以提取您认为对人类有用的功能(“摘要”)。
  • 避免使用无用的功能:对于许多可能稍有帮助的棘手功能,我们更喜欢这些功能。
  • 请注意,不太可能有魔术黑盒子:你需要调整你的算法。大多数ML算法都有几个所谓的“超参数”,它们会影响算法的工作方式;例如学习率;平滑;窗口大小等。
  • 由于它不是黑盒子,因此请找一些机器学习介绍,并至少基本了解这些技术的工作原理和原因。很容易从ML算法中完全废话,因此至少要了解这些事情是如何工作的,这样才能正确设置问题。
  • 首先尝试真的简单,就像最近邻居一样(你需要一个距离指标)。这可能就够了。

虽然我最近没有使用过,但我相信如果NN不够好,SVM仍然是你最好的选择。这不是时髦的新事物,但如果没有太多的调整,它们通常会很好。但是,使用经过良好调整的弱算法(即一个具有您理解的文档的算法和一个可以尝试大量超帧参数的实现)几乎总是比一个调整不佳的强算法更好。当然,如果你真的不知道你在做什么。

换句话说:保持简单,并确保在特征选择阶段使用许多常识。

答案 3 :(得分:0)

看到你可能会有很多这个问题的未知变量,我建议使用贝叶斯网络来接近它。

根据该简要描述以及之前使用医疗诊断软件(如WebMD等)的经验,这只是猜测。

贝叶斯网络在处理大量未知变量时往往具有比大多数其他ML算法更高的“精度”(例如,神经网络往往需要更准确的数据才能进行准确的回归 - 因此可以提出准确的建议)。

您需要对过度拟合预防,平滑和其他可能遇到的问题进行一些研究。

同样,这不是一个明确的答案。您没有提供任何详细数据供我根据假设进行猜测。在决定之前,我强烈建议进行更深入的研究。

答案 4 :(得分:0)

您需要自己尝试数百种算法,预处理等

任何都没有通用的“最佳算法”。

特别是对于数据驱动的东西,当其他人没有你的数据时。

所以,尝试了很多事情,看看哪些适合你。因为对他人有用的东西不一定对你有用,反之亦然。

此外,必须获得经验和专业知识才能取得好成绩。

答案 5 :(得分:0)

这是一个分类问题:您已标记了要用于训练模型的数据。

由于您将遇到一些错误,您应该决定是否最小化您的误报或假阴性结果并平衡您的算法以实现这一目标。

你可以使用一个简单的决定三,看看表现如何,使用像医生的一些真实处方一样的测试集。

请注意,您的处方可能需要多种药物或不需要药物。

您应该考虑的一个问题是,如果您服用某些药物,则不能服用其他药物,并且患者可能会有一些过敏症状。 出于这个原因,我建议你看一下http://en.wikipedia.org/wiki/Association_rule_learning和Prolog。

答案 6 :(得分:0)

尝试K个最近的邻居,我认为这是分类问题。 您的处方可能需要一种或多种药物,而另一个问题是该机器可能并不总是准确的,因为它将有机会确定未经培训的药物。您需要一个非常详细的数据集。

以下示例是基于ml-idea(机器学习思想)的Github- ML-Idea

尽管没有完善的算法,但只要做好数据计数,就可以正确准备数据。

`

 //symptoms
  //1 = 'Symptom 1';
  //2 = 'Symptom 2';
  //3 = 'Symptom 3';
  //4 = 'Symptom 4';

$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['drug a', 'drug A', 'drug x', 'drug x', 'drug a', 'drug x'];

$classifier = new KNearestNeighbors(6, true);
$classifier->train($samples, $labels);
$data = $classifier->predict([2, 1]);

echo "<pre>";
print_r($data);
echo "</pre>";

`