это небезопасная ситуация с конвейерами sk-learn. Всякий раз, когда я создаю конвейер в sk-learn и делаю некоторые прогнозы с этим конвейером, мне кажется, что я сталкиваюсь с проблемой, что на самом деле я не могу проверить промежуточные шаги конвейера. Прогнозы работают, я получаю свои баллы, но если я хочу получить «значения функций» для экземпляров или проверить, каковы функции векторизатора tf-idf, то конвейер утверждается, что он не подходит (хотя он только недавно использовался для умозаключение, и я уже назвал обучение этому).
Для примера, вызов .fit()
для следующего фрагмента из документации Scikit-learn из здесь работает для предсказания, но требует утверждения та же нерешенная проблема, когда я хочу проверить tfidf конвейера.
pipeline = Pipeline([
# Extract the subject & body
('subjectbody', SubjectBodyExtractor()),
# Use ColumnTransformer to combine the features from subject and body
('union', ColumnTransformer(
[
# Pulling features from the post's subject line (first column)
('subject', TfidfVectorizer(min_df=50), 0),
# Pipeline for standard bag-of-words model for body (second column)
('body_bow', Pipeline([
('tfidf', TfidfVectorizer()),
('best', TruncatedSVD(n_components=50)),
]), 1),
# Pipeline for pulling ad hoc features from post's body
('body_stats', Pipeline([
('stats', TextStats()), # returns a list of dicts
('vect', DictVectorizer()), # list of dicts -> feature matrix
]), 1),
],
# weight components in ColumnTransformer
transformer_weights={
'subject': 0.8,
'body_bow': 0.5,
'body_stats': 1.0,
}
)),
# Use a SVC classifier on the combined features
('svc', LinearSVC(dual=False)),
], verbose=True)
После подгонки конвейера к данным (как сделано в ссылке), когда я пытаюсь получить доступ к векторизатору, используя
pipeline.named_steps.union.transformers[1][1].named_steps['tfidf'].get_feature_names()
он утверждает, что «словарь не установлен или не предоставлен».
Итак, это мое недоразумение о трубопроводах? Разве мы не должны получить доступ к промежуточным этапам? Или настройку, возможно, нужно настроить?