【问题标题】:Classification Supervised Training Confusion分类监督训练混淆
【发布时间】:2017-12-24 22:36:16
【问题描述】:

所以我是监督机器学习的新手,但我一直在阅读有关它的书籍和文章,但我遇到了一个问题。 (没有卡住,但我不明白分类算法背后的逻辑)。我试图根据历史数据将记录分类为错误或不正确。 所以这是原始数据(训练数据):

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。我使用了朴素贝叶斯方法,因为这种方法假设特征变量之间是独立的,这就是我的情况(办公室号码和年龄之间没有关系)。我知道还有其他方法,例如逻辑回归和 SVC(SVM),但我认为它们需要特征变量之间存在一定程度的关系。尽管如此,我仍然尝试了这两种方法并得到了相同的结果。难道我做错了什么?在训练我的模型之前我需要指定一些东西吗?

这是我所做的(非常简单):

NaiveBayes nb = new NaiveBayes().setLabelCol("isWrong");
NaiveBayesModel nbm = nb.fit(dataset);
nbm.transform(dataset2).show();

这里是 dataset2(前 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。知道为什么吗?

【问题讨论】:

    标签: machine-learning classification naivebayes apache-spark-ml


    【解决方案1】:

    我不知道你为什么选择transform()。它只是尝试将结果 dtype 转换为与原始列相同的类型

    要获得您应该使用该函数的概率:

    predict_proba(X):返回测试向量 X 的概率估计值。

    以下代码应该在您的场景中完美运行

    NaiveBayes nb = new NaiveBayes().setLabelCol("isWrong");
    nb.fit(dataset)
    nb.predict_proba(dataset2)
    

    【讨论】:

    • 您刚刚说过:“返回测试向量 X 的概率估计”但是您将我的 dataset2 作为参数传递,但我明白您的意思。我刚刚尝试过,我得到了相同的结果。我遍历了 dataset2 的每条记录,但最终还是得到了 0 的预测结果
    • 我还关注了 Apache 的 Spark DOCS 上的内容:// train the model NaiveBayesModel model = nb.fit(train); // Select example rows to display. Dataset<Row> predictions = model.transform(test);
    • 因为您使用数据集训练分类器并使用数据集2 测试其性能,我很高兴您的疑虑得到了消除@GuillermoHerrera
    • 忘记添加文档链接:spark.apache.org/docs/latest/…
    • 所以你是说我只能使用相同的数据集来测试我的模型......?我不认为那是真的。您训练一个模型,然后用不同的数据对其进行测试以观察结果。
    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2012-10-22
    • 2016-02-06
    • 2018-03-07
    • 2012-05-10
    • 2019-06-04
    相关资源
    最近更新 更多