DictVectorizer узнает больше возможностей для учебного набора - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующий код, который работает как ожидалось:

clf = Pipeline([
    ('vectorizer', DictVectorizer(sparse=False)),
    ('classifier', DecisionTreeClassifier(criterion='entropy'))
])

clf.fit(X[:size], y[:size])

score = clf.score(X_test, y_test)

Я хотел сделать ту же логику без использования конвейера:

v = DictVectorizer(sparse=False)

Xdv = v.fit_transform(X[:size])
Xdv_test = v.fit_transform(X_test)

clf = DecisionTreeClassifier(criterion='entropy')
clf.fit(Xdv[:size], y[:size])

clf.score(Xdv_test, y_test)

Но я получаю следующую ошибку:

ValueError: Number of features of the model must match the input. Model n_features is 8251 and input n_features is 14303

Кажется, что DictVectorizer изучает больше возможностей для тестового набора, чем для обучающего набора. Я хочу знать, как Pipeline решает эту проблему и как я могу сделать то же самое.

1 Ответ

0 голосов
/ 30 апреля 2018

Не звоните fit_transform снова.

Сделайте это:

Xdv_test = v.transform(X_test)

Когда вы делаете fit() или fit_transform(), векторизатор dict забудет об особенностях, изученных во время предыдущего вызова (на данных тренировки), и снова установится, следовательно, будет другое количество функций.

Pipeline автоматически обрабатывает тестовые данные соответствующим образом, когда вы делаете clf.score(X_test, y_test) на конвейере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...