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



我正在尝试使用python进行分类。我对网页使用Naive Bayes MultinomialNB分类器(从web到text检索数据,稍后我对文本进行分类: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)

但这引发了以下错误:

raise TypeError(传递了"稀疏矩阵,但密集"TypeError:A传递了稀疏矩阵,但需要密集数据。使用X.数组()以转换为密集numpy数组。

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

我的主要目的是测试主成分分析对文本分类的影响。

转换为密集阵列:

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

最后尝试classfy:

classifer.fit(pca_t,y_train)

最终分类错误:

引发ValueError("输入X必须非负")ValueError:输入X必须是非负

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

与其将sparse矩阵转换为dense(这是不鼓励的),我会使用scikitslearn的TruncatedSVD,这是一种类似PCA的降维算法(默认使用随机化SVD),适用于稀疏数据:

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

并且,引用TruncatedSVD文档:

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

这正是您的用例。

NaiveBayes分类器需要离散值特征,但PCA打破了特征的这一特性。如果要使用PCA,则必须使用不同的分类器。

NB可能还有其他降维方法,但我不知道这些方法。也许简单的功能选择就可以了。

附带说明:你可以在应用PCA后尝试离散化特征,但我认为这不是一个好主意。

问题是,通过应用降维,您将生成负面特征。然而,多标称NB并不具有负面特征。请参考这些问题。

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

相关内容

  • 没有找到相关文章

最新更新