如何 return 来自管道内 sklearn TFIDF Vectorizer 的数据帧?
How to return a dataframe from sklearn TFIDF Vectorizer within pipeline?
如何在用于交叉验证的 sklearn 管道中将 TFIDF Vectorizer return 具有相应列名的 pandas 数据帧?
我有一个 Sklearn 管道,其中一个步骤是 TFIDF Vectorizer:
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())
]
)
我创建了 class InspectPipeline
以便稍后检查传递给 classifier 的功能是什么(通过 运行 pipeline.best_estimator_.named_steps['debug'].df
) .但是,TfidfVectorizer return 是一个稀疏矩阵,这是我在 pipeline.best_estimator_.named_steps['debug'].df
时得到的。我不想获得稀疏矩阵,而是希望将 TFIDF 向量作为 pandas 数据帧,其中列名是相应的 tfidf 标记。
我知道 tfidf_vectorizer.get_feature_names()
可以帮助了解列名。但是我如何在管道中包含这个 + 将稀疏矩阵转换为数据帧?
您可以将 TfidfVectorizer 扩展为 return 具有所需列名的 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
根据docs,您可以使用以下方法
一个。直接访问管道外的 .get_feature_names()
并在那里检查数据框(带有命名列)
b。 apply .fit_transform
on data管道外
pipeline = Pipeline(....)
# a. extract .get_feature_names() to use as column names in the dataframe
feature_names = (
pipeline.best_estimator_
.named_steps['vectorizer']
.get_feature_names()
)
# b. get the TFIDF vector
data2 = (
pipeline.best_estimator_
.named_steps['vectorizer']
.fit_transform(raw_data)
)
# put into a pandas dataframe
transformed = pd.DataFrame(data2, columns=feature_names)
这样您或许可以完全跳过管道中的 debug
步骤并检查管道外的数据框。
如何在用于交叉验证的 sklearn 管道中将 TFIDF Vectorizer return 具有相应列名的 pandas 数据帧?
我有一个 Sklearn 管道,其中一个步骤是 TFIDF Vectorizer:
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())
]
)
我创建了 class InspectPipeline
以便稍后检查传递给 classifier 的功能是什么(通过 运行 pipeline.best_estimator_.named_steps['debug'].df
) .但是,TfidfVectorizer return 是一个稀疏矩阵,这是我在 pipeline.best_estimator_.named_steps['debug'].df
时得到的。我不想获得稀疏矩阵,而是希望将 TFIDF 向量作为 pandas 数据帧,其中列名是相应的 tfidf 标记。
我知道 tfidf_vectorizer.get_feature_names()
可以帮助了解列名。但是我如何在管道中包含这个 + 将稀疏矩阵转换为数据帧?
您可以将 TfidfVectorizer 扩展为 return 具有所需列名的 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
根据docs,您可以使用以下方法
一个。直接访问管道外的 .get_feature_names()
并在那里检查数据框(带有命名列)
b。 apply .fit_transform
on data管道外
pipeline = Pipeline(....)
# a. extract .get_feature_names() to use as column names in the dataframe
feature_names = (
pipeline.best_estimator_
.named_steps['vectorizer']
.get_feature_names()
)
# b. get the TFIDF vector
data2 = (
pipeline.best_estimator_
.named_steps['vectorizer']
.fit_transform(raw_data)
)
# put into a pandas dataframe
transformed = pd.DataFrame(data2, columns=feature_names)
这样您或许可以完全跳过管道中的 debug
步骤并检查管道外的数据框。