- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Mira los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
Solo hay **2 valores posibles**: 1 o 0. En caso de que en un conjunto de datos los valores estén en formato de cadena (por ejemplo, "Verdadero" y "Falso"), se asignan números a esos valores con:
Los **valores siguen un orden**, como en: 1er lugar, 2do lugar... Si las categorías son cadenas de texto (como: "principiante", "amateur", "profesional", "experto") se pueden asignar números a cada una de ellas como vimos en el caso binario.
Se parece a un valor ordinal porque hay un orden, pero no significa que uno sea más grande que el otro. Además, la distancia entre ellos depende de la dirección en la que se esté contando. Ejemplo: los días de la semana, el domingo no es "más grande" que el lunes.
* Hay diferentes formas de codificar características cíclicas, algunas pueden funcionar solo con algunos algoritmos. En general, se puede utilizar la codificación de variables ficticias.
Las fechas son **variables continuas**. Pueden ser vistas como **cíclicas** (porque se repiten) o como variables **ordinales** (porque un tiempo es mayor que otro anterior).
**Más de 2 categorías** sin un orden relacionado. Use `dataset.describe(include='all')` para obtener información sobre las categorías de cada característica.
* Una **cadena de referencia** es una **columna que identifica un ejemplo** (como el nombre de una persona). Esto puede estar duplicado (porque 2 personas pueden tener el mismo nombre), pero la mayoría será único. Estos datos son **inútiles y deben eliminarse**.
* Una **columna clave** se utiliza para **vincular datos entre tablas**. En este caso, los elementos son únicos. Estos datos son **inútiles y deben eliminarse**.
Para **codificar columnas de múltiples categorías en números** (para que el algoritmo de ML los entienda), se utiliza la **codificación de dummies** (y **no la codificación one-hot** porque **no evita la multicolinealidad perfecta**).
Puede obtener una **columna de múltiples categorías codificada one-hot** con `pd.get_dummies(dataset.column1)`. Esto transformará todas las clases en características binarias, por lo que creará **una nueva columna por cada clase posible** y asignará 1 **valor verdadero a una columna**, y el resto será falso.
Puede obtener una **columna de múltiples categorías codificada en dummies** con `pd.get_dummies(dataset.column1, drop_first=True)`. Esto transformará todas las clases en características binarias, por lo que creará **una nueva columna por cada clase posible menos una** ya que **las últimas 2 columnas se reflejarán como "1" o "0" en la última columna binaria creada**. Esto evitará la multicolinealidad perfecta, reduciendo las relaciones entre columnas.
En ML **quieres que tus características estén relacionadas con los posibles resultados, pero no quieres que estén relacionadas entre sí**. Es por eso que la **codificación de dummies mezcla las últimas dos columnas** de eso y **es mejor que la codificación one-hot** que no lo hace, creando una clara relación entre todas las nuevas características de la columna de múltiples categorías.
VIF es el **Factor de Inflación de la Varianza** que **mide la multicolinealidad de las características**. Un valor **superior a 5 significa que una de las dos o más características colineales debe eliminarse**.
Puedes usar el argumento **`sampling_strategy`** para indicar el **porcentaje** que deseas **submuestrear o sobremuestrear** (**por defecto es 1 (100%)** lo que significa igualar el número de clases minoritarias con las clases mayoritarias).
El submuestreo o sobremuestreo no son perfectos, si obtienes estadísticas (con `.describe()`) de los datos sobre/submuestreados y los comparas con los originales, verás **que han cambiado**. Por lo tanto, el sobremuestreo y el submuestreo modifican los datos de entrenamiento.
Esto es similar al desequilibrio de categorías de la sección anterior, pero la categoría de ocurrencia rara ocurre incluso menos que la "clase minoritaria" en ese caso. Los métodos de **sobremuestreo** y **submuestreo****brutos** también podrían usarse aquí, pero generalmente esas técnicas **no darán resultados realmente buenos**.
En algunos algoritmos es posible **modificar los pesos de los datos objetivo** para que algunos de ellos tengan por defecto más importancia al generar el modelo.
Es un método que ayuda a reducir la dimensionalidad de los datos. Va a **combinar diferentes características** para **reducir la cantidad** de ellas generando **características más útiles** (_se necesita menos cómputo_).
Por lo tanto, es posible encontrar la **misma etiqueta con errores ortográficos**, diferentes **mayúsculas**, **abreviaturas** como: _BLUE, Blue, b, bule_. Necesitas corregir estos errores de etiqueta dentro de los datos antes de entrenar el modelo.
Es muy importante comprobar que **todos los datos que tienes están etiquetados correctamente**, porque por ejemplo, un error de ortografía en los datos, al codificar las clases, generará una nueva columna en las características finales con **consecuencias negativas para el modelo final**. Este ejemplo se puede detectar muy fácilmente codificando en caliente una columna y comprobando los nombres de las columnas creadas.
Podría ser que falte algún dato al azar, pero hay algo que hace que algunos detalles específicos sean más probables de faltar, por ejemplo, los hombres suelen decir su edad con más frecuencia que las mujeres. Esto se llama **Faltante al Azar** (**MAR**).
Finalmente, podría haber datos **Faltantes No al Azar** (**MNAR**). El valor de los datos está directamente relacionado con la probabilidad de tener los datos. Por ejemplo, si quieres medir algo vergonzoso, cuanto más vergonzoso sea alguien, menos probable es que lo comparta.
Las **dos primeras categorías** de datos faltantes se pueden **ignorar**. Pero la **tercera** requiere considerar **sólo porciones de los datos** que no estén afectadas o intentar **modelar los datos faltantes de alguna manera**.
Una forma de averiguar sobre los datos faltantes es usar la función `.info()`, ya que indicará el **número de filas pero también el número de valores por categoría**. Si alguna categoría tiene menos valores que el número de filas, entonces faltan algunos datos:
Ten en cuenta que **no todos los valores faltantes están ausentes en el conjunto de datos**. Es posible que los valores faltantes hayan sido reemplazados por "Desconocido", "n/a", "", -1, 0... Debes verificar el conjunto de datos (usando `dataset.column`_`name.value`_`counts(dropna=False)` para verificar los posibles valores).
Si falta algún dato en el conjunto de datos (si no es demasiado), debes encontrar la **categoría de los datos faltantes**. Para ello, básicamente necesitas saber si los **datos faltantes están al azar o no**, y para ello necesitas encontrar si los **datos faltantes estaban correlacionados con otros datos** del conjunto de datos.
Para encontrar si un valor faltante está correlacionado con otra columna, puedes crear una nueva columna que ponga 1 y 0 si los datos faltan o no, y luego calcular la correlación entre ellos:
Si decides ignorar los datos faltantes, aún necesitas decidir qué hacer con ellos: puedes **eliminar las filas** con datos faltantes (los datos de entrenamiento para el modelo serán más pequeños), puedes **eliminar completamente la característica**, o puedes **modelarla**.
Debes **verificar la correlación entre la característica faltante y la columna objetivo** para ver qué tan importante es esa característica para el objetivo, si es realmente **pequeña**, puedes **eliminarla o llenarla**.
Para llenar datos faltantes **continuos**, puedes usar: la **media**, la **mediana** o usar un **algoritmo de imputación**. El algoritmo de imputación puede intentar usar otras características para encontrar un valor para la característica faltante:
Para rellenar datos categóricos, primero debes pensar si hay alguna razón por la cual los valores estén faltando. Si es por **elección de los usuarios** (no quisieron proporcionar los datos), tal vez puedas **crear una nueva categoría** que lo indique. Si es debido a un error humano, puedes **eliminar las filas** o la **característica** (verifica los pasos mencionados anteriormente) o **rellenarla con la moda, la categoría más utilizada** (no recomendado).
Si encuentras **dos características** que están **correlacionadas** entre sí, generalmente deberías **eliminar** una de ellas (la que está menos correlacionada con el objetivo), pero también podrías intentar **combinarlas y crear una nueva característica**.
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en****Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.