Конвейер sklearn: запустить TfidfVectorizer на полном обучающем наборе перед применением TimeSeriesSplit внутри GridSearchCV?

Я уверен, что это возможно, но я не смог понять это. Дайте набор обучающих данных, используя TimeSeriesSplit с num_split=5, разделение выглядит следующим образом:

[0] : [1]
[0 1] : [2]
[0 1 2] : [3]
[0 1 2 3] : [4]
[0 1 2 3 4] : [5]

Проблема в том, что для первой пары проходов TfidfVectorizer работает с номинальным количеством слов/функций, и я хотел бы запустить это на всем тренировочном наборе перед разделением, чтобы размер функции оставался одинаковым для всех разделений.

За исключением этого, однако, знает ли кто-нибудь способ при использовании TimeSeriesSplit передать только два последних разделения в серии? Таким образом, вместо всех 5 разделений GridSearchCV использует только эти два:

[0 1 2 3] : [4]
[0 1 2 3 4] : [5]

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

Спасибо.

РЕДАКТИРОВАТЬ:

Конвейер, который я использую, по сути, TfidfVectorizer, а затем классификатор. Но, проведя некоторую проверку данных и функций, похоже, что набор данных разбивается перед передачей в TfidVectorizer(). Вот широкие мазки:

tscv = TimeSeriesSplit(n_splits=5)
pipe = Pipeline([('tfidf', TfidfVectorizer(), 'rfc', RandomForestClassifier()])
grid = GridSearchCV(pipe, params, cv=tscv, scoring='roc_auc')

person HodorTheCoder    schedule 21.02.2019    source источник
comment
Как выглядит реальный конвейер, который вы используете? Векторизатор должен применяться до любого разделения.   -  person G. Anderson    schedule 21.02.2019
comment
Отредактирован основной пост с информацией о конвейере.   -  person HodorTheCoder    schedule 22.02.2019
comment
@ G.Anderson Нет, все шаги в конвейере будут выполняться только после разделения, вызывая fit() для обучающих данных и только transform() и predict() для тестовых данных разделения.   -  person Vivek Kumar    schedule 22.02.2019
comment
Не рекомендуется запускать TfidfVectorizer для всех данных, а затем выполнять разбиение, и это сведет на нет всю цель перекрестной проверки. Однако можно сделать и другую вещь (отправить только два последних разделения). Вы хотите выполнить эту двойную проверку?   -  person Vivek Kumar    schedule 22.02.2019
comment
Перекрестная проверка с использованием суперсетов уже как бы побеждает цель. По крайней мере, при обычном CV размер вашего поезда/теста идентичен для каждой итерации, но использование надмножеств, которые радикально меняют тренировочный набор с каждой итерацией, в свою очередь, резко меняет количество функций, которые может извлечь TfidfVectorizer. Я вижу обе стороны медали. Чтобы ответить на ваш другой вопрос, да, я хотел бы знать, как это сделать, используя 2-кратную (или 3-, или 4-кратную, и т. д.) проверку только с использованием последних 2, 3 или 4 надмножеств. Спасибо!   -  person HodorTheCoder    schedule 22.02.2019
comment
@VivekKumar Спасибо за ваши ответы. Я смог выяснить, как отключить перекрестную проверку с помощью лямбда-хака, но это полностью противоречит цели передачи наборов данных CV. Ваш метод передачи статических индексов для CV похож на этот? stackoverflow.com/questions/50010065/   -  person HodorTheCoder    schedule 24.02.2019


Ответы (1)


Кажется, это делает то, что я хочу. Не понимал, что вы можете просто передать cv итерабельный объект. Все, что вам нужно сделать, это создать разделение временных рядов или любое другое разделение, которое вы хотите, и передать итерацию, содержащую индексы. Итак, если у вас есть набор данных из 10 элементов, и вы просто хотите разделить два последних временных ряда num_split=4, вы просто передадите это в cv:

cv = [([0, 1, 2, 3, 4, 5], [6, 7]),
      ([0, 1, 2, 3, 4, 5, 6, 7], [8, 9]))

Таким образом, вы можете передать любой кортеж итерируемых объектов.

person HodorTheCoder    schedule 25.02.2019