Deep Learning para el Titanic – Preprocesar los datos

Hola,

Vamos a preparar los datos del DataSet con los datos de supervivientes del Titanic que tenemos en Kaggle:  https://www.kaggle.com/c/titanic 

Esto va a ser un primer acercamiento. Mas adelante, en otro post, mejoraremos este proceso.

Después, con estos datos intentaremos predecir si un viajero sobrevive a su aventura en el Titanic con nuestra primera Red Neuronal artificial!!!

Los datos que nos ofrece el DataSet de Kaggle son los siguientes:

Importaremos las librerías que utilizaremos, y cargaremos una variable con los datos del CSV con el código siguiente:


# Importing the libraries

import pandas as pd


from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.model_selection import train_test_split



# Importamos el dataset de entrenamiento de Titanic train.csv
# La opcion: index_col = 0, indica que utilizarà la primera columna del csv como indice.
dataset = pd.read_csv('train.csv', index_col = 0)

# Por si acaso lo necesitamos mas tarde, guardamos el dataset otriginal
dataset_original = dataset

Si miramos la información del dataset, ya vemos que algunas, en principio no nos van a ser útiles como por ejemplo:

 

Esta claro que el numero de ticket, número de cabina, y puerto de embarque, no deberían tener mucha importancia para intentar predecir si un viajero sobrevive o no. 

Tengo dudas con la variable 'Fare',  que seria la tarifa pagada. De momento vamos a dejarla. 

Tened en cuenta que estoy haciendo esto como un ejercicio, así que no he buscado información sobre este dataset, ni nada parecido. Seguramente con buscar un poco en google, encontraría la respuesta sin problemas, pero la idea es probar, y comprobar por mí mismo para sacar mis propias conclusiones.

Comprobaremos cuales son las variables numéricas, y cuales las categóricas, y una manera podría ser según el tipo de variable- De esta manera, conoceremos un poco mas nuestro dataset.

Los tipos 'int64', 'float64' serian variables Numéricas y los tipos ‘object’, ‘bool’ serán variables categóricas, así que con este código, obtendremos las columnas de cada tipo:

# Determinar si son variables numéricas o categóricas
numerical_ix = dataset.select_dtypes(include=['int64', 'float64']).columns
categorical_ix = dataset.select_dtypes(include=['object', 'bool']).columns

print("Valores Numericos:   ", numerical_ix.values)
print("Valores Categoricos: ",categorical_ix.values)

La salida que obtendremos es:

Si hacemos un dataset.describe() podemos ver algunas cosas como:

  • Tenemos 891 pasajeros
  • La media de edad de los pasajeros es de 29,5 años
  • El pasajero más  joven tiene 0,42 años
  • El pasajero con mayor edad contaba con 80 años

 

Otra cosa que podemos comprobar, que columnas no contienen datos (NaN).

Si escribimos:

# Comprobamos si existen valores Nan en algun campo
ColumnsNan = dataset.isnull().sum()

vemos que las columnas 'Age', 'Cabin', y 'Embarked' tienen datos NaN.

Empezaremos con la columna 'Age', ya que las otras dos, al no ser relevantes, las eliminaremos luego.

Vamos a rellenar los campos sin datos de la columna 'Age' con la media de toda la columna de edad:

# Rellenaremos el campo edad con la media de edad de todo el barco
dataset['Age'] = dataset['Age'].fillna(int(dataset_original['Age'].mean()))

Ahora, con quedamos con las columnas relevantes, y volvemos a comprobar si nos queda algun campo NaN:

data = dataset[['Survived','Pclass','Sex','Age','SibSp','Parch','Fare']]


# Comprobamos si existen valores Nan en algun campo
ColumnsNan = data.isnull().sum()

Con esto, ya podemos proceder a separar los valores entre las Variables independientes (que llamaremos X), y la variable dependiente, o variable a predecir (que será y)

 """
Separamos los valores entre Variables independientes (X)
, y Variable dependiente (y) o variable a predecir
"""
X = data.iloc[:,1:].values
y = data.iloc[:,:1].values

Transformaremos la única variable categórica que nos queda, que es 'Sex', en valores numéricos 

# Transformamos las columnas categoricas en valores numericos
transformer = ColumnTransformer(
    transformers=[
        ("Churn_Modelling",          # Un nombre de la transformación
         OneHotEncoder(categories='auto'),  # clase que transformar
         [1]               # Las columnas a transformar.
         )
    ], remainder='passthrough'
)
 
X = transformer.fit_transform(X)
Antes de la transformación
Después de la transformación

Si veis, donde antes 'male' y 'female' ahora tenemos '0.0' y '1.0'

Ahora, vamos a dividir el dataset en 2 partes. Una para entrenamiento y otra para test, que será del 20% del total del dataset

# Dividir entre entrenamiento y test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

Con esto obtendremos:

  • X_train: Datos para entrenamiento
  • X_test: Datos para testear el entrenamiento
  • y_train: datos con las variables dependientes del entrenamiento
  • y_test: Variables dependientes para el test

Con esto podemos procedes a el escalado de todas las variable (proceso de Estandarización)

# Escalado de variables (Estandarización)
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

Así quedarían los datos para empezar a trabajar con ellos.

En próximas entradas, mejoraremos todo este proceso de PreProcesado de los datos.

Un Saludo y hasta la próxima!!

¿Te ha gustado? ¡¡Compártelo con el mundo!!