Как вернуть фрейм данных из sklearn TFIDF Vectorizer в конвейере?

1

Как я могу заставить 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() может помочь узнать имена столбцов. Но как я могу включить это + преобразование разреженной матрицы в кадр данных в рамках конвейера?

  • 0
    Достаточно ли мала плотная версия разреженной матрицы, чтобы поместиться в памяти?
  • 0
    Да, у меня достаточно памяти для плотной версии матрицы. Моя проблема, скорее, как я могу сделать это преобразование внутри конвейера
Теги:
pandas
scikit-learn
tf-idf

2 ответа

2
Лучший ответ

Вы можете расширить 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
  • 0
    Это работает! Спасибо, что! Мне также пришлось заменить `(" vectorizer ", DenseTfidfVectorizer (TfidfVectorizer ())` в моем конвейере
  • 0
    Изменить: должны использовать следующее в конвейере: ("vectorizer", DenseTfidfVectorizer (max_df = 0.5))
0

Согласно документам, вы можете использовать следующий подход к

а. напрямую обращаться к .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 из всего конвейера и проверить рамку данных за пределами конвейера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню