2017-07-11 1 views
2

Ich habe erfolgreich ein logistisches Regressionsmodell aus dem scikit-learn SGDClassifier Paket ausgeführt, kann aber die Koeffizienten des Modells (Zugriff über SGDClassifier.coef_) nicht einfach interpretieren, da die Eingabedaten über Scikit transformiert wurden -learns OneHotEncoder.Abrufen von Originalvariablen nach Scikit Model Run mit OneHotEncoding

My ursprünglichen Eingangsdaten X ist der Form (12000,11):

X = np.array([[1,4,3...9,4,1], 
       [5,9,2...3,1,4], 
       ... 
       [7,8,1...6,7,8] 
       ]) 

I dann eine heiße Codierung angewendet:

from sklearn.preprocessing import OneHotEncoder 
enc = OneHotEncoder() 
X_OHE = enc.fit_transform(X).toarray() 

die eine Anordnung von Form erzeugt (12000, 696) :

X_OHE = np.array([[1,0,1...0,0,1], 
       [0,0,0...0,1,0], 
        ... 
       [1,0,1...0,0,1] 
       ]) 

ich dann die die prod mit SGDClassifier.coef_ Koeffizienten zuzugreifen Modell uces eine Reihe von Form (1696):

coefs = np.array([[-1.233e+00,0.9123e+00,-2.431e+00...-0.238e+01,-1.33e+00,0.001e-01]]) 

Wie ich die Koeffizientenwerte ordne wieder auf die ursprünglichen Werte in X, so kann ich etwas sagen wie: „wenn die Variable foo einen Wert von bar hat, das Ziel Variable erhöht/verringert sich um bar_coeff "?

Lassen Sie mich wissen, wenn Sie mehr Informationen über die Daten oder die Modellparameter benötigen. Vielen Dank.

fand ich eine offene Frage dazu auf SO: How to retrieve coefficient names after label encoding and one hot encoding on scikit-learn?

+0

Nehmen wir an, ein einzelnes Feature in Originaldaten wird in ein Hot-codierten Daten in 4 Features konvertiert. Alle diese 4 Funktionen haben unterschiedliche Koeffizienten, wie wollen Sie diese in die ursprüngliche Funktion kombinieren? –

+0

Ich denke, Sie haben gerade die gleiche Frage gestellt, die ich oben gepostet habe. – NickBraunagel

+0

Ja, genau das habe ich versucht zu sagen. Es ist nicht in der Bibliothek verfügbar, da es keine feste Möglichkeit ist, die Ergebnisse zu interpretieren. Die andere Frage, die Sie verlinkt haben, besagt, dass sie auf Cross-validiert gestellt wurde, hier aber verwiesen wird. Ich würde dir raten, dies nochmal auf Kreuz-validiert zu stellen, aber nicht mit dem aktuellen Frageformular. Entfernen Sie lieber die Bibliotheken und die Programmierung und beschreiben Sie einfach, was Sie tun möchten und welche Best Practices dafür geeignet sind. Wenn und wenn Sie einen zufriedenstellenden Weg finden, die einheiß codierten Koeffe zu interpretieren, versuchen Sie es zu programmieren. Hoffe ich bin klar. –

Antwort

1

Nachdem diesen Benutzer detaillierte Erklärung OneHotEncoderhere Überprüfung konnte ich einen (etwas Hack-y) Ansatz in Bezug Modellkoeffizienten wieder auf den ursprünglichen erstellen Datensatz.

Angenommen, Sie haben richtig Setup Ihre OneHotEncoder:

from sklearn.preprocessing import OneHotEncoder 
from scipy import sparse 

enc = OneHotEncoder() 
X_OHE = enc.fit_transform(X) # X and X_OHE as described in question 

Und Sie haben lief erfolgreich ein GLM-Modell, sagen:

from sklearn import linear_model 

clf = linear_model.SGDClassifier() 
clf.fit(X_train, y_train) 

Welche Koeffizienten hat clf.coef_:

print clf.coef_ 
# np.array([[-1.233e+00,0.9123e+00,-2.431e+00...-0.238e+01,-1.33e+00,0.001e-01]]) 

Sie können den folgenden Ansatz verwenden, um die codierten 1 und 0 zu verfolgen in X_OHE zurück zu den ursprünglichen Werten in X. Ich würde empfehlen, die erwähnte detaillierte Erklärung auf OneHotEncoding (Link oben) zu lesen, sonst wird der folgende wie Kauderwelsch aussehen. Aber kurz gesagt, die folgende Iteration über jede feature in X_OHE und verwendet den feature_indices internen Parameter enc, um die Übersetzung zu machen.

import pandas as pd 
import numpy as np 
results = [] 

for i in range(enc.active_features_.shape[0]): 
    f = enc.active_features_[i] 

    index_range = np.extract(enc.feature_indices_ <= f, enc.feature_indices_) 
    s = len(index_range) - 1 
    f_index = index_range[-1] 
    f_label_decoded = f - f_index 

    results.append({ 
      'label_decoded_value': f_label_decoded, 
      'coefficient': clf.coef_[0][i] 
     }) 

R = pd.DataFrame.from_records(results) 

Wo R wie folgt aussieht (I codierte Original die Namen der Abteilungen des Unternehmens):

coefficient label_decoded_value 
3.929413 DepartmentFoo1 
3.718078 DepartmentFoo2 
3.101869 DepartmentFoo3 
2.892845 DepartmentFoo4 
... 

So, jetzt können Sie sagen: „Die Zielvariablen erhöht sich um 3,929413, wenn ein Mitarbeiter in Abteilung "Foo1".

Verwandte Themen