首页 文章

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

提问于
浏览
8

我正在尝试使用python进行分类 . 我正在使用Naive Bayes MultinomialNB分类器用于网页(从网络文本中检索数据形式,稍后我将此文本分类为: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)

这种天真的贝叶斯分类给出了输出:

>>> 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)

但这引起了错误:

引发TypeError('传递稀疏矩阵,但密集'TypeError:传递了稀疏矩阵,但需要密集数据 . 使用X.toarray()转换为密集的numpy数组 .

我将矩阵转换为densematrix或numpy数组 . 然后我尝试了新的密集矩阵,但我有错误 .

我的主要目的是测试PCA对文本分类的影响 .

转换为密集数组:

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

最后尝试classfy:

classifer.fit(pca_t,y_train)

最终classfy的错误:

raise ValueError(“输入X必须为非负数”)ValueError:输入X必须为非负数

一方面,我的数据( temizdata )仅被置于Naive Bayes中,另一方面 temizdata 首先被放入PCA(用于减少输入)而不是分类 . __

2 回答

  • 4

    我不会将 sparse 矩阵转换为 dense (不鼓励),而是使用scikits-learn's TruncatedSVD,这是一种类似PCA的dimmensionality减少算法(默认情况下使用Randomized SVD),它可以处理稀疏数据:

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

    并且,引用 TruncatedSVD 文档:

    特别是,截断的SVD适用于sklearn.feature_extraction.text中矢量化器返回的术语计数/ tf-idf矩阵 . 在这种情况下,它被称为潜在语义分析(LSA) .

    这正是你的用例 .

  • 12

    NaiveBayes 分类器需要离散值特征,但PCA会破坏这些特征的属性 . 如果要使用PCA,则必须使用其他分类器 .

    可能有其他降维方法适用于NB,但我不知道那些 . 也许简单feature selection可以工作 .

    旁注:您可以尝试在应用PCA后离散功能,但我认为这不是一个好主意 .

相关问题