Gly*_*yph 4 python tf-idf pandas scikit-learn
如何在用于交叉验证的 sklearn 管道内让 TFIDF Vectorizer 返回具有相应列名的 Pandas 数据帧?
我有一个 Sklearn 管道,其中一个步骤是一个 TFIDF 向量化器:
class InspectPipeline(BaseEstimator, TransformerMixin):
def transform(self, x):
return x
def fit(self, x, y=None):
self.df = x
return self
pipeline = Pipeline(
[
("selector", ItemSelector(key="text_column")),
("vectorizer", TfidfVectorizer()),
("debug", InspectPipeline()),
("classifier", RandomForestClassifier())
]
)
Run Code Online (Sandbox Code Playgroud)
我创建了这个类InspectPipeline,以便稍后检查传递给分类器的特征是什么(通过运行pipeline.best_estimator_.named_steps['debug'].df)。但是, TfidfVectorizer 返回一个稀疏矩阵,这是我在执行时得到的pipeline.best_estimator_.named_steps['debug'].df。我想将 TFIDF 向量作为 Pandas 数据帧,而不是获得稀疏矩阵,其中列名是各自的 tfidf 标记。
我知道这tfidf_vectorizer.get_feature_names()有助于了解列名。但是如何在管道中包含这个 + 将稀疏矩阵转换为数据帧?
您可以扩展 TfidfVectorizer 以返回具有所需列名的 DataFrame,并在您的管道中使用它。
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
class DenseTfidfVectorizer(TfidfVectorizer):
def transform(self, raw_documents, copy=True):
X = super().transform(raw_documents, copy=copy)
df = pd.DataFrame(X.toarray(), columns=self.get_feature_names())
return df
def fit_transform(self, raw_documents, y=None):
X = super().fit_transform(raw_documents, y=y)
df = pd.DataFrame(X.toarray(), columns=self.get_feature_names())
return df
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2594 次 |
| 最近记录: |