Python 是否可以将PCA应用于任何文本分类?

Python 是否可以将PCA应用于任何文本分类?,python,scikit-learn,pca,naivebayes,Python,Scikit Learn,Pca,Naivebayes,我正在尝试用python进行分类。我正在为网页使用朴素贝叶斯多项式NB分类器(从web到文本检索数据,稍后我对文本进行分类:web分类) 现在,我试图对这些数据应用PCA,但python给出了一些错误 我的朴素贝叶斯分类代码: from sklearn import PCA from sklearn import RandomizedPCA from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive

我正在尝试用python进行分类。我正在为网页使用朴素贝叶斯多项式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)
这种朴素贝叶斯分类给出了以下输出:

>>> 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
但这会引发以下错误:

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

我将矩阵转换为densematrix或numpy数组,然后我尝试对新的densematrix进行分类,但出现了错误

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

转换为密集阵列:

v_temizdatatodense = v_temizdata.todense()
pca_t = PCA().fit_transform(v_temizdatatodense)
最后尝试分类:

classifer.fit(pca_t,y_train)
最终分类错误:

提升值错误(“输入X必须为非负”)值错误:输入X 必须是非负的

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

我不会将
稀疏
矩阵转换为
密集
(这是不鼓励的),而是使用scikits learn,这是一种类似PCA的二元性减少算法(默认情况下使用随机化SVD),适用于稀疏数据:

svd = TruncatedSVD(n_components=5, random_state=42)
data = svd.fit_transform(data) 
引用
TruncatedSVD
文档:

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


这正是您的使用案例。

NaiveBayes分类器需要离散值特征,但PCA破坏了特征的此属性。如果要使用PCA,您必须使用不同的分类器

也许还有其他的降维方法可以用于NB,但我不知道这些。也许简单可以


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

问题是,通过应用降维,您将生成负特征。但是,多标称NB不接受负特征。请参考问题


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

我不明白为什么这不起作用。如何转换为密集数组,然后会出现什么错误?您使用的是旧版本的scikit learn吗?我认为在最近的版本中不可能使用sklearn import PCA的
。@kazemakase抱歉,我写错了。我可以转换为密集数组或numpy数组,但NaiveBayes不能使用新的数组密集矩阵。我补充说,这似乎比我的建议更有用。谢谢评论。但在截断SVD之后,naivebayes分类给出了相同的错误:raise VALUERROR(“输入X必须是非负的”)ValueError:输入X必须为非-negative@zer03正如错误告诉您的那样,您无法将负特征传递给多项式NB,而降维算法往往会这样做(将数据放在[-1,1]范围内)。因此,您可以选择另一种训练算法(不同于NB),或者您不应用PCA,但不能同时使用两者。从:
中,多项式分布通常需要整数特征计数。但是,在实践中,分数计数(如tf idf)也可能起作用。
@kazemakase您在NB中只允许正数的部分也是正确的,因此如果OP仍然想要我们e
MultinomialNB
,我的答案不再有效。但是如果他还想做降维,
TruncatedSVD
是一个不错的选择。@imaluenge。非常感谢兄弟。事实上,我已经研究了tf idf。如果我不能做其他分类(例如,SVM等)我将开始学习tf idf。实际上,我的主要目标是区分分类/PCA(或特征缩减)应用分类非常感谢所有答案@kazemakase。你也帮助了我。顺便说一句,这种方法可能会对结果产生不良影响。但即使如此,我还是会尝试
svd = TruncatedSVD(n_components=5, random_state=42)
data = svd.fit_transform(data)