sklearn onehotencoder one labelencoder hot for examples categorical python numpy scikit-learn

python - onehotencoder - Cómo recuperar variables originales después de ejecutar Scikit Model w/OneHotEncoding



sklearn categorical variables (1)

He ejecutado con éxito un modelo de regresión logística del paquete SGDClassifier de scikit-learn, pero no puedo interpretar fácilmente los coeficientes del modelo (se accede a través de SGDClassifier.coef_ ) porque los datos de entrada se transformaron a través del OneHotEncoder de scikit-learn.

Mi información de entrada original X tiene forma (12000,11):

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

Luego apliqué una codificación en caliente:

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

que produce una matriz de forma (12000, 696):

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

Luego SGDClassifier.coef_ los coeficientes del modelo con SGDClassifier.coef_ que produce una matriz de forma (1,696):

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

¿Cómo puedo mapear los valores de los coeficientes a los valores originales en X , así que puedo decir algo como "si la variable foo tiene un valor de bar , la variable objetivo aumenta / disminuye con bar_coeff "?

Avíseme si necesita más información sobre los datos o los parámetros del modelo. Gracias.

Encontré una pregunta sin respuesta sobre esto en SO: ¿Cómo recuperar los nombres de los coeficientes después de la codificación de la etiqueta y una codificación en caliente en scikit-learn?


Después de revisar la explicación detallada de este usuario de OneHotEncoder aquí , pude crear un enfoque (algo de hack-y) para relacionar los coeficientes del modelo con el conjunto de datos original.

Suponiendo que ha configurado correctamente su 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

Y ha ejecutado con éxito un modelo GLM, por ejemplo:

from sklearn import linear_model clf = linear_model.SGDClassifier() clf.fit(X_train, y_train)

Que tiene coeficientes 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]])

Puede usar el enfoque a continuación para rastrear los 1 y 0 codificados en X_OHE vuelta a los valores originales en X Recomiendo leer la explicación detallada mencionada en OneHotEncoding (enlace en la parte superior), de lo contrario el siguiente parecerá un galimatías. Pero en pocas palabras, el siguiente itera sobre cada feature en X_OHE y usa el parámetro feature_indices interno a enc para hacer la traducción.

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)

Donde R se ve así (originalmente codifiqué los nombres de los departamentos de la compañía):

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

Entonces, ahora puede decir: "Las variables objetivo aumentan en 3.929413 cuando un empleado se encuentra en el departamento ''Foo1''.