我有以下管道,我想就每个类获取功能方面的信息。我有三个班级(“小说”,“无小说”,“无”)。我使用的分类器是SVC
。
Book_contents= Pipeline([('selector', ItemSelector(key='Book')),
('tfidf',CountVectorizer(analyzer='word',
binary=True,
ngram_range=(1,1))),
])
Author_description= Pipeline([('selector', ItemSelector(key='Description')),
('tfidf', CountVectorizer(analyzer='word',
binary=True,
ngram_range=(1,1))),
])
ppl = Pipeline([('feats', FeatureUnion([('Contents',Book_contents),
('Desc',Author_description)])),
('clf', SVC(kernel='linear',class_weight='balanced'))
])
model = ppl.fit(training_data, Y_train)
我尝试使用eli5,但出现功能名称和分类器不匹配的错误。
f1=model.named_steps['feats'].transformer_list[0][1].named_steps['tfidf'].get_feature_names()
f2=model.named_steps['feats'].transformer_list[1][1].named_steps['tfidf'].get_feature_names()
list_features=f1
list_features.append(f2)
explain_weights.explain_linear_classifier_weights(model.named_steps['clf'],
vec=None, top=20,
target_names=ppl.classes_,
feature_names=list_features)
我收到此错误:
feature_names的长度错误:期望= 47783,得到= 10528
如何获得每个类别的特征权重等级?没有eli5,他们可以做到吗?
答案 0 :(得分:1)
除了此行以外,您所做的所有操作都正确:
list_features.append(f2)
在这里,您将整个f2
列表作为元素附加到f1
列表中。这不是你想要的。
您要将f2的所有元素添加到f1。为此,您需要使用extend
。只需这样做:
list_features.extend(f2)
有关更多详细信息,请参阅此问题:
除此之外,我认为您叫explain_weights.explain_linear_classifier_weights
的方式是错误的。您只需要调用explain_weights(...)
,它将自动在内部调用explain_linear_classifier_weights
。