Конвейер 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')

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]))

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

Другие вопросы по тегам