Важность особенностей от Scikit-Learn Pipeline (SVC) - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующие конвейеры, я хочу получить характеристики функций по каждому классу. У меня есть три класса («Художественная литература», «Не художественная литература», «Нет»). Я использую классификатор 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 голосов
/ 17 сентября 2018

Вы делаете все правильно, кроме этой строки:

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.

.
...