scikit -learn pipe(SVC)对功能的重要性

时间:2018-09-10 09:20:39

标签: python scikit-learn svm

我有以下管道,我想就每个类获取功能方面的信息。我有三个班级(“小说”,“无小说”,“无”)。我使用的分类器是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,他们可以做到吗?

1 个答案:

答案 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