Scikit-learn 的管道:多标签分类错误。传递了一个稀疏矩阵
Scikit-learn's Pipeline: Error with multilabel classification. A sparse matrix was passed
我正在使用不同的机器学习算法实现不同的 classifier。
我正在整理文本文件,操作如下:
classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)
当我使用GaussianNB算法时出现以下错误:
TypeError: A sparse matrix was passed, but dense data is required.
Use X.toarray () to convert to a dense numpy array.
我看到了下面的post
在此post中创建了一个class来执行数据转换。
可以使用 TfidfTransformer 调整我的代码。
我该如何解决这个问题?
您可以执行以下操作:
class DenseTransformer(TransformerMixin):
def transform(self, X, y=None, **fit_params):
return X.todense()
def fit_transform(self, X, y=None, **fit_params):
self.fit(X, y, **fit_params)
return self.transform(X)
def fit(self, X, y=None, **fit_params):
return self
classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('to_dense', DenseTransformer()),
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)
现在,作为管道的一部分,数据将转换为密集表示。
顺便说一句,我不知道你的限制,但也许你可以使用另一个分类器,例如 RandomForestClassifier or SVM 接受稀疏表示中的数据。
我正在使用不同的机器学习算法实现不同的 classifier。
我正在整理文本文件,操作如下:
classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)
当我使用GaussianNB算法时出现以下错误:
TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray () to convert to a dense numpy array.
我看到了下面的post
在此post中创建了一个class来执行数据转换。 可以使用 TfidfTransformer 调整我的代码。 我该如何解决这个问题?
您可以执行以下操作:
class DenseTransformer(TransformerMixin):
def transform(self, X, y=None, **fit_params):
return X.todense()
def fit_transform(self, X, y=None, **fit_params):
self.fit(X, y, **fit_params)
return self.transform(X)
def fit(self, X, y=None, **fit_params):
return self
classifier = Pipeline([
('vectorizer', CountVectorizer ()),
('TFIDF', TfidfTransformer ()),
('to_dense', DenseTransformer()),
('clf', OneVsRestClassifier (GaussianNB()))])
classifier.fit(X_train,Y)
predicted = classifier.predict(X_test)
现在,作为管道的一部分,数据将转换为密集表示。
顺便说一句,我不知道你的限制,但也许你可以使用另一个分类器,例如 RandomForestClassifier or SVM 接受稀疏表示中的数据。