¿Por qué sklearn preprocesamiento LabelEncoder inverse_transform se aplica desde una sola columna?

Tengo un modelo de bosque al azar construido con sklearn. El modelo está integrado en un archivo, y tengo un segundo archivo donde uso joblib para cargar el modelo y aplicarlo a los nuevos datos. Los datos tienen campos categóricos que se convierten a través del preprocesamiento LabelEncoder.fit_transform . Una vez que se realiza la predicción, estoy intentando revertir esta conversión con LabelEncoder.inverse_transform .

Aquí está el código:

  #transform the categorical rf inputs df["method"] = le.fit_transform(df["method"]) df["vendor"] = le.fit_transform(df["vendor"]) df["type"] = le.fit_transform(df["type"]) df["name"] = le.fit_transform(df["name"]) dups["address"] = le.fit_transform(df["address"]) #designate inputs for rf model inputs = ["amt","vendor","type","name","address","method"] #load rf model and run it on new data from sklearn.externals import joblib rf = joblib.load('rf.pkl') predict = rf.predict(df[inputs]) #reverse LabelEncoder fit_transform df["method"] = le.inverse_transform(df["method"]) df["vendor"] = le.inverse_transform(df["vendor"]) df["type"] = le.inverse_transform(df["type"]) df["name"] = le.inverse_transform(df["name"]) df["address"] = le.inverse_transform(df["address"]) #convert target to numeric to make it play nice with SQL Server predict = pd.to_numeric(predict) #add target field to df df["prediction"] = predict #write results to SQL Server table import sqlalchemy engine = sqlalchemy.create_engine("mssql+pyodbc://:@UserDSN") df.to_sql('TABLE_NAME', engine, schema='SCHEMANAME', if_exists='replace', index=False) 

Sin la pieza inverse_transform , los resultados son los esperados: códigos numéricos en lugar de valores categóricos. Con la pieza inverse_transform , los resultados son impares: los valores categóricos correspondientes al campo “dirección” se devuelven para todos los campos categóricos.

Entonces, si 1600 Pennsylvania Avenue se codifica como el número 1, todos los valores categóricos codificados como el número 1 (independientemente del campo) ahora devuelven 1600 Pennsylvania Avenue. ¿Por qué inverse_transform está seleccionando una columna de la cual revertir todos los códigos fit_transform ?

Este es el comportamiento esperado.

Cuando llama a le.fit_transform() , los parámetros internos (clases aprendidas) de LabelEncoder se reinician. El objeto le se ajusta a los valores de la columna que proporcionó.

En el código anterior, está utilizando el mismo objeto para transformar todas las columnas, y la última columna que proporcionó es la address . Por lo tanto, el le olvida toda la información sobre las llamadas anteriores para fit() (o fit_transform() en este caso), y de nuevo aprende los nuevos datos. Entonces, cuando llama a inverse_transform() en él, solo devuelve valores relacionados con la address . Espero que quede claro.

Para codificar todas las columnas, necesita inicializar diferentes objetos, uno para cada columna. Algo como a continuación:

  df["method"] = le_method.fit_transform(df["method"]) df["vendor"] = le_vendor.fit_transform(df["vendor"]) df["type"] = le_type.fit_transform(df["type"]) df["name"] = le_name.fit_transform(df["name"]) df["address"] = le_address.fit_transform(df["address"]) 

y luego llame a inverse_transform() en el codificador apropiado.