Как я могу заставить TFIDF Vectorizer возвращать фрейм данных pandas с соответствующими именами столбцов, внутри конвейера sklearn, используемого для перекрестной проверки?
У меня есть Sklearn Pipeline, где одним из шагов является 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())
]
)
Я создал класс 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
Согласно документам, вы можете использовать следующий подход к
а. напрямую обращаться к .get_feature_names()
за пределами конвейера и проверять фрейм данных (с именованными столбцами) там
б. применять .fit_transform
по данным вне трубопровода
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
из всего конвейера и проверить рамку данных за пределами конвейера.