web-dev-qa-db-fra.com

Déterminer les fonctionnalités les plus contributives pour le classificateur SVM dans sklearn

J'ai un ensemble de données et je veux former mon modèle sur ces données. Après la formation, j'ai besoin de connaître les fonctionnalités qui contribuent le plus à la classification d'un classificateur SVM.

Il y a quelque chose appelé importance des fonctionnalités pour les algorithmes forestiers, y a-t-il quelque chose de similaire?

19
Jibin Mathew

Oui, il y a un attribut coef_ pour le classificateur SVM mais cela ne fonctionne que pour SVM avec noyau linéaire . Pour les autres noyaux, cela n'est pas possible car les données sont transformées par la méthode du noyau dans un autre espace, qui n'est pas lié à l'espace d'entrée, vérifiez explication .

from matplotlib import pyplot as plt
from sklearn import svm

def f_importances(coef, names):
    imp = coef
    imp,names = Zip(*sorted(Zip(imp,names)))
    plt.barh(range(len(names)), imp, align='center')
    plt.yticks(range(len(names)), names)
    plt.show()

features_names = ['input1', 'input2']
svm = svm.SVC(kernel='linear')
svm.fit(X, Y)
f_importances(svm.coef_, features_names)

Et la sortie de la fonction ressemble à ceci: Feature importances

21
Jakub Macina

J'ai créé une solution qui fonctionne également pour Python 3 et est basée sur l'extrait de code de Jakub Macina.

from matplotlib import pyplot as plt
from sklearn import svm

def f_importances(coef, names, top=-1):
    imp = coef
    imp, names = Zip(*sorted(list(Zip(imp, names))))

    # Show all features
    if top == -1:
        top = len(names)

    plt.barh(range(top), imp[::-1][0:top], align='center')
    plt.yticks(range(top), names[::-1][0:top])
    plt.show()

# whatever your features are called
features_names = ['input1', 'input2', ...] 
svm = svm.SVC(kernel='linear')
svm.fit(X_train, y_train)

# Specify your top n features you want to visualize.
# You can also discard the abs() function 
# if you are interested in negative contribution of features
f_importances(abs(clf.coef_[0]), feature_names, top=10)

Feature importance

1
Christoph Schmidl

En une seule ligne de code:

s'adapter à un modèle SVM:

from sklearn import svm
svm = svm.SVC(gamma=0.001, C=100., kernel = 'linear')

et implémentez le tracé comme suit:

pd.Series(abs(svm.coef_[0]), index=features.columns).nlargest(10).plot(kind='barh')

Le résultat sera:

les caractéristiques les plus contributives du modèle SVM en valeurs absolues

1
Dor