Как вернуть фрейм данных из sklearn TFIDF Vectorizer в конвейере? - PullRequest
0 голосов
/ 11 октября 2018

Как я могу заставить TFIDF Vectorizer возвращать фрейм данных pandas с соответствующими именами столбцов внутри конвейера sklearn, используемого для перекрестной проверки?

У меня есть конвейер 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())
        ]
)

Я создал класс InspectPipeline, чтобы позже проверить, какие функции были переданы в классификатор (запустив pipeline.best_estimator_.named_steps['debug'].df).Однако TfidfVectorizer возвращает разреженную матрицу, которую я получаю, когда делаю pipeline.best_estimator_.named_steps['debug'].df.Вместо того, чтобы получать разреженную матрицу, я хотел бы получить вектор TFIDF в качестве кадра данных pandas, где имена столбцов являются соответствующими токенами tfidf.

Я знаю, что tfidf_vectorizer.get_feature_names() может помочь узнать имена столбцов.Но как я могу включить это + преобразование разреженной матрицы в кадр данных внутри конвейера?

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

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

a.Прямой доступ к .get_feature_names() вне конвейера и проверка кадра данных (с именованными столбцами) там

b. применить .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 из конвейера и проверить кадр данных вне конвейера.

0 голосов
/ 11 октября 2018

Вы можете расширить 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
...