所以我是监督机器学习的新手,但我一直在阅读有关它的书籍和文章,但我遇到了一个问题。 (没有卡住,但我不明白分类算法背后的逻辑)。我试图根据历史数据将记录分类为错误或不正确。 这是原始数据(训练数据):
Name Office Age isWrong
F1 1 32 0
F2 2 61 1
F3 1 35 0
F4 0 25 0
F5 1 36 0
F6 2 52 0
F7 2 48 0
F8 1 17 1
F9 2 51 0
F10 0 24 0
F11 4 34 1
F12 0 21 0
F13 2 51 0
F14 0 27 0
F15 3 37 1
(only showing top 15 results of 200 results)
错误记录是指报告年龄低于 18 岁或高于 60 岁或办公地点不是 {0, 1, 2} 的任何记录。当满足任何上述条件时,我有更多记录显示 1。我用这个数据集训练了我的模型,并创建了一个测试数据集来测试结果。然而,我最终在每条记录的 prediction
列上得到 0。我使用朴素贝叶斯方法,因为这种方法假设特征变量之间是独立的,这就是我的情况(办公室号码和年龄之间没有关系)。我知道还有其他方法,例如 Logistic 回归和 SVC(SVM),但我认为它们需要特征变量之间存在一定程度的关系。尽管如此,我仍然尝试了这两种方法并得到了相同的结果。难道我做错了什么?在训练模型之前我需要指定一些内容吗?
这是我所做的(非常简单):
NaiveBayes nb = new NaiveBayes().setLabelCol("isWrong");
NaiveBayesModel nbm = nb.fit(dataset);
nbm.transform(dataset2).show();
这是数据集 2(前 15 名):
Name Office Age
F1 9 36 //wrong, office is 9
F2 2 20
F3 1 17
F4 2 43
F5 2 90 // wrong, age is >60
F6 1 36
F7 1 40
F8 2 52
F9 2 49
F10 1 38
F11 0 28
F12 0 18
F13 1 40
F14 1 31
F15 2 45
但是就像我说的,预测列每次都显示 0。知道为什么吗?
最佳答案
我不知道您为什么选择transform()
。它只是尝试将结果数据类型转换为与原始列相同的数据类型
要获得您应该使用该函数的概率:
predict_proba(X): Return probability estimates for the test vector X.
以下代码应该在您的场景中完美运行
NaiveBayes nb = new NaiveBayes().setLabelCol("isWrong");
nb.fit(dataset)
nb.predict_proba(dataset2)
关于machine-learning - 分类监督训练困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45194229/