{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## En este notebook aprenderás las estrategias de encoding mencionadas en la teoría:\n", "
\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#En caso de no tener instalado pandas descomentar y ejecutar el comando pip\n", "#pip install pandas \n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lectura del dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Este dataset se ha construido con el propósito de entender y utilizar las distintas estrategias para codificar las variables. La columna **'Sensación térmica'** se utilizará para la codificación con ***One Hot Encoding, Label Encoding, Ordinal Encoding y Mean Encoding***. La columna **'Edad'** para el agrupamiento mediante ***Binning*** y para terminar, la columna **'Frase'** para el uso de la estrategia ***Bag-of-words***." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## columna frase mayúsculas y minúsculas" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTarget
0Caliente12El helado estaba frío y el agua estaba caliente1
1Muy frío15el helado estaba caliente0
2Caliente13EL HELADO ESTABA MUY FRÍO1
3Muy caliente78el helado estaba muy caliente1
4Frío65hace mucho frío en la calle0
5Frío42Hace mucho calor en la calle0
6Muy frío98el caldo estaba frío1
7Muy caliente24el caldo estaba MUY CALIENTE1
8Caliente26el caldo estaba caliente1
9Muy frío38el caldo estaba muy frió0
10Caliente27el plato estaba frío1
11Muy caliente32el plato estaba muy caliente1
12Frío22el plato estaba caliente0
13Muy frío45el plato estaba muy frió1
14Muy caliente27PREFIERO EL FRÍO QUE EL CALOR1
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "5 Frío 42 Hace mucho calor en la calle \n", "6 Muy frío 98 el caldo estaba frío \n", "7 Muy caliente 24 el caldo estaba MUY CALIENTE \n", "8 Caliente 26 el caldo estaba caliente \n", "9 Muy frío 38 el caldo estaba muy frió \n", "10 Caliente 27 el plato estaba frío \n", "11 Muy caliente 32 el plato estaba muy caliente \n", "12 Frío 22 el plato estaba caliente \n", "13 Muy frío 45 el plato estaba muy frió \n", "14 Muy caliente 27 PREFIERO EL FRÍO QUE EL CALOR \n", "\n", " Target \n", "0 1 \n", "1 0 \n", "2 1 \n", "3 1 \n", "4 0 \n", "5 0 \n", "6 1 \n", "7 1 \n", "8 1 \n", "9 0 \n", "10 1 \n", "11 1 \n", "12 0 \n", "13 1 \n", "14 1 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ruta = 'Dataset.csv'\n", "df = pd.read_csv(ruta)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# One Hot Encoding\n", "\n", "Para empezar, utilizaremos la función get_dummies de la librería pandas con la columna que queramos codificar, en este caso 'Sensación térmica'." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetSensación térmica_CalienteSensación térmica_FríoSensación térmica_Muy calienteSensación térmica_Muy frío
0Caliente12El helado estaba frío y el agua estaba caliente11000
1Muy frío15el helado estaba caliente00001
2Caliente13EL HELADO ESTABA MUY FRÍO11000
3Muy caliente78el helado estaba muy caliente10010
4Frío65hace mucho frío en la calle00100
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Sensación térmica_Caliente Sensación térmica_Frío \\\n", "0 1 1 0 \n", "1 0 0 0 \n", "2 1 1 0 \n", "3 1 0 0 \n", "4 0 0 1 \n", "\n", " Sensación térmica_Muy caliente Sensación térmica_Muy frío \n", "0 0 0 \n", "1 0 1 \n", "2 0 0 \n", "3 1 0 \n", "4 0 0 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_dummies = pd.get_dummies(df['Sensación térmica'], prefix='Sensación térmica')\n", "df_dummies = pd.concat([df,df_dummies], axis=1) #Concatenar con el dataset original\n", "df_dummies.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como se puede apreciar, lo que nos devuelve la función es la columna **'Sensación térmica'** codificada para cada clase.\n", "\n", "Para está misma estrategia tenemos otro tipo de implementación, está en tus manos utilizar la que más te guste.\n", "Para la segunda implementación utilizaremos la clase ***`OneHotEncoder`*** de la librería **Scikit-Learn** para poder ver la diferencia con ***`get_dummies`***." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "#En caso de no tener instalado sklearn descomentar y ejecutar el comando pip\n", "#pip install -U scikit-learn\n", "from sklearn.preprocessing import OneHotEncoder" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Codificación de cada clase:\n", " [[1. 0. 0. 0.]\n", " [0. 0. 0. 1.]\n", " [1. 0. 0. 0.]\n", " [0. 0. 1. 0.]\n", " [0. 1. 0. 0.]\n", " [0. 1. 0. 0.]\n", " [0. 0. 0. 1.]\n", " [0. 0. 1. 0.]\n", " [1. 0. 0. 0.]\n", " [0. 0. 0. 1.]\n", " [1. 0. 0. 0.]\n", " [0. 0. 1. 0.]\n", " [0. 1. 0. 0.]\n", " [0. 0. 0. 1.]\n", " [0. 0. 1. 0.]]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetSensación térmica_CalienteSensación térmica_FríoSensación térmica_Muy calienteSensación térmica_Muy frío
0Caliente12El helado estaba frío y el agua estaba caliente11.00.00.00.0
1Muy frío15el helado estaba caliente00.00.00.01.0
2Caliente13EL HELADO ESTABA MUY FRÍO11.00.00.00.0
3Muy caliente78el helado estaba muy caliente10.00.01.00.0
4Frío65hace mucho frío en la calle00.01.00.00.0
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Sensación térmica_Caliente Sensación térmica_Frío \\\n", "0 1 1.0 0.0 \n", "1 0 0.0 0.0 \n", "2 1 1.0 0.0 \n", "3 1 0.0 0.0 \n", "4 0 0.0 1.0 \n", "\n", " Sensación térmica_Muy caliente Sensación térmica_Muy frío \n", "0 0.0 0.0 \n", "1 0.0 1.0 \n", "2 0.0 0.0 \n", "3 1.0 0.0 \n", "4 0.0 0.0 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoder = OneHotEncoder()\n", "x = encoder.fit_transform(df['Sensación térmica'].values.reshape(-1,1)).toarray()\n", "print('Codificación de cada clase:\\n', x)\n", "# OneHotEncoder no crea las nuevas columnas, por lo que hay que añadir más código\n", " \n", "df_OneHot = pd.DataFrame(x, columns = ['Sensación térmica_'+str(encoder.categories_[0][i]) \n", " for i in range(len(encoder.categories_[0]))])\n", "\n", "df_codificado = pd.concat([df,df_OneHot], axis = 1) #Concatenar las nuevas columnas con el dataset original\n", "df_codificado.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Label Encoding\n", "\n", "En este punto, utilizaremos la clase ***`LabelEncoder`*** de la librería **Scikit-Learn** ." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import LabelEncoder" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Temperatura codificada: [0 3 0 2 1 1 3 2 0 3 0 2 1 3 2]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTarget
0012El helado estaba frío y el agua estaba caliente1
1315el helado estaba caliente0
2013EL HELADO ESTABA MUY FRÍO1
3278el helado estaba muy caliente1
4165hace mucho frío en la calle0
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 0 12 El helado estaba frío y el agua estaba caliente \n", "1 3 15 el helado estaba caliente \n", "2 0 13 EL HELADO ESTABA MUY FRÍO \n", "3 2 78 el helado estaba muy caliente \n", "4 1 65 hace mucho frío en la calle \n", "\n", " Target \n", "0 1 \n", "1 0 \n", "2 1 \n", "3 1 \n", "4 0 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_label = df.copy() #copia dataset\n", "\n", "encoder = LabelEncoder()\n", "temp_codificado = encoder.fit_transform(df_label['Sensación térmica'])\n", "print('Temperatura codificada: ', temp_codificado)\n", "\n", "# Ahora hay que sustituir la columna 'Sensación térmica' por la codificada o concatenarla como antes\n", "\n", "#En este caso la sustituiremos para ver la diferencia respecto a agregar una columna\n", "\n", "df_label['Sensación térmica'] = temp_codificado\n", "df_label.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ordinal Encoding\n", "\n", "Para esta estrategia lo más sencillo es hacerlo mediante un diccionario de la siguiente manera:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetSensación térmica_ord
0Caliente12El helado estaba frío y el agua estaba caliente13
1Muy frío15el helado estaba caliente01
2Caliente13EL HELADO ESTABA MUY FRÍO13
3Muy caliente78el helado estaba muy caliente14
4Frío65hace mucho frío en la calle02
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Sensación térmica_ord \n", "0 1 3 \n", "1 0 1 \n", "2 1 3 \n", "3 1 4 \n", "4 0 2 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ordinal = df.copy() #copia dataset\n", "\n", "temp_dict = {'Muy frío':1, 'Frío':2, 'Caliente':3, 'Muy caliente':4} #Diccionario ordenado\n", "\n", "#De nuevo se crea una nueva columna o sustituimos la original, en este caso creamas una nueva\n", "\n", "df_ordinal['Sensación térmica_ord'] = df_ordinal['Sensación térmica'].map(temp_dict) #Cambiando los valores categóricos\n", "\n", "df_ordinal.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este caso también tenemos la posibilidad de hacerlo con la clase ***`OrdinalEncoder`*** de la librería **Scikit-Learn**. \n", "\n", "Por mi experiencia, te recomiendo que utilices la estrategia del diccionario, ya que es más sencilla e intuitiva. Ahora es tu turno de aprender las dos implementaciones y quedarte con la que más te guste." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import OrdinalEncoder" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetSensación térmica_ord
0Caliente12El helado estaba frío y el agua estaba caliente10.0
1Muy frío15el helado estaba caliente03.0
2Caliente13EL HELADO ESTABA MUY FRÍO10.0
3Muy caliente78el helado estaba muy caliente12.0
4Frío65hace mucho frío en la calle01.0
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Sensación térmica_ord \n", "0 1 0.0 \n", "1 0 3.0 \n", "2 1 0.0 \n", "3 1 2.0 \n", "4 0 1.0 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "encoder=OrdinalEncoder()\n", "\n", "x = encoder.fit_transform(df['Sensación térmica'].values.reshape(-1,1))\n", "df_encoder = pd.DataFrame(x, columns=['Sensación térmica_ord']) #en este caso solo hay que agregar una columna nueva\n", "\n", "df_ordinalEncoder = pd.concat([df,df_encoder], axis=1) #concatenar dataset original con la nueva columna\n", "df_ordinalEncoder.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Mean Encoding\n", "\n", "\n", "1.\tSeleccionar la variable categórica que se desea transformar.\n", "2.\tAgrupar por la variable categórica y obtener la suma agregada sobre la variable **\"Target\"**, es decir, número total de 1's para cada categoría en **\"Sensación térmica\"**.\n", "3.\tAgrupa por la variable categórica y obtén el recuento agregado sobre la variable **\"Target\"**, es decir, conteo de cuantas veces aparece la clase en la columna.\n", "4.\tDividir los resultados del paso 2 / paso 3\n", "\n", "El código de está estrategia es muy sencilla, los pasos mencionados se implementan en una sola línea." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Media para cada clase:\n", " Sensación térmica\n", "Caliente 1.0\n", "Frío 0.0\n", "Muy caliente 1.0\n", "Muy frío 0.5\n", "Name: Target, dtype: float64\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetSensación térmica_mean
0Caliente12El helado estaba frío y el agua estaba caliente11.0
1Muy frío15el helado estaba caliente00.5
2Caliente13EL HELADO ESTABA MUY FRÍO11.0
3Muy caliente78el helado estaba muy caliente11.0
4Frío65hace mucho frío en la calle00.0
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Sensación térmica_mean \n", "0 1 1.0 \n", "1 0 0.5 \n", "2 1 1.0 \n", "3 1 1.0 \n", "4 0 0.0 " ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_mean = df.copy() #copiar dataset original\n", "\n", "mean_encode = df_mean.groupby('Sensación térmica')['Target'].mean() #Agrupar y sacar la media para cada clase respecto a la 'Target'\n", "print('Media para cada clase:\\n', mean_encode)\n", "\n", "df_mean['Sensación térmica_mean'] = df_mean['Sensación térmica'].map(mean_encode) #mapear para sustituir los valores\n", "df_mean.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Binning\n", "\n", "Para el agrupamiento de las edades utilizaremos la funcion ***`qcut`***. ***`qcut`*** trata de dividir los datos en grupos de igual tamaño. La función define los grupos utilizando percentiles basados en la distribución de los datos. \n", "\n", "Los percentiles son medidas de posición que dividen un conjunto de datos estadísticos, de forma que un porcentaje del total de los datos quede por debajo de dicho valor. Así, por ejemplo, si la edad de una persona cae dentro del percentil 90 quiere decir que su edad está por encima del 90% de las edades del resto de las personas.\n", "\n", "Dicho esto, veamos qué genera la función ***`qcut`***." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetedad_binningQ
0Caliente12El helado estaba frío y el agua estaba caliente10
1Muy frío15el helado estaba caliente01
2Caliente13EL HELADO ESTABA MUY FRÍO10
3Muy caliente78el helado estaba muy caliente19
4Frío65hace mucho frío en la calle08
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target edad_binningQ \n", "0 1 0 \n", "1 0 1 \n", "2 1 0 \n", "3 1 9 \n", "4 0 8 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_binningQ = df.copy() #copiar dataset original\n", "\n", "bin_labels = list(range(0,10)) #Crear las etiquetas/nombres de los grupos [0,1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "\n", "df_binningQ['edad_binningQ']=pd.qcut(df_binningQ['Edad'], q=10, labels = bin_labels) # q = 10 significa que queremos 10 cuantiles\n", "df_binningQ.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otra de las opciones para agrupar la edad es con la funcion ***`cut`***. La principal diferencia es que ***`qcut`*** calculará el tamaño de cada casilla para asegurarse de que la distribución de los datos en las casillas es igual. En otras palabras, todos los grupos tendrán (aproximadamente) el mismo número de observaciones, pero el rango de los grupos variará.\n", "\n", "Por otro lado, ***`cut`*** se utiliza para definir específicamente los bordes de los rangos. No hay ninguna garantía sobre la distribución de los elementos en cada grupo. De hecho, se pueden definir los grupos de tal manera que no se incluyan elementos en un grupo o que casi todos los elementos estén en una único grupo." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetEdad_binning
0Caliente12El helado estaba frío y el agua estaba caliente11
1Muy frío15el helado estaba caliente01
2Caliente13EL HELADO ESTABA MUY FRÍO11
3Muy caliente78el helado estaba muy caliente17
4Frío65hace mucho frío en la calle06
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target Edad_binning \n", "0 1 1 \n", "1 0 1 \n", "2 1 1 \n", "3 1 7 \n", "4 0 6 " ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_binning = df.copy() #copiar dataset original\n", "\n", "bin_labels = list(range(0,10)) #Las etiquetas de los grupos [0,1,2,3,4,5,6,7,8,9]\n", "interval_range = list(range(0,110,10)) #se define el rango de cada grupo \n", "\n", "df_binning['Edad_binning'] = pd.cut(df_binning['Edad'], bins=interval_range, labels=bin_labels)\n", "df_binning.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bag-of-words\n", "\n", "Para esta estrategia utilizaremos la clase ***`CountVectorizer`*** de la librería **Scikit-Learn**. CountVectorizer nos creará el vocabulario y nos contará cuantas veces aparece una palabra en la frase.\n", "\n", "Está es una manera sencilla y rápida de codificar mediante **Bag-of-words**." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import CountVectorizer" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frases codificadas:\n", " [list([1, 0, 1, 0, 0, 2, 0, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0])\n", " list([0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0])\n", " list([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0])\n", " list([0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0])\n", " list([0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0])\n", " list([0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0])\n", " list([0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])\n", " list([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0])\n", " list([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n", " list([0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0])\n", " list([0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0])\n", " list([0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0])\n", " list([0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0])\n", " list([0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0])\n", " list([0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1])]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sensación térmicaEdadFraseTargetfrase_codificada_bow
0Caliente12El helado estaba frío y el agua estaba caliente1[1, 0, 1, 0, 0, 2, 0, 2, 0, 1, 0, 1, 0, 0, 0, ...
1Muy frío15el helado estaba caliente0[0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, ...
2Caliente13EL HELADO ESTABA MUY FRÍO1[0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, ...
3Muy caliente78el helado estaba muy caliente1[0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, ...
4Frío65hace mucho frío en la calle0[0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, ...
\n", "
" ], "text/plain": [ " Sensación térmica Edad Frase \\\n", "0 Caliente 12 El helado estaba frío y el agua estaba caliente \n", "1 Muy frío 15 el helado estaba caliente \n", "2 Caliente 13 EL HELADO ESTABA MUY FRÍO \n", "3 Muy caliente 78 el helado estaba muy caliente \n", "4 Frío 65 hace mucho frío en la calle \n", "\n", " Target frase_codificada_bow \n", "0 1 [1, 0, 1, 0, 0, 2, 0, 2, 0, 1, 0, 1, 0, 0, 0, ... \n", "1 0 [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, ... \n", "2 1 [0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, ... \n", "3 1 [0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, ... \n", "4 0 [0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, ... " ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_bow = df.copy()\n", "\n", "vectorizer = CountVectorizer()\n", "X = vectorizer.fit_transform(df.Frase.values)\n", "\n", "x=X.toarray() #Pasamos a array el conteo de cada palabra en cada frase\n", "\n", "df_bow['frase_codificada_bow'] = x.tolist() # El array de cada frase pasarlo a lista y agregarla a la columna nueva\n", "print('Frases codificadas:\\n',df_bow['frase_codificada_bow'].values)\n", "df_bow.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "class sklearn.feature_extraction.text.CountVectorizer(*, input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\\b\\w\\w+\\b', ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=)\n", "```\n", "\n", "Esta clase esta extraida de la documentación de **Scikit-Learn**. Como se puede observar ***lowercase*** es igual a ***True***, por lo que no hace falta cambiar toda la columna del dataset a minúsculas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusión\n", "\n", "Como has visto, tenemos muchas maneras diferentes de implementar cada estrategia para hacer uso del encoding y convertir todas nuestras columnas en variables numéricas. Dependerá del tipo de columna y de la naturaleza del problema que tengas que resolver en cada momento aplicar una u otra.\n", "\n", "Suerte en tu formación!😊😊" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 5 }