python - values - pandas transform categorical variables
Variables categóricas de XGBoost: Dummification vs encoding (3)
Aquí hay un ejemplo de código de agregar una columna de codificaciones en caliente a un Data Frame de Pandas con columnas categóricas:
ONE_HOT_COLS = ["categorical_col1", "categorical_col2", "categorical_col3"]
print("Starting DF shape: %d, %d" % df.shape)
for col in ONE_HOT_COLS:
s = df[col].unique()
# Create a One Hot Dataframe with 1 row for each unique value
one_hot_df = pd.get_dummies(s, prefix=''%s_'' % col)
one_hot_df[col] = s
print("Adding One Hot values for %s (the column has %d unique values)" % (col, len(s)))
pre_len = len(df)
# Merge the one hot columns
df = df.merge(one_hot_df, on=[col], how="left")
assert len(df) == pre_len
print(df.shape)
Cuando usamos XGBoost
necesitamos convertir las variables categóricas en numéricas.
¿Habría alguna diferencia en las métricas de desempeño / evaluación entre los métodos de:
- Dummificando sus variables categóricas
- codificar las variables categóricas de, por ejemplo, (a, b, c) a (1,2,3)
ADEMÁS:
¿Habría alguna razón para no usar el método 2 utilizando, por ejemplo, el labelencoder
?
Quiero responder a esta pregunta no solo en términos de XGBoost sino también en términos de cualquier problema relacionado con los datos categóricos. Mientras que "dummification" crea una configuración muy dispersa, especialmente si tiene varias columnas categóricas con diferentes niveles, la codificación de la etiqueta a menudo está sesgada, ya que la representación matemática no refleja la relación entre los niveles.
Para los problemas de clasificación binaria , un enfoque genio pero aún no explorado que es altamente aprovechado en los modelos tradicionales de calificación crediticia es utilizar el Peso de la evidencia para reemplazar los niveles categóricos. Básicamente, cada nivel categórico es reemplazado por la proporción de Bienes / Proporción de Bads.
Puede leer más sobre esto here .
Biblioteca de Python here .
Este método le permite capturar los "niveles" en una columna y evitar la escasez o la inducción del sesgo que se produciría a través de la verificación o la codificación.
Espero que esto ayude !
xgboost
solo trata con columnas numéricas.
si tiene una característica [a,b,b,c]
que describe una variable categórica ( es decir, sin relación numérica )
Usando LabelEncoder simplemente tendrás esto:
array([0, 1, 1, 2])
Xgboost
interpretará erróneamente que esta característica tiene una relación numérica! Esto simplemente asigna cada cadena (''a'',''b'',''c'')
a un entero, nada más.
Forma apropiada
Usando OneHotEncoder eventualmente OneHotEncoder a esto:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
Esta es la representación adecuada de una variable categórica para xgboost
o cualquier otra herramienta de aprendizaje automático.
Pandas get_dummies es una buena herramienta para crear variables ficticias ( que, en mi opinión, es más fácil de usar).
El método # 2 en la pregunta anterior no representará los datos correctamente