2014-06-17 9 views
8

Ich bin mir ziemlich sicher, dass es vor gefragt worden ist, aber ich bin nicht in der Lage, eine Antwortsklearn logistische Regression - wichtige Funktionen

Ausführen logistische Regression sklearn auf Python zu finden, ich bin in der Lage meine Datensatz Transformation seine wichtigsten Funktionen mit der Transform-Methode

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

Wie kann ich sagen, welche Features als am wichtigsten ausgewählt wurden? allgemeiner wie kann ich den p-Wert jedes Merkmals im Datensatz berechnen?

Antwort

1

Sie können die Koeffizienten im Attribut coef_ des angepassten Modells betrachten, um zu sehen, welche Merkmale am wichtigsten sind. (Bei LogisticRegression prüft transform gerade, welche Koeffizienten im absoluten Wert am höchsten sind.)

Die meisten Scikit-Lern-Modelle bieten keine Möglichkeit zur Berechnung von p-Werten. Im Großen und Ganzen sind diese Modelle so ausgelegt, dass sie dazu verwendet werden können, Ausgaben vorherzusagen und nicht zu inspizieren, um zu verstehen, wie die Vorhersage gemacht wird. Wenn Sie an p-Werten interessiert sind, können Sie sich statsmodels ansehen, obwohl es etwas weniger reif ist als sklearn.

+2

Es ist mein Verständnis, dass die coefs_ Größe kein Maß für die Merkmalsbedeutung ist. Kannst du mir erklären, wie ich die Zahlen betrachten soll? Danke – mel

+0

@mel: Mit Blick auf den Quellcode kann ich sehen, dass 'LogisticRegression.transform' in der Tat' coef_' verwendet, um die Wichtigkeit der Funktion zu bewerten. Es werden nur Koeffizienten mit einem höheren absoluten Wert als wichtiger angesehen. Der entsprechende Code lautet [hier] (https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/feature_selection/from_model.py). Wenn Sie eine andere Definition von "Wichtigkeit" möchten, müssen Sie erklären, was das ist. – BrenBarn

+3

In der Tat ist 'np.abs (coef_)' ein schrecklicher Versuch, die Bedeutsamkeit eines Merkmals zu quantifizieren - ein Konzept, das in einer multivariaten Einstellung sowieso nicht viel Sinn macht (dh die Variablen wirken gemeinsam, um die Vorhersage zu treffen), außer Ihr Modell variable Auswahl, z durch Sparsity. Wenn das Modell Sparsity fördert, dann können Sie die Variablen, deren Gewichte Null sind, verwerfen, aber das ist technisch alles, was Sie wirklich tun können, wenn Sie streng sein wollen.Einige andere Modelle zeigen 'feature_importance' an und je nach Modell ist dies ein mehr oder weniger univariates Maß dafür, wie gut diese Funktion Daten erklärt. – eickenberg

3

LogisticRegression.transform nimmt einen threshold Wert, der bestimmt, welche Funktionen beibehalten werden. Direkt aus dem Docstring:

Schwellenwert: string, float oder None, optional (Standardwert = Keine) Der Schwellenwert für die Featureauswahl. Funktionen, deren Wichtigkeit größer oder gleich ist, werden beibehalten, während die anderen verworfen werden. Wenn "median" (bzw. "mean"), dann ist der Schwellwert der Median (bzw. der Mittelwert) der Feature-Importanzen. Ein Skalierungsfaktor (z. B. "1,25 * Mittelwert") kann ebenfalls verwendet werden. Wenn Keine und wenn verfügbar ist, wird das Objektattribut threshold verwendet. Ansonsten wird "mean" standardmäßig verwendet.

Es gibt kein Objektattribut threshold auf LR-Schätzern. Daher werden standardmäßig nur die Merkmale beibehalten, deren absoluter Wert höher ist als der Mittelwert (nach Summierung über die Klassen).

1

Wie in den obigen Kommentaren vorgeschlagen, können (und sollten) Sie Ihre Daten vor der Anpassung skalieren, um die Koeffizienten vergleichbar zu machen. Unten ist ein kleiner Code um zu zeigen, wie das funktionieren würde. Ich folge this Format zum Vergleich.

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

Der Kürze halber können Sie auch 'scale' statt' StandardScaler' verwenden: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.scale.html – istewart

Verwandte Themen