У меня есть набор данных с примерно 13 тыс. признаков, и я хочу выбрать признаки, которые в наибольшей степени способствуют классификации определенного ярлыка.
Я использую класс sklearn.svm.LinearSVC для данных одной ячейки.
Атрибут coef_ должен предоставлять эту информацию (насколько я понял), но при исключении 10-100 лучших функций из coef_ точность/мультикласс f1-score не уменьшается.
Кто-нибудь знает, как извлечь эту информацию на основе обученной модели?
Ниже я предоставил пример кода, который делает то же самое, но с набором данных с открытым исходным кодом!
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy as np
data = load_iris(return_X_y=True, as_frame=True)
print(data[1].unique()) # [0 1 2] -> three classes
svc = LinearSVC()
svc.fit(data[0], data[1])
score = svc.score(data[0], data[1])
print(svc.coef_.shape) # (3, 4)
fig, axs = plt.subplots(1, 3, figsize=(15, 7))
for label, ax in enumerate(axs.flatten()):
args = np.argsort(-svc.coef_[label])
vals = [svc.coef_[label][arg] for arg in args]
ax.bar(args, vals)
ax.title.set_text(f"{label}")
plt.tight_layout()
if __name__ == '__main__':
plt.show()
Если вы удаляете информативные функции и не видите, что оценка точности снижается, то а) проверьте утечку данных между вашими функциями и целями (одна вещь, которую нужно проверить, это минимальное количество функций, необходимых для поддержания той же оценки) и б) попробуйте другую меру (точность, отзыв, оценка F1)