У меня есть следующие конвейеры, я хочу получить характеристики каждого класса. У меня три класса («Художественная литература», «Не-художественная литература», «Нет»). Я использую классификатор 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?
Привет, @VivekKumar, этот код для доступа к шагам из конвейера, чтобы получить функции, но я не уверен, что это точный способ сделать это
Вот почему я спросил. Вы получили доступ к функциям только из первой части FeatureUnion, но не из второй.
Спасибо, что указали на это @VivekKumar, но даже после добавления каждой функции я все еще не могу получить доступ к wights. Есть ли другой способ, кроме eli5. что-то с coef_ может быть?
Как ты это делаешь
Я только что отредактировал пост с необходимыми деталями. Надеюсь, теперь все ясно
Вы все делаете правильно, кроме этой строки:
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
Объясните, пожалуйста, что вы делаете в этом коде:
feature_names=model.named_steps['feats'].transformer_list[0][1].named_steps['tfidf'].get_feature_names()
?