Значение ключа принимает метку столбца panda dataframe. При использовании в вашем конвейере его можно применять как:

я есть Dataframe, который можно упростить до этого:

import pandas as pd

df = pd.DataFrame([{
'title': 'batman',
'text': 'man bat man bat', 
'url': 'batman.com', 
'label':1}, 
{'title': 'spiderman',
'text': 'spiderman man spider', 
'url': 'spiderman.com', 
'label':1},
{'title': 'doctor evil',
 'text': 'a super evil doctor', 
'url': 'evilempyre.com', 
'label':0},])

И я хочу попробовать разные методы извлечения функций: TFIDF, word2vec, Coutvectorizer с разными настройками ngram и т. Д. Но я хочу попробовать это в разных комбинациях: один набор функций будет содержать «текстовые» данные, преобразованные с помощью TFIDF, и «url» с Countvectoriser и second будут иметь текстовые данные, преобразованные с помощью w2v, и url с помощью TFIDF и так далее. В конце, конечно же, я хочу сравнить различные стратегии предварительной обработки и выбрать лучшую.

И вот вопросы:

Есть ли способ сделать такие вещи, используя стандартные инструменты sklearn, такие как Pipeline?

Есть ли в моей идее здравый смысл? Может быть, есть хорошие идеи, как обрабатывать текстовые данные со многими столбцами в кадрах данных, которые мне не хватает?

Большое спасибо!

Ответы на вопрос(1)

Решение Вопроса

FeatureUnion а такжеFunctionTransformer чтобы сделать это, но я думаю, что это может использовать немного больше деталей.

Прежде всего, я бы сказал, что вам нужно определить свойFunctionTransformer функции, которые они могут обрабатывать и возвращать ваши входные данные должным образом. В этом случае я предполагаю, что вы просто хотите передать DataFrame, но убедитесь, что вы вернули массив правильной формы для использования в нисходящем направлении. Поэтому я бы предложил передать только DataFrame и доступ по имени столбца. Вот так:

def text(X):
    return X.text.values

def title(X):
    return X.title.values

pipe_text = Pipeline([('col_text', FunctionTransformer(text, validate=False))])

pipe_title = Pipeline([('col_title', FunctionTransformer(title, validate=False))])

Теперь, чтобы проверить вариации трансформаторов и классификаторов. Я бы предложил использовать список преобразователей и список классификаторов и просто выполнять их итерацию, очень похоже на поиск по сетке.

tfidf = TfidfVectorizer()
cv = CountVectorizer()
lr = LogisticRegression()
rc = RidgeClassifier()

transformers = [('tfidf', tfidf), ('cv', cv)]
clfs = [lr, rc]

best_clf = None
best_score = 0
for tran1 in transformers:
    for tran2 in transformers:
        pipe1 = Pipeline(pipe_text.steps + [tran1])
        pipe2 = Pipeline(pipe_title.steps + [tran2])
        union = FeatureUnion([('text', pipe1), ('title', pipe2)])
        X = union.fit_transform(df)
        X_train, X_test, y_train, y_test = train_test_split(X, df.label)
        for clf in clfs:
            clf.fit(X_train, y_train)
            score = clf.score(X_test, y_test)
            if score > best_score:
                best_score = score
                best_est = clf

Это простой пример, но вы можете увидеть, как вы могли бы таким образом подключать любые преобразования и классификаторы.

Ваш ответ на вопрос