mi serie sobre detección de valores atípicos. En este artículo, analizamos cómo trabajar con datos categóricos.
Generalmente, cuando realizamos la detección de valores atípicos con datos tabulares, comenzamos convirtiendo los datos para que sean completamente categóricos o completamente numéricos. Hay algunas excepciones, pero en su mayor parte esto es necesario: la mayoría de los algoritmos de detección de valores atípicos asumirán que los datos están estrictamente en un formato u otro, y necesitaremos obtener los datos en el formato que espera el detector.
Si el detector espera datos categóricos, las características numéricas deberán convertirse a un formato categórico, lo que generalmente significa agruparlas. Y si el detector espera datos numéricos, cualquier característica categórica debe codificarse numéricamente. Este es el escenario más común (la mayoría de los algoritmos de detección de valores atípicos asumen datos numéricos) y es lo que cubriremos en este artículo.
Otros artículos de la serie incluyen: Aprendizaje profundo para la detección de valores atípicos en datos tabulares y de imágenes, Aprendizaje de métricas a distancia para la detección de valores atípicos, Introducción al uso de PCA para la detección de valores atípicos, Detección de valores atípicos interpretables: factor de valores atípicos de patrones frecuentes (FPOF) y Realización de una detección de valores atípicos de forma más eficaz utilizando subconjuntos de funciones.
Este artículo también cubre parte del material del libro Detección de valores atípicos en Python.
Detectores de valores atípicos
Algunos ejemplos de algoritmos de detección de valores atípicos que asumen datos categóricos incluyen: factor de valores atípicos de patrones frecuentes (FPOF), reglas de asociación y métodos basados en entropía. Algunos que funcionan con datos numéricos incluyen: bosques de aislamiento, factor de valores atípicos locales (LOF), k-ésimos vecinos más cercanos (kNN) y envolvente elíptica.
Si está familiarizado con algún algoritmo de detección de valores atípicos, lo más probable es que sean los algoritmos numéricos, en particular Isolation Forest y LOF; Estos son probablemente los algoritmos más utilizados. Además, todos los algoritmos de detección de valores atípicos incluidos en scikit-learn y en PYOD (Python Outlier Detección) asumen datos completamente numéricos.
Al mismo tiempo, la gran mayoría de los datos tabulares del mundo real en realidad son mixtos (contienen columnas numéricas y categóricas), lo que significa que es muy común cuando se realiza la detección de valores atípicos necesitar codificar las columnas categóricas.
Hay una razón para esto: es más difícil realizar una detección de valores atípicos en datos mixtos. Trabajar con datos de un solo tipo (todos categóricos o todos numéricos) simplifica el trabajo de encontrar los elementos más inusuales en los datos.
Y, si trabajamos con datos numéricos, tenemos el beneficio adicional de poder ver los datos geométricamente: como puntos en el espacio. Si hay, digamos, 20 columnas numéricas en una tabla, entonces cada fila de datos puede verse como un punto en un espacio de 20 dimensiones. Al menos podemos imaginarlos conceptualmente en un espacio de 20 d; en realidad, la mente humana no puede imaginarse esto. Pero podemos imaginar espacios 2D y 3D y extrapolar la idea general: buscamos puntos que estén físicamente muy distantes de la mayoría de los demás puntos. Por ejemplo, en 2d, podemos tener datos como:
Aquí, asumimos que los datos tienen solo dos características, llamadas A y B, ambas con valores numéricos. Cada fila de los datos se dibuja como un punto azul o una estrella roja, y su ubicación se basa en los valores de las columnas A y B. Los puntos azules indican datos típicos, y las estrellas rojas representan un subconjunto de los puntos que razonablemente podrían considerarse valores atípicos: algunos puntos en los márgenes de los conglomerados y los puntos fuera de los conglomerados (los datos tienen tres conglomerados principales, así como algunos puntos fuera de estos).
Esto es bastante natural en dimensiones inferiores. Las cosas son diferentes en las dimensiones superiores, debido a lo que se llama la maldición de la dimensionalidad, y tenemos que ser conscientes de eso. Pero, conceptualmente, la idea de los valores atípicos como puntos relativamente aislados en un espacio de alta dimensión es bastante sencilla.
La mayoría de los detectores numéricos de valores atípicos funcionan calculando las distancias entre cada par de puntos y utilizando estas distancias para identificar los puntos que son más inusuales: los puntos que tienen pocos puntos cerca y que están lejos de la mayoría de los demás puntos. Aunque, en la práctica (para mayor eficiencia), los algoritmos en realidad no calcularán cada distancia por pares (algunos pueden omitirse cuando no afecten sustancialmente las puntuaciones de los valores atípicos), pero en principio, esto es lo que hacen la mayoría de los detectores numéricos de valores atípicos.
Necesitamos, entonces, formas de convertir datos categóricos a un formato numérico que lo admita bien; es decir, eso hace que tenga sentido calcular distancias entre filas después de codificar los valores categóricos como números.
Métodos para codificar datos categóricos.
En el caso de problemas de predicción, los métodos de codificación más comunes probablemente incluyan:
Codificación one-hot Codificación ordinal Codificación de destino
Con la detección de valores atípicos, el conjunto de opciones es un poco diferente y las fortalezas y debilidades de cada una también son diferentes. De los tres métodos enumerados aquí, en realidad solo la codificación One-hot funciona bien para la detección de valores atípicos. Con la detección de valores atípicos, los más efectivos probablemente sean:
Codificación one-hot Codificación de conteo
Describiré cómo funciona cada uno y por qué algunos funcionan mejor que otros para la detección de valores atípicos. Y explicaré por qué la codificación Count (que rara vez se usa en problemas de predicción) puede ser muy útil con la detección de valores atípicos.
También debo decir que, además de estos métodos de codificación, existen varios otros que pueden resultar útiles para la predicción. Una excelente biblioteca para métodos de codificación es Category Encoders. Es probable que esto cubra cualquiera de los métodos que necesitará. Sin embargo, muchos de los métodos proporcionados, como la codificación Target y la codificación CatBoost, requieren una columna de destino, que normalmente no está disponible con la detección de valores atípicos.
Por ejemplo, si tuviéramos una tabla que representara información histórica sobre los clientes de una empresa, podría haber una columna categórica para "Último producto comprado" y una columna de destino llamada "Se abandonará en los próximos 6 meses". La columna "Último producto comprado" puede tener valores distintos: "Producto A", "Producto B" y "Producto C". Para codificarlos, podemos calcular con qué frecuencia la columna de destino tiene el valor Verdadero para cada valor (en los datos de entrenamiento), posiblemente codificándolos como 0,12, 0,43, 0,02 (es decir, cuando el 'Último producto comprado' es el Producto A, el 12 % de las veces la columna de destino es Verdadera y el cliente abandona en los próximos 6 meses; de manera similar para el Producto B (43%) y el Producto C (2%)).
Pero con la detección de valores atípicos, trabajamos en un entorno estrictamente no supervisado: no existe un valor real sobre qué tan atípico es cada fila y, por lo tanto, no hay forma de establecer una columna de destino. Solo podemos utilizar métodos de codificación no supervisados, incluida la codificación One-hot y Count.
Codificación one-hot
Para ver la codificación One-hot, comenzaré describiendo cómo se hace y luego veremos cómo funciona con los cálculos de distancia. Supongamos que comenzamos con una tabla como la siguiente:
Tabla 1: Tabla de Gastos de Personal
Esta tabla describe los gastos de personal, con una fila por declaración de gastos. Suponiendo que planeamos utilizar uno o más detectores de valores atípicos numéricos, necesitaremos convertir las columnas categóricas (ID del personal, Departamento y Cuenta) en números.
Las columnas Fecha y Hora también deberán convertirse a valores numéricos. La detección de valores atípicos en Python cubre el trabajo con datos de fecha y hora. No tengo espacio en este artículo, pero diré rápidamente que se pueden convertir de varias maneras. Un método simple es calcular el tiempo desde algún punto de partida (denominado época). Se puede utilizar la fecha u hora mínima de la columna, o alguna otra fecha que represente un punto de partida lógico.
Digamos que usamos el 1 de enero de 1990. Todas las fechas se pueden representar como el número de días desde ese momento. Sin embargo, también deseamos capturar más información sobre las fechas, como el día de la semana (esto puede ser relevante, por ejemplo, si los gastos de personal para los fines de semana son inusuales), si caen en feriado, etc., por lo que es posible que deseemos considerar otros métodos de codificación también. Sin embargo, en este artículo nos centraremos únicamente en las columnas categóricas.
Si consideramos, por el momento, solo la columna Departamento, al codificar esta columna en caliente, reemplazamos la columna con una serie de columnas nuevas, una para cada valor único en la columna. Supongamos que la columna tiene cinco valores distintos: Ventas, Marketing, Ingeniería, Recursos Humanos y Comunicaciones. Entonces tendríamos cinco nuevas columnas que representan estos valores, como en la siguiente tabla (Tabla 2). Esto muestra solo la columna ID del personal y las nuevas columnas relacionadas con el Departamento. (Las otras columnas también estarían presentes, pero se omiten aquí por simplicidad. Se crearía un conjunto similar de columnas, por ejemplo, para la columna Cuenta).
Tabla 2: Tabla de Gastos de personal con la columna Departamento codificada en caliente (algunas columnas no se muestran)
Cada una de las celdas de las columnas exclusivas de Departamento tendrá un valor de 0 o 1, lo que indica si ese es el valor correcto para esta fila. Vemos aquí, en la primera fila, un informe de gastos para el personal 9000483, que está en Ventas. Dado esto, la columna de 'Ventas del Departamento' tiene un 1 y las otras columnas relacionadas con el Departamento tienen un 0. De manera similar, para cada otra fila: exactamente una de las columnas del Departamento tendrá un 1 y todas las demás un 0.
La codificación one-hot se utiliza con mucha frecuencia para la detección de valores atípicos y puede ser una buena opción cuando una característica tiene una cardinalidad baja. Sin embargo, puede descomponerse un poco cuando la columna tiene una cardinalidad muy alta. Por ejemplo, si la columna Departamento en la tabla de gastos de personal original tuviera 100 valores distintos, se crearían 100 columnas nuevas, lo que puede crear una tabla con la que es difícil trabajar. Sin embargo, mostraré a continuación que en realidad no es peor para los cálculos de distancia que en situaciones de baja cardinalidad, por lo que aún puede ser viable.
Al mismo tiempo, las columnas de alta cardinalidad generalmente no son tan útiles para la detección de valores atípicos como las columnas de baja cardinalidad. Por este motivo, es posible que no queramos incluir la columna Id. del personal en nuestro proceso de detección de valores atípicos. Aunque también podemos: aún puede ser informativo y útil incluirlo, por ejemplo, si deseamos encontrar gastos grandes para ese personal, personal que tiene una cantidad inusual de gastos, personal que tiene muchos gastos similares cerca en el tiempo, etc.
Codificación one-hot con Isolation Forest
La magnitud del problema al generar muchas columnas adicionales depende del algoritmo de detección de valores atípicos. Uno de los algoritmos de detección de valores atípicos más utilizados es Isolation Forest, que no utiliza cálculos de distancia. En cambio, identifica subespacios de baja densidad en el espacio de características y marca las filas que aparecen en ellos. Es decir, sigue buscando puntos que están lejos de otros puntos, pero lo hace sin calcular las distancias entre puntos.
No puedo entrar en los detalles de Isolation Forest aquí (aunque espero que sea un artículo futuro), pero diré rápidamente que si una sola columna se expande en muchas columnas después de la codificación (como con la codificación One-hot y algunos otros esquemas de codificación), esas columnas estarán sobrerrepresentadas en el análisis del algoritmo de Isolation Forest, lo que probablemente no queramos.
Debido a algunos detalles interesantes sobre cómo funciona internamente el algoritmo de Isolation Forest, en realidad suele ser más efectivo con Isolation Forests utilizar la codificación ordinal. Dicho esto, Isolation Forest es uno de los pocos algoritmos de detección de valores atípicos en los que esto es cierto; con la mayoría de los demás detectores, la codificación ordinal funciona bastante mal. Lo describiré a continuación y explicaré por qué es así.
Cálculos de distancia con codificación One-hot
La mayoría de los detectores numéricos de valores atípicos, sin embargo, se basan en calcular y evaluar las distancias entre puntos (o entre cada punto y el centro de datos, o centros de cluster). Esto incluye: factor de valores atípicos locales, k vecinos más cercanos, radio, modelos de mezcla gaussiana, KDE (estimación de densidad del núcleo), envolvente elíptica, vector de soporte de una clase (OCSVM) y muchos otros.
El método de codificación afectará las distancias calculadas y, en consecuencia, las puntuaciones atípicas otorgadas a cada fila. La codificación one-hot generalmente funciona relativamente bien con la detección de valores atípicos para la mayoría de los detectores numéricos (incluidos aquellos basados en cálculos de distancia), pero tiene un aspecto negativo: al igual que con los bosques de aislamiento, la codificación one-hot da como resultado que las características categóricas estén sobrerrepresentadas en los cálculos de distancia, aunque el efecto es menos severo que con los bosques de aislamiento.
Como ejemplo, considere la siguiente tabla (Tabla 3), que muestra un conjunto de datos con cuatro filas y dos características. La columna Color tiene cinco valores (dos de ellos presentes en los datos actuales): rojo, azul, verde, blanco y amarillo. La columna de tamaño tiene dos valores: grande y pequeño.
Tabla 3: Conjunto de datos con características de color y tamaño
Las distancias por pares entre las cuatro filas se muestran en la siguiente tabla (Tabla 4). Hay muchos cálculos de distancia que podríamos utilizar; este método deja los datos como categóricos (todavía no hacemos ninguna codificación numérica) y mide la distancia entre dos filas como el número de valores que son diferentes.
Como hay dos características, un par de filas pueden tener una distancia de cero, uno o dos (pueden tener cero, una o ambas características diferentes). La tabla muestra solo las distancias entre cada par único de filas y muestra cada distancia solo una vez (por ejemplo, entre la Fila 1 y la Fila 2, pero entre la Fila 2 y la Fila 1, que sería la misma; y no entre la Fila 1 y ella misma), por lo que muestra valores solo por encima de la diagonal principal.
Tabla 4: Distancias entre cada par de filas usando una métrica de distancia que considera si las características tienen el mismo valor o no.
Si codificamos One-hot los datos originales (de la Tabla 3), obtenemos:
Tabla 5: Conjunto de datos después de la codificación one-hot
Si calculamos las distancias por pares entre las filas usando codificación one-hot y distancias de Manhattan o euclidianas, tenemos las distancias que se muestran en la siguiente tabla. En este caso, como todos los valores son 0 o 1, las distancias de Manhattan y Euclidiana son en realidad las mismas.
Tabla 6: Distancias Manhattan/Euclidianas por pares
Al utilizar medidas de distancia de Manhattan (o euclidiana), las distancias son proporcionales cuando se utiliza un recuento del número de valores coincidentes (como hicimos para la Tabla 4), pero los valores son dobles: cuando dos valores en los datos originales no coinciden, habrá dos celdas en la codificación one-hot que no coinciden. Esto no suele ser un problema cuando se trabaja con datos puramente categóricos, pero crea una situación indeseable en la que tenemos datos mixtos.
Considere la Tabla 7 con dos características: Color y Peso, donde el Peso es numérico.
Tabla 7: Conjunto de datos con una característica categórica y otra numérica
Una vez codificado en caliente, tenemos la Tabla 8:
Tabla 8: Codificación one-hot con una característica categórica y otra numérica
Aquí, cuando calculamos distancias euclidianas entre las filas. (También podemos usar Manhattan, Canberra o cualquier otra métrica de distancia, pero para este ejemplo, use Euclidiana). Mostramos las distancias euclidianas en la siguiente tabla (Tabla 9):
Tabla 9: Distancias basadas en distancias euclidianas
Las filas 1 y 2 difieren en el color (tienen el mismo peso) y tienen una distancia euclidiana de 1,4. Las filas 3 y 4 tienen diferente peso (tienen el mismo color) y tienen una distancia euclidiana de solo 0,6. Podemos ver que la diferencia de color es más significativa que el peso a la hora de determinar la distancia, aunque probablemente no debería serlo.
Hay dos factores que dan aquí más importancia a las características categóricas que a las numéricas. La primera es que las coincidencias versus las no coincidencias afectan a dos columnas únicas, mientras que las diferencias en los valores numéricos afectan solo a una columna. La segunda es que las distancias en las columnas binarias son mayores que en las entidades numéricas. Aquí, la Fila 1 y la Fila 4 tienen valores de Peso de 0,1 y 0,9, que tienen una diferencia significativa de 0,8, pero esto es menor que la diferencia entre dos valores categóricos que no coinciden, que será 2,0 (dado que dos columnas binarias no coincidirán).
En el siguiente listado se muestra un ejemplo que trabaja con distancias de Manhattan y euclidianas. En el primer caso, creamos un par de vectores que representan las dos primeras filas de los datos anteriores, con cinco columnas únicas para Color y una columna para Peso. Luego creamos otro par de vectores para simular cómo se vería si la cardinalidad de Color fuera 2, usando solo dos columnas binarias.
Aquí mostramos un código que prueba las distancias de Manhattan y Euclidiana:
from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances # Crea datos que simulan dos filas donde se # usan cinco columnas binarias para una fila categórica_1 = [1, 0, 0, 0, 0, 0.1] fila_2 = [0, 1, 0, 0, 0, 0.1] print(manhattan_distances([fila_1], [fila_2])) print(euclidean_distances([fila_1], [fila_2])) # Crea datos similares pero con dos columnas binarias para una # columna categórica fila_1 = [1, 0, 0.1] fila_2 = [0, 1, 0.2] print(manhattan_distances([fila_1], [fila_2])) print(euclidean_distances([fila_1], [fila_2]))
Curiosamente, en ambos casos, las dos filas tienen una distancia de Manhattan de 2,1 y una euclidiana de 1,4: cuando probamos usando solo dos características binarias para Color en lugar de cinco, las distancias son las mismas. De manera similar, aumentar la cardinalidad (usar más de cinco columnas binarias para representar el color) no afecta las medidas de distancia. Independientemente de cuántas columnas one-hot haya relacionadas con el Color, si dos filas tienen el mismo color, habrá 0 diferencias; y si tienen colores diferentes, habrá 2 diferencias (todas las demás columnas serán cero y, por lo tanto, coincidirán).
Entonces, como se señaló, existe un desequilibrio entre las características categóricas y numéricas, pero no empeora por la cardinalidad de las características categóricas.
Mi sugerencia, para reducir el énfasis excesivo en los cálculos de distancia, es reemplazar los valores de 1,0 en las columnas únicas por 0,25. Esto dará como resultado que filas con diferentes valores tengan una diferencia total (con respecto a esa columna original) de 0,5 en lugar de 2,0, colocándola más en la misma escala que las características numéricas.
Codificación ordinal
La codificación ordinal funciona simplemente dando a cada valor único en una columna categórica un número único. En el ejemplo anterior, podemos dar a los valores de la columna Color valores como:
rojo: 1
azul: 2
verde: 3
blanco: 4
amarillo: 5
Entonces todos los valores de “rojo” serían reemplazados por 1, y así sucesivamente. Lo mismo ocurre con la columna Tamaño: podemos reemplazar "pequeño" con, digamos, 1 y "grande" con 2, o con cualquier otro valor numérico.
Como se indicó, esto realmente funciona bien para Isolation Forest. Pero no suele funcionar bien con la mayoría de los otros detectores numéricos de valores atípicos, incluidos los basados en distancias. La codificación ordinal evita la creación de columnas adicionales: cada columna categórica se traduce en una única columna numérica. Pero los cálculos de distancia dejarán de tener sentido.
Usando los valores anteriores, las filas con valor amarillo se considerarían a 4,0 de distancia de aquellas con valor rojo, mientras que aquellas con valor blanco estarían solo a 1,0 de distancia de las filas con amarillo, lo cual tiene poco sentido. Las distancias acaban siendo completamente arbitrarias.
Codificación de recuento
La codificación de recuento es en realidad mucho más importante como técnica de codificación con detección de valores atípicos que con predicción. Al igual que con la codificación Ordinal, convierte cada columna categórica en una sola columna numérica, pero con la codificación Count, lo hace de manera que los valores numéricos no sean aleatorios; tienen significado y un significado que es relevante para la detección de valores atípicos.
La codificación de conteo también produce valores numéricos que son sencillos para los cálculos de distancia.
Con la codificación Count, los valores numéricos generados representan la frecuencia del valor (a los valores raros se les darán valores pequeños y a los valores comunes, valores grandes), lo que tiene un valor de información real cuando se trabaja con detección de valores atípicos.
Echando un vistazo a la tabla de Gastos de Personal, si tenemos una distribución de valores del Departamento como por ejemplo:
Ventas: 1.000
Comercialización: 500
Ingeniería: 100
FC: 10
Comunicaciones: 3
Entonces, estos recuentos serán las codificaciones. Es decir, a 1.000 registros (los de Ventas) se les dará el valor 1.000; 500 tendrá valor 500; etcétera. Esto tiene la ventaja de que puede codificar valores de manera que los valores raros tienden a estar lejos de otros valores. En este caso, los valores 10 y 3 están cerca entre sí, lo que significa que estos 13 registros estarán cerca entre sí, pero todavía hay solo 13 y estarán lejos de los otros 1600 registros. El valor 1000 está distante de los otros valores, pero hay 1000 registros con esta codificación, por lo que cada uno de estos 1000 registros está cerca de otros 999 y, por lo tanto, no se marcarían como valores atípicos.
En el siguiente código, utilizando estos valores, generamos un conjunto de datos simple de una sola característica que representa el departamento y creamos un detector de factor de valor atípico local (LOF) para evaluarlo. Cuando se trabaja con varias columnas, es necesario escalar cualquier característica codificada por recuento para garantizar que todas las características estén en la misma escala, pero como este ejemplo contiene solo una característica, se puede omitir este paso. El LOF puede identificar correctamente los valores raros como valores atípicos: a los 13 valores raros se les da una predicción -1 (lo que indica valores atípicos en la implementación de scikit-learn), mientras que a todos los demás se les predice como 1 (lo que indica valores atípicos).
import numpy as np import pandas as pd from sklearn.neighbors import LocalOutlierFactor # Crea un conjunto de datos con una sola columna categórica vals = np.array(['Ventas']*1000 + ['Marketing']*500 + ['Ingeniería']*100 + ['HR']*10 + ['Comunicaciones']*3) # Codificación de recuento de la columna df = pd.DataFrame({"C1": vals}) vc = df['C1'].value_counts() map = {x:y for x,y in zip(vc.index, vc.values)} df['Ordinal C1'] = df['C1'].map(map) # Utiliza LOF para determinar los valores atípicos en la columna clf = LocalOutlierFactor(contaminación=0.01) df['Puntuación LOF'] = clf.fit_predict(df[['Ordinal C1']])
Una cosa a tener en cuenta sobre la codificación Count es que puede dar a varios valores originales el mismo código numérico si tienen el mismo recuento. Por ejemplo, si Ventas y Marketing tuvieran 1000 filas, a ambos se les daría una codificación de 1000. O si Ventas tuviera 1000 y Marketing tuviera 1001, se les daría casi la misma codificación. Para la mayoría de los detectores, esto no es un problema, pero nuevamente, Isolation Forest es un poco diferente y es mejor poder distinguir valores que en realidad son distintos, lo cual es posible con la codificación ordinal.
Determinar el mejor método de codificación
El método de codificación que funcione mejor variará según el conjunto de datos, el algoritmo de detección de valores atípicos y los tipos de valores atípicos que desee encontrar. Desafortunadamente, como muchas cosas en la ciencia de datos, no existe una respuesta definitiva sobre qué es lo mejor; cada método puede preferirse en ocasiones. Y, en algunos casos, puede que funcione mejor utilizar diferentes codificaciones para diferentes funciones.
Como es un tema común con la detección de valores atípicos, puede resultar útil adoptar un enfoque de conjunto, donde las filas se codifican de varias maneras. Las filas verdaderamente anómalas se destacarán como valores atípicos usando cada método de codificación, mientras que las más levemente anómalas posiblemente se destacarán simplemente usando uno u otro método de codificación.
Elegir un método de codificación puede resultar más fácil con problemas de predicción. Con los problemas de predicción, normalmente tenemos un conjunto de validación y podemos simplemente probar diferentes métodos de codificación y determinar experimentalmente cuál funciona mejor. Sin embargo, con la detección de valores atípicos, los problemas generalmente no están supervisados en absoluto (una vez más, no hay una columna de destino ya que no existe una verdad sobre el terreno sobre cuán atípico es cada fila). Lo que significa que es más difícil evaluar los métodos de codificación utilizados. Sin embargo, podemos utilizar una técnica para evaluar los sistemas de detección de valores atípicos conocida como dopaje.
Además, cuando el sistema de detección de valores atípicos se ejecuta a lo largo del tiempo, es posible recopilar datos etiquetados y utilizarlos para evaluar diferentes métodos de preprocesamiento, incluida la codificación de las columnas categóricas.
Escalada
Si estuviéramos trabajando con datos que fueran completamente numéricos para empezar, no necesitaríamos codificar ninguna columna categórica, pero aún así necesitaríamos escalar los datos, al menos con la mayoría de los detectores de valores atípicos numéricos. Nuevamente, Isolation Forest es una de las excepciones, pero cualquiera basado en cálculos de distancia requiere que cada dimensión (cada característica) esté en la misma escala. De lo contrario, las distancias entre puntos (o entre los puntos y los centros de los grupos, etc.) estarán dominadas por características que se encuentran en escalas mayores.
Lo mismo ocurre con las columnas categóricas después de la codificación. Independientemente del método de codificación utilizado, las nuevas características numéricas ahora pueden estar en escalas diferentes a las características que ya eran numéricas (y las características de fecha u hora convertidas). Y, si se utilizan diferentes métodos de codificación para diferentes columnas categóricas, incluso estas columnas pueden estar en escalas diferentes entre sí.
Escalar estas columnas utiliza los mismos métodos que las columnas numéricas; solo tenemos que asegurarnos de incluir estas nuevas columnas. Es de esperar que los detalles de cómo hacer esto se cubran en un artículo futuro, pero rápidamente: generalmente usamos un escalado z mínimo-máximo, robusto o un escalado spline para esto.
Todas las imágenes fueron del autor.