是否可以对任何文本分类应用PCA?

2024-06-16 15:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我在尝试用python进行分类。我在网页上使用Naive Bayes多项式nb分类器(将数据从web检索到文本,稍后对文本进行分类:web分类)。

现在,我试图对这些数据应用PCA,但是python给出了一些错误。

我的朴素贝叶斯分类代码:

from sklearn import PCA
from sklearn import RandomizedPCA
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
vectorizer = CountVectorizer()
classifer = MultinomialNB(alpha=.01)

x_train = vectorizer.fit_transform(temizdata)
classifer.fit(x_train, y_train)

这种朴素的bayes分类提供了输出:

>>> x_train
<43x4429 sparse matrix of type '<class 'numpy.int64'>'
    with 6302 stored elements in Compressed Sparse Row format>

>>> print(x_train)
(0, 2966)   1
(0, 1974)   1
(0, 3296)   1
..
..
(42, 1629)  1
(42, 2833)  1
(42, 876)   1

在我试图对我的数据应用PCA时(temizdata):

>>> v_temizdata = vectorizer.fit_transform(temizdata)
>>> pca_t = PCA.fit_transform(v_temizdata)
>>> pca_t = PCA().fit_transform(v_temizdata)

但这引起了以下错误:

raise TypeError('A sparse matrix was passed, but dense ' TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.

我将矩阵转换为densematrix或numpy数组。然后我试图将新的densematrix分类,但我有错误。

本文的主要目的是检验主成分分析对文本分类的影响。

转换为密集数组:

v_temizdatatodense = v_temizdata.todense()
pca_t = PCA().fit_transform(v_temizdatatodense)

最后试试classfy:

classifer.fit(pca_t,y_train)

最终分类错误:

raise ValueError("Input X must be non-negative") ValueError: Input X must be non-negative

一方面我的数据(temizdata)只放在朴素贝叶斯中,另一方面temizdata首先放在PCA中(用于减少输入)而不是分类。 __


Tags: 数据from文本import错误分类transformtrain
3条回答

问题是,通过应用降维,将生成负特征。然而,多名词NB不具有负特征。请参考this问题。

尝试另一个分类器,如RandomForest,或者尝试使用sklearn.preprocessing.MinMaxScaler()将训练功能缩放到[0,1]

与其将sparse矩阵转换为dense(这是不可取的),我将使用scikits learn的^{},这是一种类似PCA的调光性减少算法(默认情况下使用随机SVD),用于稀疏数据:

svd = TruncatedSVD(n_components=5, random_state=42)
data = svd.fit_transform(data) 

引用TruncatedSVD文档:

In particular, truncated SVD works on term count/tf-idf matrices as returned by the vectorizers in sklearn.feature_extraction.text. In that context, it is known as latent semantic analysis (LSA).

这正是你的用例。

NaiveBayes分类器需要离散值特征,但PCA破坏了特征的这一特性。如果你想使用主成分分析,你必须使用不同的分类器。

可能还有其他的降维方法可以使用NB,但我不知道这些。也许简单的feature selection就能奏效。

旁注:你可以尝试在应用主成分分析后对特征进行离散化,但我不认为这是个好主意。

相关问题 更多 >