TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。使用 NaiveBayes 分类器
Posted
技术标签:
【中文标题】TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。使用 NaiveBayes 分类器【英文标题】:TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array. with NaiveBayes Classifier 【发布时间】:2017-12-16 11:45:02 【问题描述】:多项朴素贝叶斯分类器给出了正确的结果,但其他两个 - 高斯 NB 和二项式 NB 没有。它给出的错误是这样的:
TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。
但即使添加该功能(train_set.toarray()
),错误也是
AttributeError: 'list' 对象没有属性 'toarray'
代码是
import pickle
from nltk.corpus import names
import random
import nltk
from sklearn.naive_bayes import MultinomialNB, GaussianNB, BernoulliNB
from sklearn.linear_model import SGDClassifier, LogisticRegression
from sklearn.svm import SVC, LinearSVC, NuSVC
from nltk.classify.scikitlearn import SklearnClassifier
import numpy as np
import scipy as sc
def gender_features(word):
return 'last_letter': word[-1]
labeled_names = ([(name, 'male') for name in names.words('male.txt')] + [(name, 'female') for name in names.words('female.txt')])
random.shuffle(labeled_names)
featuresets = [(gender_features(n), gender) for (n, gender) in labeled_names]
train_set, test_set = featuresets[500:], featuresets[:500]
classifier = nltk.NaiveBayesClassifier.train(train_set)
print(nltk.classify.accuracy(classifier, test_set)*100)
classifier.show_most_informative_features(5)
MNB_classifier = SklearnClassifier(MultinomialNB())
MNB_classifier.train(train_set)
print ("MNB classifier accuracy: ", (nltk.classify.accuracy(MNB_classifier, test_set))*100)
G_classifier = SklearnClassifier(GaussianNB())
G_classifier.train(train_set)
print ("Gaussian classifier accuracy: ", (nltk.classify.accuracy(G_classifier, test_set))*100)
B_classifier = SklearnClassifier(BernoulliNB())
B_classifier.train(train_set)
print ("Bernoulli classifier accuracy: ", (nltk.classify.accuracy(B_classifier, test_set))*100)
【问题讨论】:
错误提示train_set
是一个列表,而不是一个稀疏矩阵。
另外,如果您复制了该错误而不是代码,则会出现语法错误 (torray
=/ toarray
)
@hpaulj 即使在添加 .toarray() 时,它也会如前所述显示错误。如何将其转化为稀疏矩阵?
@DanielF 那么为什么 Multinomial 没有显示错误,而其他却显示了?
我们需要了解更多关于train_set
变量的信息。如果是列表,元素是什么样的?
【参考方案1】:
也许你可以这样做:numpy.array(train_set),将列表设为密集 m
【讨论】:
【参考方案2】:我遇到了同样的问题,训练时尝试使用:
train_set.todense()
它对我有用:
【讨论】:
以上是关于TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。使用 NaiveBayes 分类器的主要内容,如果未能解决你的问题,请参考以下文章