diff --git a/7506R-1C2023-GRUPO09-CHP04.ipynb b/7506R-1C2023-GRUPO09-CHP04.ipynb new file mode 100644 index 0000000..39713a4 --- /dev/null +++ b/7506R-1C2023-GRUPO09-CHP04.ipynb @@ -0,0 +1,1731 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bb1b4968", + "metadata": {}, + "source": [ + "# Importamos" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c283c681", + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " import google.colab\n", + " IN_COLAB = True\n", + "except:\n", + " IN_COLAB = False\n", + "\n", + "import pandas as pd \n", + "import numpy as np\n", + "import sklearn as sk\n", + "import seaborn as sns\n", + "import pydotplus\n", + "from six import StringIO\n", + "from IPython.display import Image \n", + "from matplotlib import pyplot as plt\n", + "#TODO creo q no va:\n", + "from dict_paises import COUNTRY_ALPHA3_TO_COUNTRY_ALPHA2, COUNTRY_ALPHA2_TO_CONTINENT\n", + "from joblib import dump, load\n", + "from os.path import exists\n", + "\n", + "from sklearn.model_selection import StratifiedKFold, KFold,RandomizedSearchCV, train_test_split, cross_validate\n", + "from sklearn.tree import DecisionTreeClassifier, export_graphviz, export_text\n", + "from sklearn.metrics import confusion_matrix, classification_report , f1_score, make_scorer, precision_score, recall_score, accuracy_score,f1_score\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "from sklearn import tree\n", + "from sklearn.preprocessing import OneHotEncoder, StandardScaler\n", + "\n", + "\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.model_selection import train_test_split, RandomizedSearchCV, GridSearchCV, cross_val_score\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "from sklearn.metrics import confusion_matrix, classification_report\n", + "from sklearn.metrics import accuracy_score\n", + "\n", + "\n", + "\n", + "#Si estamos en colab tenemos que instalar la libreria \"dtreeviz\" aparte. \n", + "if IN_COLAB == True:\n", + " !pip install 'dtreeviz'\n", + "import dtreeviz as dtreeviz\n", + "\n", + "#Para eliminar los warnings\n", + "import warnings\n", + "warnings.simplefilter(action='ignore', category=FutureWarning)\n", + "warnings.simplefilter(action='ignore', category=UserWarning)\n", + "\n", + "import tensorflow as tf\n", + "from tensorflow import keras\n", + "from keras.utils.vis_utils import plot_model\n", + "\n", + "from keras.wrappers.scikit_learn import KerasClassifier #Libreria para usarg Grid Search con kerss" + ] + }, + { + "cell_type": "markdown", + "id": "e599699a", + "metadata": {}, + "source": [ + "Constantes" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "135ff858", + "metadata": {}, + "outputs": [], + "source": [ + "# Constantes\n", + "JOBS=-2\n", + "SEED=9\n", + "\n", + "np.random.seed(SEED)\n", + "tf.random.set_seed(SEED) " + ] + }, + { + "cell_type": "markdown", + "id": "eba624e8", + "metadata": {}, + "source": [ + "importo el dataframe original para tener los ids" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "feb9d3a1", + "metadata": {}, + "outputs": [], + "source": [ + "hotelsdf_pruebasOriginal = pd.read_csv(\"./hotels_test.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "635841e6", + "metadata": {}, + "source": [ + "Importamos los dataframes ya filtrados que generamos en el checkpoint 1. De esta forma evitamos tener todo el codigo de homologacion de dataframes de testeo y train aqui de nuevo" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "32efae1e", + "metadata": {}, + "outputs": [], + "source": [ + "hotelsdf_train_filtrado = pd.read_csv(\"hotels_filtrado_train.csv\")\n", + "hotelsdf_testeo_filtrado = pd.read_csv(\"hotels_filtrado_test.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5b2cc4a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Faltan en arbol: []\n", + "Sobran en arbol: ['is_canceled']\n" + ] + } + ], + "source": [ + "set_test = set(hotelsdf_testeo_filtrado.columns)\n", + "set_modelo = set(hotelsdf_train_filtrado.columns)\n", + "\n", + "missing = list(sorted(set_test - set_modelo))\n", + "added = list(sorted(set_modelo - set_test))\n", + "\n", + "print('Faltan en arbol:', missing)\n", + "print('Sobran en arbol:', added)" + ] + }, + { + "cell_type": "markdown", + "id": "1ae3598d", + "metadata": {}, + "source": [ + "Guardo datos antes de separacion train test" + ] + }, + { + "cell_type": "markdown", + "id": "f66e432d", + "metadata": {}, + "source": [ + "# Generacion de datos para el entrenamiento de los modelos\n", + "\n", + "Se genera un dataset con los datos necesarios para predecir la cancelacion y creamos un dataset conteniendo el target, para luego, generar conjuntos de test y train" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9dd01a2a", + "metadata": {}, + "outputs": [], + "source": [ + "hotelsdf_modelo_x=hotelsdf_train_filtrado.drop(['is_canceled'], axis='columns', inplace=False)\n", + "\n", + "hotelsdf_modelo_y = hotelsdf_train_filtrado['is_canceled'].copy()\n", + "\n", + "x_train, x_test, y_train, y_test = train_test_split(hotelsdf_modelo_x,\n", + " hotelsdf_modelo_y, \n", + " test_size=0.3, #proporcion 70/30\n", + " random_state=SEED) #Semilla 9, como el Equipo !!" + ] + }, + { + "cell_type": "markdown", + "id": "b2149472", + "metadata": {}, + "source": [ + "Buscamos los valores que no fueron generados por el one hot encoder" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "06cd0ca4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['lead_time', 'arrival_year', 'arrival_week_number', 'arrival_month_day',\n", + " 'weekend_nights_num', 'week_nights_num', 'adult_num', 'children_num',\n", + " 'babies_num', 'is_repeated_guest', 'previous_cancellations_num',\n", + " 'booking_changes_num', 'agent_id', 'days_in_waiting_list',\n", + " 'average_daily_rate', 'required_car_parking_spaces_num',\n", + " 'special_requests_num', 'dias_totales', 'hotel_name_Resort Hotel',\n", + " 'arrival_month_August', 'arrival_month_December',\n", + " 'arrival_month_February', 'arrival_month_January', 'arrival_month_July',\n", + " 'arrival_month_June', 'arrival_month_March', 'arrival_month_May',\n", + " 'arrival_month_November', 'arrival_month_October',\n", + " 'arrival_month_September', 'meal_type_FB', 'meal_type_HB',\n", + " 'meal_type_SC', 'meal_type_Undefined',\n", + " 'market_segment_type_Complementary', 'market_segment_type_Corporate',\n", + " 'market_segment_type_Direct', 'market_segment_type_Groups',\n", + " 'market_segment_type_Offline TA/TO', 'market_segment_type_Online TA',\n", + " 'distribution_channel_Direct', 'distribution_channel_GDS',\n", + " 'distribution_channel_TA/TO', 'reserved_room_type_B',\n", + " 'reserved_room_type_C', 'reserved_room_type_D', 'reserved_room_type_E',\n", + " 'reserved_room_type_F', 'reserved_room_type_G', 'reserved_room_type_H',\n", + " 'assigned_room_type_B', 'assigned_room_type_C', 'assigned_room_type_D',\n", + " 'assigned_room_type_E', 'assigned_room_type_F', 'assigned_room_type_G',\n", + " 'assigned_room_type_H', 'assigned_room_type_I', 'assigned_room_type_K',\n", + " 'deposit_type_Non Refund', 'deposit_type_Refundable',\n", + " 'customer_type_Group', 'customer_type_Transient',\n", + " 'customer_type_Transient-Party', 'continente_Asia', 'continente_Europe',\n", + " 'continente_North America', 'continente_Oceania',\n", + " 'continente_South America'],\n", + " dtype='object')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4c39306f", + "metadata": {}, + "outputs": [], + "source": [ + "valoresNoBinarios = ['lead_time', 'arrival_year', 'arrival_week_number', 'arrival_month_day',\n", + " 'weekend_nights_num', 'week_nights_num', 'adult_num', 'children_num',\n", + " 'babies_num', 'previous_cancellations_num',\n", + " 'booking_changes_num', 'days_in_waiting_list',\n", + " 'average_daily_rate', 'required_car_parking_spaces_num',\n", + " 'special_requests_num', 'dias_totales']" + ] + }, + { + "cell_type": "markdown", + "id": "85ad1054", + "metadata": {}, + "source": [ + "Imports para armar la red" + ] + }, + { + "cell_type": "markdown", + "id": "fbe3493d", + "metadata": {}, + "source": [ + "Tenemos que escalar todos los valores de nuestro data set (excepto los valores producidos por el one hot encoding" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ad6fc897", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
StandardScaler()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "StandardScaler()" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sScaler = StandardScaler()\n", + "sScaler.fit(pd.DataFrame(x_train[valoresNoBinarios]))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "c7ffabf6", + "metadata": {}, + "outputs": [], + "source": [ + "x_train_transform_1=sScaler.transform(pd.DataFrame(x_train[valoresNoBinarios]))\n", + "x_test_transform_1=sScaler.transform(pd.DataFrame(x_test[valoresNoBinarios]))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "61bfb985", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-0.08993302, 1.20492525, -1.05091228, ..., -0.22125409,\n", + " 1.98006251, -0.19194279],\n", + " [-0.04922764, 1.20492525, 0.43392148, ..., -0.22125409,\n", + " 0.64636577, 1.6108728 ],\n", + " [ 0.3680026 , 1.20492525, -0.38273709, ..., -0.22125409,\n", + " 1.98006251, -0.19194279],\n", + " ...,\n", + " [-0.10010937, -0.20168049, -0.60546216, ..., -0.22125409,\n", + " -0.68733097, -1.09335058],\n", + " [-0.35451805, -0.20168049, 0.35967979, ..., -0.22125409,\n", + " 0.64636577, -0.64264669],\n", + " [-0.76157194, -1.60828624, 1.10209667, ..., -0.22125409,\n", + " 1.98006251, 1.16016891]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train_transform_1" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "646832e5", + "metadata": {}, + "outputs": [], + "source": [ + "#Creamos un nuevo dataframe con los valores escalados\n", + "x_train_escalado = x_train.copy()\n", + "x_test_escalado = x_test.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "359234db", + "metadata": {}, + "outputs": [], + "source": [ + "#Le asignamos los nuevos valores escalados y mantenemos los valores del one hot encoding\n", + "for i in range(len(valoresNoBinarios)):\n", + " x_train_escalado[valoresNoBinarios[i]]=x_train_transform_1[:,i]\n", + " x_test_escalado[valoresNoBinarios[i]]=x_test_transform_1[:,i]" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "466127c4", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
lead_timearrival_yeararrival_week_numberarrival_month_dayweekend_nights_numweek_nights_numadult_numchildren_numbabies_numis_repeated_guest...deposit_type_Non Refunddeposit_type_Refundablecustomer_type_Groupcustomer_type_Transientcustomer_type_Transient-Partycontinente_Asiacontinente_Europecontinente_North Americacontinente_Oceaniacontinente_South America
15425-0.0899331.204925-1.0509121.7283380.078225-0.2972590.263118-0.250952-0.0826810...0001001000
42050-0.0492281.2049250.4339210.0225261.1452641.4892132.437582-0.250952-0.0826810...0001001000
250550.3680031.204925-0.382737-1.683286-0.9888140.2982312.437582-0.250952-0.0826810...0001001000
6191.1821101.204925-0.308495-1.114682-0.988814-0.2972590.263118-0.250952-0.0826810...0001001000
304700.011830-0.2016800.5824050.932292-0.9888140.8937220.263118-0.250952-0.0826810...0001001000
..................................................................
42747-1.097391-0.2016800.5824051.046013-0.988814-0.8927500.263118-0.250952-0.0826810...0001001000
22584-0.2324021.2049250.062713-0.432357-0.988814-0.2972590.263118-0.250952-0.0826810...0001001000
501-0.100109-0.201680-0.605462-1.000961-0.988814-0.8927500.263118-0.250952-0.0826810...0001001000
55934-0.354518-0.2016800.359680-1.1146820.078225-0.8927500.263118-0.250952-0.0826810...0001001000
20828-0.761572-1.6082861.1020970.1362471.1452640.8937220.263118-0.250952-0.0826810...0000001000
\n", + "

39817 rows × 69 columns

\n", + "
" + ], + "text/plain": [ + " lead_time arrival_year arrival_week_number arrival_month_day \\\n", + "15425 -0.089933 1.204925 -1.050912 1.728338 \n", + "42050 -0.049228 1.204925 0.433921 0.022526 \n", + "25055 0.368003 1.204925 -0.382737 -1.683286 \n", + "619 1.182110 1.204925 -0.308495 -1.114682 \n", + "30470 0.011830 -0.201680 0.582405 0.932292 \n", + "... ... ... ... ... \n", + "42747 -1.097391 -0.201680 0.582405 1.046013 \n", + "22584 -0.232402 1.204925 0.062713 -0.432357 \n", + "501 -0.100109 -0.201680 -0.605462 -1.000961 \n", + "55934 -0.354518 -0.201680 0.359680 -1.114682 \n", + "20828 -0.761572 -1.608286 1.102097 0.136247 \n", + "\n", + " weekend_nights_num week_nights_num adult_num children_num \\\n", + "15425 0.078225 -0.297259 0.263118 -0.250952 \n", + "42050 1.145264 1.489213 2.437582 -0.250952 \n", + "25055 -0.988814 0.298231 2.437582 -0.250952 \n", + "619 -0.988814 -0.297259 0.263118 -0.250952 \n", + "30470 -0.988814 0.893722 0.263118 -0.250952 \n", + "... ... ... ... ... \n", + "42747 -0.988814 -0.892750 0.263118 -0.250952 \n", + "22584 -0.988814 -0.297259 0.263118 -0.250952 \n", + "501 -0.988814 -0.892750 0.263118 -0.250952 \n", + "55934 0.078225 -0.892750 0.263118 -0.250952 \n", + "20828 1.145264 0.893722 0.263118 -0.250952 \n", + "\n", + " babies_num is_repeated_guest ... deposit_type_Non Refund \\\n", + "15425 -0.082681 0 ... 0 \n", + "42050 -0.082681 0 ... 0 \n", + "25055 -0.082681 0 ... 0 \n", + "619 -0.082681 0 ... 0 \n", + "30470 -0.082681 0 ... 0 \n", + "... ... ... ... ... \n", + "42747 -0.082681 0 ... 0 \n", + "22584 -0.082681 0 ... 0 \n", + "501 -0.082681 0 ... 0 \n", + "55934 -0.082681 0 ... 0 \n", + "20828 -0.082681 0 ... 0 \n", + "\n", + " deposit_type_Refundable customer_type_Group customer_type_Transient \\\n", + "15425 0 0 1 \n", + "42050 0 0 1 \n", + "25055 0 0 1 \n", + "619 0 0 1 \n", + "30470 0 0 1 \n", + "... ... ... ... \n", + "42747 0 0 1 \n", + "22584 0 0 1 \n", + "501 0 0 1 \n", + "55934 0 0 1 \n", + "20828 0 0 0 \n", + "\n", + " customer_type_Transient-Party continente_Asia continente_Europe \\\n", + "15425 0 0 1 \n", + "42050 0 0 1 \n", + "25055 0 0 1 \n", + "619 0 0 1 \n", + "30470 0 0 1 \n", + "... ... ... ... \n", + "42747 0 0 1 \n", + "22584 0 0 1 \n", + "501 0 0 1 \n", + "55934 0 0 1 \n", + "20828 0 0 1 \n", + "\n", + " continente_North America continente_Oceania continente_South America \n", + "15425 0 0 0 \n", + "42050 0 0 0 \n", + "25055 0 0 0 \n", + "619 0 0 0 \n", + "30470 0 0 0 \n", + "... ... ... ... \n", + "42747 0 0 0 \n", + "22584 0 0 0 \n", + "501 0 0 0 \n", + "55934 0 0 0 \n", + "20828 0 0 0 \n", + "\n", + "[39817 rows x 69 columns]" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_train_escalado" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "ae215ae3", + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
lead_timearrival_yeararrival_week_numberarrival_month_dayweekend_nights_numweek_nights_numadult_numchildren_numbabies_numis_repeated_guest...deposit_type_Non Refunddeposit_type_Refundablecustomer_type_Groupcustomer_type_Transientcustomer_type_Transient-Partycontinente_Asiacontinente_Europecontinente_North Americacontinente_Oceaniacontinente_South America
52715-0.5173401.204925-1.0509121.5008960.0782250.8937220.263118-0.25095211.6748100...0001001000
406512.087805-1.6082860.5824051.159734-0.988814-0.2972590.263118-0.250952-0.0826810...1000101000
397850.541001-0.201680-1.0509121.0460130.078225-0.2972590.263118-0.250952-0.0826810...1001001000
560790.8055861.204925-0.4569791.2734541.145264-0.8927500.263118-0.250952-0.0826810...0001001000
479802.515212-1.6082861.027855-1.000961-0.988814-0.2972590.263118-0.250952-0.0826810...1000101000
..................................................................
41901-1.087215-0.2016800.2111960.591130-0.988814-0.8927500.263118-0.250952-0.0826810...0001001000
428041.741809-0.2016801.102097-0.432357-0.9888140.2982310.263118-0.250952-0.0826810...1001001000
22168-1.015981-0.201680-1.273637-1.569565-0.988814-0.892750-1.911346-0.250952-0.0826810...0000101000
36851-0.7208671.2049250.062713-0.7735191.145264-1.4882400.263118-0.250952-0.0826810...0001001000
17270-1.0770391.204925-0.976671-1.5695650.078225-1.488240-1.911346-0.250952-0.0826810...0001001000
\n", + "

17065 rows × 69 columns

\n", + "
" + ], + "text/plain": [ + " lead_time arrival_year arrival_week_number arrival_month_day \\\n", + "52715 -0.517340 1.204925 -1.050912 1.500896 \n", + "40651 2.087805 -1.608286 0.582405 1.159734 \n", + "39785 0.541001 -0.201680 -1.050912 1.046013 \n", + "56079 0.805586 1.204925 -0.456979 1.273454 \n", + "47980 2.515212 -1.608286 1.027855 -1.000961 \n", + "... ... ... ... ... \n", + "41901 -1.087215 -0.201680 0.211196 0.591130 \n", + "42804 1.741809 -0.201680 1.102097 -0.432357 \n", + "22168 -1.015981 -0.201680 -1.273637 -1.569565 \n", + "36851 -0.720867 1.204925 0.062713 -0.773519 \n", + "17270 -1.077039 1.204925 -0.976671 -1.569565 \n", + "\n", + " weekend_nights_num week_nights_num adult_num children_num \\\n", + "52715 0.078225 0.893722 0.263118 -0.250952 \n", + "40651 -0.988814 -0.297259 0.263118 -0.250952 \n", + "39785 0.078225 -0.297259 0.263118 -0.250952 \n", + "56079 1.145264 -0.892750 0.263118 -0.250952 \n", + "47980 -0.988814 -0.297259 0.263118 -0.250952 \n", + "... ... ... ... ... \n", + "41901 -0.988814 -0.892750 0.263118 -0.250952 \n", + "42804 -0.988814 0.298231 0.263118 -0.250952 \n", + "22168 -0.988814 -0.892750 -1.911346 -0.250952 \n", + "36851 1.145264 -1.488240 0.263118 -0.250952 \n", + "17270 0.078225 -1.488240 -1.911346 -0.250952 \n", + "\n", + " babies_num is_repeated_guest ... deposit_type_Non Refund \\\n", + "52715 11.674810 0 ... 0 \n", + "40651 -0.082681 0 ... 1 \n", + "39785 -0.082681 0 ... 1 \n", + "56079 -0.082681 0 ... 0 \n", + "47980 -0.082681 0 ... 1 \n", + "... ... ... ... ... \n", + "41901 -0.082681 0 ... 0 \n", + "42804 -0.082681 0 ... 1 \n", + "22168 -0.082681 0 ... 0 \n", + "36851 -0.082681 0 ... 0 \n", + "17270 -0.082681 0 ... 0 \n", + "\n", + " deposit_type_Refundable customer_type_Group customer_type_Transient \\\n", + "52715 0 0 1 \n", + "40651 0 0 0 \n", + "39785 0 0 1 \n", + "56079 0 0 1 \n", + "47980 0 0 0 \n", + "... ... ... ... \n", + "41901 0 0 1 \n", + "42804 0 0 1 \n", + "22168 0 0 0 \n", + "36851 0 0 1 \n", + "17270 0 0 1 \n", + "\n", + " customer_type_Transient-Party continente_Asia continente_Europe \\\n", + "52715 0 0 1 \n", + "40651 1 0 1 \n", + "39785 0 0 1 \n", + "56079 0 0 1 \n", + "47980 1 0 1 \n", + "... ... ... ... \n", + "41901 0 0 1 \n", + "42804 0 0 1 \n", + "22168 1 0 1 \n", + "36851 0 0 1 \n", + "17270 0 0 1 \n", + "\n", + " continente_North America continente_Oceania continente_South America \n", + "52715 0 0 0 \n", + "40651 0 0 0 \n", + "39785 0 0 0 \n", + "56079 0 0 0 \n", + "47980 0 0 0 \n", + "... ... ... ... \n", + "41901 0 0 0 \n", + "42804 0 0 0 \n", + "22168 0 0 0 \n", + "36851 0 0 0 \n", + "17270 0 0 0 \n", + "\n", + "[17065 rows x 69 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "x_test_escalado" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "206d769c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " dense (Dense) (None, 8) 560 \n", + " \n", + " dense_1 (Dense) (None, 1) 9 \n", + " \n", + "=================================================================\n", + "Total params: 569\n", + "Trainable params: 569\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "cant_clases = 1\n", + "\n", + "\n", + "#d_in=len(y_train)\n", + "d_in=len(x_train_escalado.columns)\n", + "\n", + "modelo_hotels_1 = keras.Sequential([\n", + " keras.layers.Dense(8,input_shape=(d_in,),activation ='relu'),\n", + " keras.layers.Dense(cant_clases, activation='sigmoid'),\n", + "])\n", + "\n", + "\n", + "modelo_hotels_1.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "429a2337", + "metadata": {}, + "outputs": [], + "source": [ + "modelo_hotels_1.compile(\n", + " optimizer=keras.optimizers.SGD(learning_rate=0.1), \n", + " loss='binary_crossentropy', \n", + " # metricas para ir calculando en cada iteracion o batch \n", + " metrics=['AUC'], \n", + ")\n", + "\n", + "cant_epochs=10\n", + "\n", + "historia_modelo_hotel_1=modelo_hotels_1.fit(x_train_escalado,y_train,epochs=cant_epochs,batch_size=16,verbose=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "14fa7413", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "534/534 [==============================] - 0s 631us/step\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_pred = modelo_hotels_1.predict(x_test_escalado)\n", + "y_predic_cat_ej1 = np.where(y_pred>0.7,1,0)\n", + "\n", + "ds_validacion=pd.DataFrame(y_predic_cat_ej1,y_test).reset_index()\n", + "ds_validacion.columns=['y_pred','y_real']\n", + "\n", + "tabla=pd.crosstab(ds_validacion.y_pred, ds_validacion.y_real)\n", + "grf=sns.heatmap(tabla,annot=True, cmap = 'Blues', fmt='g')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "3e2334b8", + "metadata": {}, + "outputs": [], + "source": [ + "if not exists('submissions/red_neuronal_basica.csv'):\n", + " y_pred_testeo = modelo_hotels_1.predict(hotelsdf_testeo_filtrado)\n", + " y_pred_testeo_cat = np.where(y_pred_testeo>0.70,1,0)\n", + " df_resultados_pred = pd.DataFrame.from_records(y_pred_testeo_cat,columns = [\"resultado\"])\n", + " df_submission = pd.DataFrame({'id': hotelsdf_pruebasOriginal['id'], 'is_canceled': df_resultados_pred[\"resultado\"]})\n", + " df_submission.to_csv('submissions/red_neuronal_basica.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "id": "f3c21a91", + "metadata": {}, + "source": [ + "# Validacion cruzada" + ] + }, + { + "cell_type": "markdown", + "id": "7f01b974", + "metadata": {}, + "source": [ + "En esta etapa vamos a realizar unas series de validaciones cruzadas en la busqueda de encontrar el mejor resultado" + ] + }, + { + "cell_type": "markdown", + "id": "0bad7ce4", + "metadata": {}, + "source": [ + "Para usar la libreria Keras Classifier necesitamos crear una funcion que cree una modelo." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "7759031a", + "metadata": {}, + "outputs": [], + "source": [ + "loss='binary_crossentropy'\n", + "metrics=['AUC']\n", + "optimizer=\"adam\"\n", + "\n", + "def creador_modelo(learning_rate = 0.1, \n", + " activation = 'sigmoid', \n", + " output = 2, \n", + " hidden_layers = 2\n", + " ):\n", + " model = keras.Sequential()\n", + " model.add(keras.layers.Dense(5, activation=activation, input_shape=(d_in,)))\n", + " \n", + " for i in range(hidden_layers):\n", + " model.add(keras.layers.Dense(output, activation=activation))\n", + "\n", + " model.add(keras.layers.Dense(1, activation=activation))\n", + " \n", + " model.compile(\n", + " optimizer=optimizer,\n", + " loss=loss, \n", + " metrics=metrics, \n", + " )\n", + " return model" + ] + }, + { + "cell_type": "markdown", + "id": "2ee7a66a", + "metadata": {}, + "source": [ + "Vamos a empezar con una baja cantidad de epochs y batch_size" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "aefb38c7", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_6135/2109703127.py:1: DeprecationWarning: KerasClassifier is deprecated, use Sci-Keras (https://github.com/adriangb/scikeras) instead. See https://www.adriangb.com/scikeras/stable/migration.html for help migrating.\n" + ] + } + ], + "source": [ + "model = KerasClassifier(build_fn=creador_modelo, \n", + " verbose=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "69986586", + "metadata": {}, + "outputs": [], + "source": [ + "param_grid = { \n", + " \"hidden_layers\" : [1, 5, 10, 15, 20], \n", + " \"output\" : [1, 2, 4, 8, 32, 64], \n", + " \"batch_size\" : [5, 10, 20],\n", + " \"epochs\" : [50, 100, 150],\n", + " \"activation\": [\"sigmoid\", \"relu\", \"softmax\", \"softplus\", \"elu\", ]\n", + " } " + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1774e6d4", + "metadata": {}, + "outputs": [], + "source": [ + "rs = RandomizedSearchCV(estimator=model, param_distributions=param_grid,n_jobs=JOBS, cv=3,n_iter=10)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "7bc790f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Keras model archive loading:\n", + "File Name Modified Size\n", + "variables.h5 2023-05-25 21:37:40 270264\n", + "config.json 2023-05-25 21:37:40 7766\n", + "metadata.json 2023-05-25 21:37:40 64\n", + "Keras weights file () loading:\n", + "...layers\n", + "......dense\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_1\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_10\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_11\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_12\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_13\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_14\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_15\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_16\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_2\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_3\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_4\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_5\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_6\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_7\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_8\n", + ".........vars\n", + "............0\n", + "............1\n", + "......dense_9\n", + ".........vars\n", + "............0\n", + "............1\n", + "...metrics\n", + "......auc\n", + ".........vars\n", + "............0\n", + "............1\n", + "............2\n", + "............3\n", + "......mean\n", + ".........vars\n", + "............0\n", + "............1\n", + "...optimizer\n", + "......vars\n", + ".........0\n", + ".........1\n", + ".........10\n", + ".........11\n", + ".........12\n", + ".........13\n", + ".........14\n", + ".........15\n", + ".........16\n", + ".........17\n", + ".........18\n", + ".........19\n", + ".........2\n", + ".........20\n", + ".........21\n", + ".........22\n", + ".........23\n", + ".........24\n", + ".........25\n", + ".........26\n", + ".........27\n", + ".........28\n", + ".........29\n", + ".........3\n", + ".........30\n", + ".........31\n", + ".........32\n", + ".........33\n", + ".........34\n", + ".........35\n", + ".........36\n", + ".........37\n", + ".........38\n", + ".........39\n", + ".........4\n", + ".........40\n", + ".........41\n", + ".........42\n", + ".........43\n", + ".........44\n", + ".........45\n", + ".........46\n", + ".........47\n", + ".........48\n", + ".........49\n", + ".........5\n", + ".........50\n", + ".........51\n", + ".........52\n", + ".........53\n", + ".........54\n", + ".........55\n", + ".........56\n", + ".........57\n", + ".........58\n", + ".........59\n", + ".........6\n", + ".........60\n", + ".........61\n", + ".........62\n", + ".........63\n", + ".........64\n", + ".........65\n", + ".........66\n", + ".........67\n", + ".........68\n", + ".........7\n", + ".........8\n", + ".........9\n", + "...vars\n" + ] + } + ], + "source": [ + "if exists('modelos/rs_fit.joblib') == False:\n", + " rs_fit = rs.fit(X = x_train_escalado, y = y_train)\n", + " dump(rs_fit, 'modelos/rs_fit.joblib')\n", + "else:\n", + " rs_fit = load('modelos/rs_fit.joblib')" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "b30a25a0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'output': 32,\n", + " 'hidden_layers': 15,\n", + " 'epochs': 50,\n", + " 'batch_size': 10,\n", + " 'activation': 'relu'}" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rs_fit.best_params_" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "3d16794a", + "metadata": {}, + "outputs": [], + "source": [ + "modelo_rs = keras.Sequential()\n", + "modelo_rs.add(keras.layers.Dense(5, activation=rs_fit.best_params_[\"activation\"], input_shape=(d_in,)))\n", + " \n", + "for i in range(rs_fit.best_params_[\"hidden_layers\"]):\n", + " # Add one hidden layer\n", + " modelo_rs.add(keras.layers.Dense(rs_fit.best_params_[\"output\"], activation=rs_fit.best_params_[\"activation\"]))\n", + "\n", + "modelo_rs.add(keras.layers.Dense(1, activation=\"sigmoid\"))\n", + "\n", + " \n", + "modelo_rs.compile(\n", + "# optimizer=keras.optimizers.SGD(learning_rate=rs_fit.best_params_[\"learning_rate\"]), \n", + " optimizer=optimizer,\n", + " loss=loss, \n", + " metrics=metrics, \n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "00028b2d", + "metadata": {}, + "outputs": [], + "source": [ + "# cant_epochs=10\n", + "cant_epochs=rs_fit.best_params_[\"epochs\"]\n", + "batch_size=rs_fit.best_params_[\"batch_size\"]\n", + "\n", + "historia_modelo_hotel_2=modelo_rs.fit(x_train_escalado,y_train,\n", + " epochs=cant_epochs,\n", + " batch_size=batch_size,verbose=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "759b6790", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "534/534 [==============================] - 1s 759us/step\n" + ] + }, + { + "data": { + "image/png": "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7+7a16dPHy1cuFB9+/b12OAAAKgKqnqY8IQKdUgaNGggu91eYr/dble9evV+96AAAMDVpUKB5Mknn9TEiROVlZXl2udwODRlyhT97W9/89jgAACoCmw2m0e2qqxCUzbz58/X999/r6ZNm+q6666TJGVkZMjHx0fHjh3TggULXLVff/21Z0YKAMAViikbYxUKJAMHDvTwMAAAqLqqeHPDIyoUSJ566qky1b311ls6c+ZMiUfLAwAA/JapD48bNWqUjh49auZbAABQ6VWz2TyyVWW/60mtRpxOp5mnBwDgisCj443xGQEAAMuZ2iEBAADc1FoWBBIAAExW1e//8ASmbAAAuArExcXJZrMpNjbWtc/pdGrGjBkKDg6Wr6+vevbsqV27drm9rqCgQOPGjZO/v79q166tqKgoZWZmutXk5OQoJiZGdrtddrtdMTExOnnyZLnGV6FA8tBDD+mLL74wrGvatKm8vb0r8hYAAFQZNptntoraunWrXn75Zd18881u++Pj4zV37lwlJiZq69atCgoKUkREhE6fPu2qiY2NVVJSkpYvX67169crLy9P/fv3V3FxsasmOjpa6enpSk5OVnJystLT0xUTE1OuMVYokJw+fVqRkZEKCQnRzJkzdfjw4VLrdu7cqSZNmlTkLQAAqDKs/LbfvLw8DR06VAsXLnT7vjmn06l58+bpiSee0KBBgxQaGqolS5bo7NmzWrZsmSQpNzdXr776qubMmaPevXurffv2evPNN7Vjxw6tWbNGkrRnzx4lJyfrlVdeUXh4uMLDw7Vw4UKtXr1ae/fuLftnVJGLW7FihQ4fPqyxY8fqnXfeUbNmzdSvXz+9++67KioqqsgpAQCAgYKCAp06dcptKygouORrHn30Ud11113q3bu32/4DBw7I4XAoMjLStc/Hx0c9evTQhg0bJElpaWkqKipyqwkODlZoaKirZuPGjbLb7QoLC3PVdOnSRXa73VVTFhW+h6RBgwZ67LHHtH37dm3ZskU33HCDYmJiFBwcrAkTJmjfvn0VPTUAAFWKpx6MFhcX57pP49ctLi7uou+7fPlyff3116XWOBwOSVJgYKDb/sDAQNcxh8OhGjVquHVWSqsJCAgocf6AgABXTZk+ozJXXkRWVpZSUlKUkpKi6tWr684779SuXbvUpk0bJSQk/N7TAwBwxfPUPSTTp09Xbm6u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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "y_pred = modelo_rs.predict(x_test_escalado)\n", + "y_predic_cat_ej1 = np.where(y_pred>0.5,1,0)\n", + "\n", + "ds_validacion=pd.DataFrame(y_predic_cat_ej1,y_test).reset_index()\n", + "ds_validacion.columns=['y_pred','y_real']\n", + "\n", + "tabla=pd.crosstab(ds_validacion.y_pred, ds_validacion.y_real)\n", + "grf=sns.heatmap(tabla,annot=True, cmap = 'Blues', fmt='g')\n", + "#plt.ticklabel_format(style='plain', axis='both')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34d3ca3f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "jupytext": { + "formats": "ipynb,md" + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}