微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

文本挖掘后使用朴素贝叶斯在 R 中进行多类分类 - 朴素贝叶斯仅预测 1 个而不是 6 个类别 - 为什么?

如何解决文本挖掘后使用朴素贝叶斯在 R 中进行多类分类 - 朴素贝叶斯仅预测 1 个而不是 6 个类别 - 为什么?

我正在使用朴素贝叶斯预测具有 6 个类别的变量。

公式为:

班级~A+B

其中 A 和 B 是转换为 tf_idf 分数的原始文本变量。

A 和 B 是包含多个单词的文本列。由于一行中的每个单词都有一个单独的 tf_idf 分数,因此 A 和 B 组合可以有多个 tf_idf 分数。

我的方法是首先计算两列中所有单词的 tf_idf 分数,然后将两列的 tf_idf 分数合并到一个数据框对象中,然后删除该数据框中的重复项。

结果是一组 2500 个不同的候选词,这些候选词可能出现也可能不出现在每一行中。

所以我创建了一个 TF_IDF DATA FRAME,有 4114 行(数据大小)和 2500 列,每列对应一个特定单词的 tf_idf 分数。

所以我将高而窄的数据框转换为短而宽的格式。

我正在转换以下数据框:

enter image description here

进入这个数据框:

enter image description here

其中第一个数据框中的行是第二个数据框中的列。

所以本质上,我正在创建一个稀疏矩阵,其中每一行(有一个类列)有 2500 个 tf_idf 分数,对应于该行句子中的 2500 个单词。每个单词都是 TF_IDF 数据框中的一列。

这是我将第一个数据帧转换为第二个数据帧的 R 代码

WORDS_LIST <- FINAL_WORDS_COMBINED %>% distinct(word)
dim(WORDS_LIST)
head(WORDS_LIST)
tail(WORDS_LIST)

TF_IDF_DF <- as.data.frame(matrix(data = 0,nrow = nrow(DATA),ncol = nrow(WORDS_LIST)))
dim(TF_IDF_DF)
dim(DATA)

colnames(TF_IDF_DF) <- WORDS_LIST$word
colnames(TF_IDF_DF)

for (i in 1:nrow(TF_IDF_DF)) {
  DF = dplyr::filter(FINAL_WORDS_COMBINED,FINAL_WORDS_COMBINED$line == i)
  if (nrow(DF) > 0) {
    for (k in 1:nrow(DF)) {
      tryCatch(for (j in 1:ncol(TF_IDF_DF)) {
        if (DF$word[k] == colnames(TF_IDF_DF)[j]){
          TF_IDF_DF[i,j] = DF$tf_idf[k]
        }
        else {
          next
        }
      },error = function(e) e)
    }
  }
  else {
    next
  }
  print(i)
}

在将第一个数据帧转换为第二个数据帧后,数据现在可以进行建模了。

然后我将数据分为训练集和测试集,比例为 80-20%,并使用 2500 个 tf_idf 分数和另一个类变量作为预测变量,以及具有 6 个类别的 CLASS 变量作为输出来训练算法。

>

但是,当我对测试数据使用拟合的朴素贝叶斯模型进行预测时,该模型仅将所有数据归为一类(道路设计),如下面的混淆矩阵所示。

enter image description here

有人可以帮我弄清楚为什么模型将所有内容预测为一个类而不是 6 个独立的类吗?

感谢您的帮助,感谢您的阅读!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。