En el proyecto de hoy vamos a realizar el primer ejercicio que por lo general se hace cuando se esta comenzando en Machine Learning y es el de predecir la supervivencia del Titanic.
Los datos lo vamos a obtener de la página de Kaggle, para ello se deben suscribir para poder tener acceso a los mismos.
Nuestro programa lo vamos a dividir de la siguiente forma:
- Exportar las librerías de Python que vamos a utilizar a lo largo del programa
- Importar los datos que vamos a utilizar dentro de nuestro análisis
- Preprocesamiento de los datos para dejarlos de manera
- Aplicación de los algoritmos de Machine Learning
- Realización de las predicciones correspondientes.
Lo primero que debemos hacer importar las librerías, estas las colocamos al inicio de nuestro programa.
#Se importan la librerias a utilizar import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier
Lo siguiente que vamos hacer serán importar los datos desde la página de Kaggle, guardarlos en nuestra PC y a su vez guardar dichos datos en variables Pandas para poderlos manipular a lo largo del programa.
#Se importa los datos a utilizar de la web url_test = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/test.csv' url_train = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/train.csv' df_test = pd.read_csv(url_test) df_train = pd.read_csv(url_train) #Se guardan los datos en un archivo para siempre tenerlos disponibles dir_test = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_test.csv' dir_train = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_train.csv' df_test.to_csv(dir_test) df_train.to_csv(dir_train) #Importar los datos de los archivos .csv almacenados df_test = pd.read_csv(dir_test) df_train = pd.read_csv(dir_train)
Posteriormente vamos a entender la data que vamos a estar manejando, para ello verificamos la cantidad de datos con la que contamos, el tipo de datos, la cantidad de datos faltantes que tiene el dataset y por último las estadísticas del mismo.
#Verifico la cantidad de datos que hay en los dataset print('Cantidad de datos:') print(df_train.shape) print(df_test.shape) #Verifico el tipo de datos contenida en ambos dataset print('Tipos de datos:') print(df_train.info()) print(df_test.info()) #Verifico los datos faltantes de los dataset print('Datos faltantes:') print(pd.isnull(df_train).sum()) print(pd.isnull(df_test).sum()) #Verifico las estadísticas del dataset print('Estadísticas del dataset:') print(df_train.describe()) print(df_test.describe())
Ya que analizamos los datos y sabemos qué tenemos exactamente y qué debemos corregir, procedemos a realizar el preprocesamiento de datos.
#Cambio los datos de sexos en números df_train['Sex'].replace(['female','male'],[0,1],inplace=True) df_test['Sex'].replace(['female','male'],[0,1],inplace=True) #Cambio los datos de embarque en números df_train['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True) df_test['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True) #Reemplazo los datos faltantes en la edad por la media de esta columna print(df_train["Age"].mean()) print(df_test["Age"].mean()) promedio = 30 df_train['Age'] = df_train['Age'].replace(np.nan, promedio) df_test['Age'] = df_test['Age'].replace(np.nan, promedio) #Creo varios grupos de acuerdo a bandas de las edades #Bandas: 0-8, 9-15, 16-18, 19-25, 26-40, 41-60, 61-100 bins = [0, 8, 15, 18, 25, 40, 60, 100] names = ['1', '2', '3', '4', '5', '6', '7'] df_train['Age'] = pd.cut(df_train['Age'], bins, labels = names) df_test['Age'] = pd.cut(df_test['Age'], bins, labels = names) #Se elimina la columna de "Cabin" ya que tiene muchos datos perdidos df_train.drop(['Cabin'], axis = 1, inplace=True) df_test.drop(['Cabin'], axis = 1, inplace=True) #Elimino las columnas que considero que no son necesarias para el analisis df_train = df_train.drop(['PassengerId','Name','Ticket'], axis=1) df_test = df_test.drop(['Name','Ticket'], axis=1) #Se elimina las filas con los datos perdidos df_train.dropna(axis=0, how='any', inplace=True) df_test.dropna(axis=0, how='any', inplace=True) #Verifico los datos print(pd.isnull(df_train).sum()) print(pd.isnull(df_test).sum()) print(df_train.shape) print(df_test.shape) print(df_test.head()) print(df_train.head())
Y ahora si empezamos a implementar los algoritmos de Machine Learning, para este proyecto vamos a implementar algoritmos de regresión logística, vectores de soporte y vecinos más cercanos.
#Separo la columna con la información de los sobrevivientes X = np.array(df_train.drop(['Survived'], 1)) y = np.array(df_train['Survived']) #Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) ##Regresión logística logreg = LogisticRegression() logreg.fit(X_train, y_train) Y_pred = logreg.predict(X_test) print('Precisión Regresión Logística:') print(logreg.score(X_train, y_train)) ##Support Vector Machines svc = SVC() svc.fit(X_train, y_train) Y_pred = svc.predict(X_test) print('Precisión Soporte de Vectores:') print(svc.score(X_train, y_train)) ##K neighbors knn = KNeighborsClassifier(n_neighbors = 3) knn.fit(X_train, y_train) Y_pred = knn.predict(X_test) print('Precisión Vecinos más Cercanos:') print(knn.score(X_train, y_train))
Ya teniendo nuestros modelos procedemos a realizar la predicción respectiva utilizando la data de prueba.
ids = df_test['PassengerId'] ##Regresión logística prediccion_logreg = logreg.predict(df_test.drop('PassengerId', axis=1)) out_logreg = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_logreg }) print('Predicción Regresión Logística:') print(out_logreg.head()) ##Support Vector Machines prediccion_svc = svc.predict(df_test.drop('PassengerId', axis=1)) out_svc = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_svc }) print('Predicción Soporte de Vectores:') print(out_svc.head()) ##K neighbors prediccion_knn = knn.predict(df_test.drop('PassengerId', axis=1)) out_knn = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_knn }) print('Predicción Vecinos más Cercanos:') print(out_knn.head())
Fíjate que las predicciones del primer y último algoritmo son muy parecidas, así también lo fue los resultados de precisión, mientras que el segundo algoritmo que tuvo una precisión mucho mayor la predicción es un poco diferente por lo que esta sería más confiable que la de los otros.
A continuación esta el código completo:
""" Predecir la supervivencia del Titanic @author: ligdigonzalez """ ##########LIBRERÍAS A UTILIZAR########## #Se importan la librerias a utilizar import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier ##########IMPORTANDO LA DATA########## #Se importa los datos a utilizar de la web url_test = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/test.csv' url_train = 'https://storage.googleapis.com/kaggle-competitions-data/kaggle/3136/train.csv' df_test = pd.read_csv(url_test) df_train = pd.read_csv(url_train) #Se guardan los datos en un archivo para siempre tenerlos disponibles dir_test = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_test.csv' dir_train = '/Users/ligdigonzalez/Documents/ML/Proyectos/Titanic/titanic_train.csv' df_test.to_csv(dir_test) df_train.to_csv(dir_train) #Importar los datos de los archivos .csv almacenados df_test = pd.read_csv(dir_test) df_train = pd.read_csv(dir_train) print(df_test.head()) print(df_train.head()) ##########ENTENDIMIENTO DE LA DATA########## #Verifico la cantidad de datos que hay en los dataset print('Cantidad de datos:') print(df_train.shape) print(df_test.shape) #Verifico el tipo de datos contenida en ambos dataset print('Tipos de datos:') print(df_train.info()) print(df_test.info()) #Verifico los datos faltantes de los dataset print('Datos faltantes:') print(pd.isnull(df_train).sum()) print(pd.isnull(df_test).sum()) #Verifico las estadísticas del dataset print('Estadísticas del dataset:') print(df_train.describe()) print(df_test.describe()) ##########PREPROCESAMIENTO DE LA DATA########## #Cambio los datos de sexos en números df_train['Sex'].replace(['female','male'],[0,1],inplace=True) df_test['Sex'].replace(['female','male'],[0,1],inplace=True) #Cambio los datos de embarque en números df_train['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True) df_test['Embarked'].replace(['Q','S', 'C'],[0,1,2],inplace=True) #Reemplazo los datos faltantes en la edad por la media de esta columna print(df_train["Age"].mean()) print(df_test["Age"].mean()) promedio = 30 df_train['Age'] = df_train['Age'].replace(np.nan, promedio) df_test['Age'] = df_test['Age'].replace(np.nan, promedio) #Creo varios grupos de acuerdo a bandas de las edades #Bandas: 0-8, 9-15, 16-18, 19-25, 26-40, 41-60, 61-100 bins = [0, 8, 15, 18, 25, 40, 60, 100] names = ['1', '2', '3', '4', '5', '6', '7'] df_train['Age'] = pd.cut(df_train['Age'], bins, labels = names) df_test['Age'] = pd.cut(df_test['Age'], bins, labels = names) #Se elimina la columna de "Cabin" ya que tiene muchos datos perdidos df_train.drop(['Cabin'], axis = 1, inplace=True) df_test.drop(['Cabin'], axis = 1, inplace=True) #Elimino las columnas que considero que no son necesarias para el analisis df_train = df_train.drop(['PassengerId','Name','Ticket'], axis=1) df_test = df_test.drop(['Name','Ticket'], axis=1) #Se elimina las filas con los datos perdidos df_train.dropna(axis=0, how='any', inplace=True) df_test.dropna(axis=0, how='any', inplace=True) #Verifico los datos print(pd.isnull(df_train).sum()) print(pd.isnull(df_test).sum()) print(df_train.shape) print(df_test.shape) print(df_test.head()) print(df_train.head()) ##########APLICACIÓN DE ALGORITMOS DE MACHINE LEARNING########## #Separo la columna con la información de los sobrevivientes X = np.array(df_train.drop(['Survived'], 1)) y = np.array(df_train['Survived']) #Separo los datos de "train" en entrenamiento y prueba para probar los algoritmos X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) ##Regresión logística logreg = LogisticRegression() logreg.fit(X_train, y_train) Y_pred = logreg.predict(X_test) print('Precisión Regresión Logística:') print(logreg.score(X_train, y_train)) ##Support Vector Machines svc = SVC() svc.fit(X_train, y_train) Y_pred = svc.predict(X_test) print('Precisión Soporte de Vectores:') print(svc.score(X_train, y_train)) ##K neighbors knn = KNeighborsClassifier(n_neighbors = 3) knn.fit(X_train, y_train) Y_pred = knn.predict(X_test) print('Precisión Vecinos más Cercanos:') print(knn.score(X_train, y_train)) ##########PREDICCIÓN UTILIZANDO LOS MODELOS########## ids = df_test['PassengerId'] ###Regresión logística prediccion_logreg = logreg.predict(df_test.drop('PassengerId', axis=1)) out_logreg = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_logreg }) print('Predicción Regresión Logística:') print(out_logreg.head()) ##Support Vector Machines prediccion_svc = svc.predict(df_test.drop('PassengerId', axis=1)) out_svc = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_svc }) print('Predicción Soporte de Vectores:') print(out_svc.head()) ##K neighbors prediccion_knn = knn.predict(df_test.drop('PassengerId', axis=1)) out_knn = pd.DataFrame({ 'PassengerId' : ids, 'Survived': prediccion_knn }) print('Predicción Vecinos más Cercanos:') print(out_knn.head())
Buenos dias Ligdi,
De primero muchas gracias por tu blog, realmente es de mucha ayuda para las personas que nos queremos iniciar como científico de datos desde cero (casi -2).
Te consulto algo, estoy tratando de hacer las llamadas a los archivos de Internet (url) y cuando activo el programa me da error
«File «C:\Users\Campos\Anaconda3\lib\urllib\request.py», line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
HTTPError: Forbidden»
No se como solucionarlo, quedando de tu parte si me puedes ayudar.
Leonardo Campos
Hola Leonardo, el link que debes utilizar lo debes generar tu mismo con tu cuenta de Kaggle, no puede utilizar el que esta acá ya que te dará ese error. Saludos.
Hola Ligdi, muy bueno el tutorial.
Tengo una duda, no se porque la columna «Embarqued» en el set «train» queda finalmente del tipo float64 mientras que en el set «test» queda como int64. He visto el video y a ti también te sucede lo mismo. Entiendo que ambas deberían ser int64.
Saludos,
Claudio.
Gran trabajo!! Gracias Ligdy
Hola Fernando, me alegra que la información que publico te este sirviendo en tu aprendizaje. Saludos.
Excelente trabajo, eres una crack, detallas muy bien los pasos en tu explicación.
Mil gracias
Me alegra Lewis que hayas entendido la explicación. Saludos.
excelente!!
Hola Carlos, me alegra que te haya gustado esta explicación. Saludos.
Hola, salvando el origen de los datos (CSV) con una lectura local, todo va muy bien hasta la predicción de la regresión logística ( logreg.predict(df_test.drop(‘PassengerId’, axis=1)) ) donde da un error «TypeError: can’t multiply sequence by non-int of type ‘float'»
así como algunas advertencias a futuro.
scikit-learn Version: 1.2.0
pandas 1.4.1
numpy 1.23.5
Hola David, creo que el problema se te presenta porque tienes datos que no se encuentran numéricos, revisa que todos los datos que le introduces al algoritmo sean numéricos para que puedas realizar una predicción. Saludos.
Desués de ids = df_test[‘PassengerId’]
agrega:
df_test[‘Age’] = df_test[‘Age’].astype(float)
y es todo
##Regresión logística
prediccion_logreg = logreg.predict(df_test.drop(‘PassengerId’, axis=1).values)
out_logreg = pd.DataFrame({ ‘PassengerId’ : ids, ‘Survived’: prediccion_logreg })
print(‘Predicción Regresión Logística:’)
print(out_logreg.head())
Excelente y valiosa ayuda!!! Muchas gracias. Me gustaria que incluyas un ejemplo de serie temporal pero con un contador de horas acumuladas de operación (no fechas).
Hola Jose, muchas gracias por la sugerencia, la tendré en cuenta para una futura publicación. Saludos.
¿Como consigues tu link en kaggle?