Важность функций из scikit -learn pipeline (svc)

У меня есть следующие конвейеры, я хочу получить характеристики каждого класса. У меня три класса («Художественная литература», «Не-художественная литература», «Нет»). Я использую классификатор 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 has a wrong length: expected=47783, got=10528

Как получить ранг черт характера по отношению к каждому классу? их способ сделать это без eli5?

Объясните, пожалуйста, что вы делаете в этом коде: feature_names=model.named_steps['feats'].transformer_list[0]‌​[1].named_steps['tfi‌​df'].get_feature_nam‌​es()?

Vivek Kumar 10.09.2018 11:35

Привет, @VivekKumar, этот код для доступа к шагам из конвейера, чтобы получить функции, но я не уверен, что это точный способ сделать это

Abrial 10.09.2018 11:44

Вот почему я спросил. Вы получили доступ к функциям только из первой части FeatureUnion, но не из второй.

Vivek Kumar 10.09.2018 11:49

Спасибо, что указали на это @VivekKumar, но даже после добавления каждой функции я все еще не могу получить доступ к wights. Есть ли другой способ, кроме eli5. что-то с coef_ может быть?

Abrial 10.09.2018 11:52

Как ты это делаешь

Vivek Kumar 10.09.2018 12:02

Я только что отредактировал пост с необходимыми деталями. Надеюсь, теперь все ясно

Abrial 10.09.2018 12:10
1
6
1 165
1

Ответы 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.

Он также мог сделать list_features += f2

Mindcraft 18.09.2018 03:19

Другие вопросы по теме