【问题标题】:Accuracy of 0.0 using Scikit Naive-Bayes model使用 Scikit Naive-Bayes 模型的精度为 0.0
【发布时间】:2021-09-28 21:15:03
【问题描述】:

我正在尝试使用 VSC 在 Python 中使用基本的朴素贝叶斯分类器。我的尝试都产生了 0.0 的准确度。

这是样本数据:格式为无标题的 CSV

class,"['item1','item2','etc']"

目标是将此数据拟合到多项式 NB 模型。这是我的尝试:

df = pandas.read_csv('file.csv', delimiter=',',names=['class','words'],encoding='utf-8')


#x is independent var/feature 
X = df.drop('class',axis=1)
#y is dependent var/label
Y = df['class']

#split data into train/test splits, use 25% of data for testing
X_train, X_test, y_train, y_test = train_test_split(X,Y,test_size=0.25,random_state = 42)

#create a sparse matrix of words; each word is assigned a number and frequency is counted (i.e. word "x" occurs n amount of times in class Z), rows are classes, columns are words

cv = CountVectorizer()


X_tr = cv.fit_transform(X_train.words)
X_te = cv.transform(X_test.words)

model = MultinomialNB()
model.fit(X_tr,y_train)
y_pred = model.predict(X_te)
print(metrics.accuracy_score(y_test, y_pred))
# accuracy = accuracy_score(y_test,y_pred)*100
# print(accuracy)

据我了解,会发生以下情况: 创建了一个数据框 df,并将其拆分为 X 和 Y(单词和类)

数据集体分成训练/测试组

计数向量器 CV 为每个单词分配一个索引,并计算某个单词在某个类别中出现的次数(单词出现次数为数字)

创建多项式模型并与训练数据拟合(使用 x_train.words 以忽略“单词”标签)

使用测试数据对模型进行测试并打印准确度分数。

我已经试过了: 检查 x_test 和 x_train 数据框的形状:它们按照我认为应该匹配的方式匹配,列(单词)数量相等,行(类,每个火车测试拆分)比例为 6:3

检查变量类型:训练和测试 x 都是稀疏矩阵 () 并且根据 model.fit 的参数,测试/训练 y 是类似数组的n 个样本的形状(熊猫系列)。

问题是准确度为 0.0,表示有问题。也许更大的问题是我不知道是什么。

【问题讨论】:

  • 请分享您的 csv 文件的链接。
  • @AbhishekPrajapat 我正在使用来自this repo 的数据

标签: python machine-learning scikit-learn naivebayes


【解决方案1】:

问题是整个数据框的长度只有 9。只有 9 行。所以你的模型什么都学不到。另外,我检查了您的数据集,我认为您不能从中制作句子分类器,因为您的数据集中没有句子。

【讨论】:

  • 我的印象是,代表 9 个类的 9 行至少对于小规模模型来说就足够了——如果不是,多少类就足够了?另外,数据不是 9 类 40,400 列(字)的矩阵吗?我认为分类器可以将 X 列表中的单个单词与类相关联?显然我误解了,但你能指出我正确的方向或解释我哪里出错了吗?
  • 我想我明白我哪里出错了:csv 的格式应该是“class, [doc1, doc2, docn]”,其中 docs 是单词列表,对吧?那么 X 变量是一个字符串列表的列表?
  • 是的。格式应为“class, [doc1, doc2, doc……docn]”。这样一来,您将拥有 n 个文档。现在你可以做一个分类器了。
  • 我了解数据输入部分,但现在我对训练/测试拆分感到困惑——如何进行训练/测试拆分,涵盖数据中所有可能的类并采取来自该组的百分比,而不是仅覆盖总班级的百分比?目前,25% 的测试拆分包含 9 个总类中的 3 个(6 个类在训练拆分中),这显然意味着分类器不会准确,因为它没有针对所有可能的类进行训练。
  • @BobSmith 你应该从“class, [doc1, doc2, doc...... , row2 = ["class", "doc2"] 等等,这适用于所有类。
猜你喜欢
  • 2017-07-07
  • 1970-01-01
  • 2014-10-24
  • 2017-01-05
  • 2017-02-27
  • 2014-06-18
  • 2015-03-31
  • 2016-05-07
  • 2014-08-23
相关资源
最近更新 更多