我正在尝试使用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 '' 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)
但这会引起以下错误:
提高类型错误("A稀疏矩阵获得通过,但密"类型错误:一种稀疏矩阵传递,但需要密集的数据使用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的错误:
提高ValueError("输入X必须为非负数")ValueError:输入X必须为非负数
一方面,我的数据(temizdata
)只放在Naive Bayes中,另一方面temizdata
首先放入PCA(用于减少输入)而不是分类.__
我不会将sparse
矩阵转换为dense
(不鼓励),而是使用scikits-learn's TruncatedSVD
,这是一种类似PCA的降维算法(默认情况下使用随机SVD),它可以处理稀疏数据:
svd = TruncatedSVD(n_components=5, random_state=42) data = svd.fit_transform(data)
并且,从TruncatedSVD
文档中引用:
特别是,截断的SVD在术语count/tf-idf矩阵上工作,由sklearn.feature_extraction.text中的矢量化器返回.在这种情况下,它被称为潜在语义分析(LSA).
这正是你的用例.