Intentas hacer el conteo de labels y te sale algo así?
escribe
sns.countplot(x='label', data=train)
En vez de
sns.countplot(train['label'])
Cómo utilizar TensorFlow 2.0 con Python
Redes neuronales con TensorFlow
Introducción a TensorFlow 2.0
Manejo y preprocesamiento de datos para redes neuronales
Uso de data pipelines
Cómo cargar bases de datos JSON
Cargar bases de datos CSV y BASE 64
Preprocesamiento y limpieza de datos
Keras datasets
Datasets generators
Aprende a buscar bases de datos para deep learning
Cómo distribuir los datos
Crear la red neural, definir capas, compilar, entrenar, evaluar y predicciones
Optimización de precisión de modelos
Métodos de regularización: overfitting y underfitting
Recomendaciones prácticas para ajustar un modelo
Métricas para medir la eficiencia de un modelo: callback
Monitoreo del entrenamiento en tiempo real: early stopping y patience
KerasTuner: construyendo el modelo
KerasTuner: buscando la mejor configuración para tu modelo
Almacenamiento y carga de modelos
Almacenamiento y carga de modelos: pesos y arquitectura
Criterios para almacenar los modelos
Fundamentos de aprendizaje por transferencia
Introducción al aprendizaje por transferencia
Cuándo utilizar aprendizaje por transferencia
Carga de sistemas pre-entrenados en Keras
API funcional de Keras
Uso sistemas pre-entrenados de TensorFlow Hub
Resultados de entrenamiento
Introducción a variables relevantes del TensorBoard
Análisis y publicación de resultados del entrenamiento
Introducción al despliegue de modelos en producción
Siguientes pasos con deep learning
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
El preprocesamiento de los datos es de las etapas más importantes en cualquier proyecto de data science, principalmente porque es un proceso altamente difícil de automatizar y requiere de creatividad e intelecto humano para hacerse correctamente.
Esta etapa determinará la calidad final de tu modelo, por lo que no deberías temer en invertir el tiempo necesario.
Para esta ocasión usaremos una versión del dataset mnist en CSV que no está limpio, es decir, tiene datos faltantes e incongruencias que solucionaremos a continuación.
{code-block} python
train = pd.read_csv('/tmp/databasesLoadData/sign_mnist_train/sign_mnist_train_clean.csv')
Empezaremos con un poco de análisis exploratorio, vamos a entender la densidad de los datos, donde gracias a matplotlib y seaborn podemos obtener una gráfica de la distribución de las etiquetas.
{code-block} python
plt.figure(figsize=(10,10))
sns.set_style("darkgrid")
sns.countplot(train['label'])
En general el dataset se encuentra balanceado, donde cada etiqueta tiene de 900 a 1200 ejemplos en promedio.
Lo primero a realizar será separar las etiquetas de las imágenes, donde bastará con aislar esta columna en concreto en nuevas variables.
```{code-block} python y_train = train['label'] y_test = test['label']
del train['label'] del test['label'] ```
Para obtener información general del dataset podemos usar el método info que nos dará detalles de la estructura, su contenido y los tipos de datos que almacena.
```{code-block} python train.info()
De la misma manera, podemos analizar específicamente cada columna con el atributo dtypes.
```{code-block} python train.dtypes
pixel1 object
pixel2 object
pixel3 object
pixel4 object
pixel5 object
...
pixel780 object
pixel781 object
pixel782 object
pixel783 object
pixel784 object
Length: 784, dtype: object
```
Si queremos conocer qué etiquetas hay, podemos hacer uso de la función unique de numpy.
{code-block} python
unique_val = np.array(labels)
np.unique(unique_val)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24])
Podemos verificar si tenemos valores nulos en nuestra base de datos, esto nos dará información relacionada a negocio que puede ser valiosa, por lo que esta acción no solo ayuda a limpiar el dataset sino a comprender el posible origen del problema.
{code-block} python
train.isnull().values.any()
False
Podemos buscar datos duplicados con el método duplicated del dataframe, esto nos retornará una fila por cada elemento.
{code-block} python
train[train.duplicated()]
Para borrar registros haremos uso del método drop que recibe como argumentos los index de los elementos a borrar.
python
train = train.drop([317, 487, 595, 689, 802, 861], axis = 0)
Entre los datos duplicados encontramos uno que traía letras (algo ilógico para imágenes entre 0 y 255), por lo que lo buscaremos y eliminaremos.
{code-block} python
train[train['pixel1'] == "fwefew"]
727
train = train.drop([727], axis = 0)
El paso final será normalizar los datos para sintetizarlos desde el rango inicial al rango 0-1, para esto debemos convertir todos los datos en valores numéricos y luego aplicar la operación.
{code-block} python
train = train.astype(str).astype(int)
train = train / 255
test = test / 255
Si verificamos el dataset limpio obtendremos 784 columnas con valores entre 0 y 1.
{code-block} python
train.head()
5 rows × 784 columns
Estos datos finales son mucho más procesables que los iniciales, por lo que tu rendimiento final se verá afectando positivamente.
Recuerda siempre dedicar una parte importante del tiempo de desarrollo en revisión y limpieza de datos para obtener resultados exponencialmente mejores.
Contribución creada por Sebastián Franco Gómez.
Aportes 19
Preguntas 5
Intentas hacer el conteo de labels y te sale algo así?
escribe
sns.countplot(x='label', data=train)
En vez de
sns.countplot(train['label'])
[
Para que puedan visualizar el balanceado de clases y además tengan una referencia numérica del porcentaje que representa cada una de las clases sobre el total.
para saber cuales son los valores unicos de los labels
train['label'].unique()
para hacer un conteo de los labels
train.groupby('label')['label'].count()
Oigan, no dejen de ver las lecturas recomendadas, estan buenisimas, MIL GRACIAS PROFE
Leer archivos parquet con pandas:
Parquet es un format columnar comunmente usado en ambientes big data asi que espero les sirva saber que existe una función en pandas para leerlo
pd.read_parquet('/path/to/file')
Para este caso el drop se puede hacer usando
train.drop_duplicates(keep=False, inplace=True)
Para no hacerlo tan manual, yo elimine los duplicados de esta forma:
duplicated = train[train.duplicated(keep=False)]
train.drop(duplicated.index, axis=0, inplace=True)
Y así no debemos poner uno a uno los índices a eliminar.
Super hack para la exploración de datos:
Que haya datos vacíos, nulos o faltantes, ES INFORMACION
Que no haya información, ES INFORMACION
Cantidades por etiqueta de mayor a menor
train[['label']].value_counts().sort_values(ascending=False)
Creo 🤔 que el profe normaliza los datos con “255” ya que en datos de imágenes donde un elemento tiende a tener el valor entre 0 y 255 para su color RGB.
Como en principio no conocemos qué otros string podrían haber en los datos hice una búsqueda automatizada con regex:
import re
r = re.compile(".*[A-Za-z].*") '''Este regex busca cualquier tipo de string que contenga una letra'''
train = train.astype(str)
for column in processed_train.columns:
words = list(filter(r.match, processed_train[column].values))
for word in words:
processed_train
= processed_train.drop(processed_train[processed_train[column]==word].index)
Me parece que hubo un pequeño detalle, primero se separó la variable objetivo
y_train = train['label']
y_test = test['label']
del train['label']
del test['label']
y luego se procedió a borrar los datos nulos.
train = train.drop([317,487, 595, 689, 802, 861], axis = 0)
train = train.drop([727], axis = 0) # este tambien es una cadena.
Falto borrar los valores en el y_train
porque como se quedaron la cantidad de filas para cada uno no es la misma, y debería ser la misma.
train.shape, y_train.shape
# ouput: ((27448, 784), (27455,))
EXCEL
pd.read_excel('test.xlsx')
El preprocesamiento y la limpieza de datos son pasos fundamentales en el análisis de datos. Estos procesos ayudan a mejorar la calidad de los datos, lo que a su vez conduce a mejores resultados en el análisis.
import pandas as pd
# Importa un archivo CSV
data = pd.read_csv("ruta/al/archivo.csv")
# Exploración de datos
data.hist()
data.describe()
# Limpieza de datos
data.dropna()
data['columna'].fillna(data['columna'].mean(), inplace=True)
data['columna'] = data['columna'].where(data['columna'] < valor_umbral, valor_umbral)
data['fecha'] = pd.to_datetime(data['fecha'])
data['columna'] = pd.Categorical(data['columna'])
# Transformación de datos
data['columna'] = (data['columna'] - data['columna'].mean()) / data['columna'].std()
data['columna'] = np.log(data['columna'])
data = data.drop('columna_colineal', axis=1)
# Exporta a un archivo CSV
data.to_csv("ruta/al/archivo_nuevo.csv")
Estupendos artículos de referencia para resolver tema del desbalanceo de clases.
Cuando usamos el método .duplicated()
este no nos regresa todos los duplicados como tal ya que por defecto ignora la primera muestra del dataset que contenga dichos valores, para que nos muestre todos, incluyendo la primera muestra se debe usar la siguiente linea:
train[train.duplicated(keep=False)]
Esto nos ayuda en casos como el de este ejemplo ya que da la casualidad que las muestras además de estar duplicadas contienen valores que no nos sirven para el modelo
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?