2014-06-17 25 views
8

Sono abbastanza sicuro che è stato chiesto prima, ma non riesco a trovare una rispostasklearn Regressione logistica - caratteristiche importanti

Esecuzione Regressione logistica utilizzando sklearn su Python, io sono in grado di trasformare il mio set di dati per le sue caratteristiche più importanti usando il metodo Transform

classf = linear_model.LogisticRegression() 
func = classf.fit(Xtrain, ytrain) 
reduced_train = func.transform(Xtrain) 

Come posso sapere quali funzioni sono state selezionate come le più importanti? più in generale come posso calcolare il valore p di ciascuna caratteristica nel set di dati?

risposta

1

È possibile osservare i coefficienti dell'attributo coef_ del modello montato per vedere quali caratteristiche sono più importanti. (Per LogisticRegression, tutto ciò che sta facendo transform sta guardando quali coefficienti sono i più alti in valore assoluto.)

La maggior parte dei modelli di apprendimento di scikit non fornisce un modo per calcolare i valori di p. In generale, questi modelli sono progettati per essere utilizzati per prevedere effettivamente le uscite, non per essere ispezionati per comprendere come viene eseguita la previsione. Se sei interessato ai valori di p puoi dare uno sguardo a statsmodels, anche se è un po 'meno maturo di sklearn.

+2

È a mia conoscenza che la dimensione di coefs_ non è una misura per l'importanza della funzionalità. potresti elidere come dovrei guardare i numeri? Grazie – mel

+0

@mel: Guardando il codice sorgente, posso vedere che 'LogisticRegression.transform' sta effettivamente usando' coef_' per valutare l'importanza della funzione. Considera solo i coefficienti con un valore assoluto più alto per essere più importanti. Il codice pertinente è [qui] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_selection/from_model.py). Se vuoi qualche altra definizione di "importanza" dovrai spiegare di cosa si tratta. – BrenBarn

+3

Infatti, 'np.abs (coef_)' è un terribile tentativo di quantificare l'importanza della funzione - un concetto che in realtà non ha molto senso in un'impostazione multivariata (cioè le variabili agiscono congiuntamente per fare la previsione) a meno che il tuo modello non selezione variabile, ad es attraverso la scarsità. Se il modello promuove la scarsità, allora puoi scartare le variabili il cui peso è pari a zero, ma questo è tecnicamente tutto ciò che puoi davvero fare se vuoi essere rigoroso.Alcuni altri modelli espongono 'feature_importance' e, a seconda del modello, questa è una misura più o meno univariata di quanto bene questa funzione spiega dat – eickenberg

3

LogisticRegression.transform prende un valore threshold che determina quali funzionalità conservare. Direttamente dalla docstring:

Soglia: stringa, float o Nessuno, facoltativo (valore predefinito = Nessuno) Il valore soglia da utilizzare per la selezione delle funzioni. Le funzioni di cui l'importanza è maggiore o uguale vengono mantenute mentre le altre sono scartate. Se "mediana" (risp. "Significa"), il valore di soglia è la mediana (o la media) delle importazioni di funzioni. È possibile utilizzare anche un fattore di scala (ad es. "1,25 * significa"). Se None e se è disponibile, viene utilizzato l'attributo dell'oggetto threshold. Altrimenti, "mean" viene utilizzato per impostazione predefinita.

Non esiste alcun attributo oggetto threshold su stimatori LR, quindi solo le funzioni con valore assoluto superiore alla media (dopo la somma delle classi) vengono mantenute per impostazione predefinita.

1

Come suggerito nei commenti sopra, è possibile (e dovrebbe) ridimensionare i dati prima della propria misura, rendendo così i coefficienti confrontabili. Di seguito è riportato un piccolo codice per mostrare come funzionerebbe. Seguo il formato this per il confronto.

import numpy as np  
from sklearn.linear_model import LogisticRegression 
from sklearn.preprocessing import StandardScaler 
import pandas as pd 
import matplotlib.pyplot as plt 

x1 = np.random.randn(100) 
x2 = np.random.randn(100) 
x3 = np.random.randn(100) 

#Make difference in feature dependance 
y = (3 + x1 + 2*x2 + 5*x3 + 0.2*np.random.randn()) > 0 

X = pd.DataFrame({'x1':x1,'x2':x2,'x3':x3}) 

#Scale your data 
scaler = StandardScaler() 
scaler.fit(X) 
X_scaled = pd.DataFrame(scaler.transform(X),columns = X.columns) 

clf = LogisticRegression(random_state = 0) 
clf.fit(X_scaled, y) 

feature_importance = abs(clf.coef_[0]) 
feature_importance = 100.0 * (feature_importance/feature_importance.max()) 
sorted_idx = np.argsort(feature_importance) 
pos = np.arange(sorted_idx.shape[0]) + .5 

featfig = plt.figure() 
featax = featfig.add_subplot(1, 1, 1) 
featax.barh(pos, feature_importance[sorted_idx], align='center') 
featax.set_yticks(pos) 
featax.set_yticklabels(np.array(X.columns)[sorted_idx], fontsize=8) 
featax.set_xlabel('Relative Feature Importance') 

plt.tight_layout() 
plt.show() 
+0

Per brevità puoi anche usare 'scale' invece di' StandardScaler': http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html – istewart