如何解决文本挖掘后使用朴素贝叶斯在 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 分数。
所以我将高而窄的数据框转换为短而宽的格式。
我正在转换以下数据框:
进入这个数据框:
其中第一个数据框中的行是第二个数据框中的列。
所以本质上,我正在创建一个稀疏矩阵,其中每一行(有一个类列)有 2500 个 tf_idf 分数,对应于该行句子中的 2500 个单词。每个单词都是 TF_IDF 数据框中的一列。
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 变量作为输出来训练算法。
>但是,当我对测试数据使用拟合的朴素贝叶斯模型进行预测时,该模型仅将所有数据归为一类(道路设计),如下面的混淆矩阵所示。
有人可以帮我弄清楚为什么模型将所有内容预测为一个类而不是 6 个独立的类吗?
感谢您的帮助,感谢您的阅读!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。