{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Preparación del entorno\n\nEl primer paso es importar las librerías necesarias. En el caso de que la librería no esté disponible en el entorno virtual, podemos instalarla manualmente. Por ejemplo, haciendo uso de pip:\n\n    !pip3 install hiddenlayer\n\nAclaración: Cualquier línea que comience con un signo de exclamación será ejecutada como un comando en una consola/terminal.","metadata":{}},{"cell_type":"code","source":"import os\nfrom glob import glob\n\n# Con fines de reproducibilidad, es importante fijar un valor para los generadores\n# de números aleatorios.\nRANDOM_SEED = 24\n\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom scipy.stats import kurtosis, skew","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-09-05T18:40:15.710082Z","iopub.execute_input":"2023-09-05T18:40:15.711117Z","iopub.status.idle":"2023-09-05T18:40:17.362919Z","shell.execute_reply.started":"2023-09-05T18:40:15.711077Z","shell.execute_reply":"2023-09-05T18:40:17.361623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Lectura de los archivos de la competencia","metadata":{}},{"cell_type":"code","source":"data_path = \"/kaggle/input/habla-imaginada-clasificacion-senales-EEG/\"\n\ndf_train = pd.read_csv(f'{data_path}X_train/X_train')\ndf_test = pd.read_csv(f'{data_path}X_test/X_test')\ny_train = pd.read_csv(f'{data_path}y_train.csv', header=None, names=['is_letter'])","metadata":{"execution":{"iopub.status.busy":"2023-09-05T18:59:28.934692Z","iopub.execute_input":"2023-09-05T18:59:28.935185Z","iopub.status.idle":"2023-09-05T19:02:25.380153Z","shell.execute_reply.started":"2023-09-05T18:59:28.935141Z","shell.execute_reply":"2023-09-05T19:02:25.378815Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"channels = list(set([c[:2] for c in df_train.columns if len(c) < 5]))\nchannels.sort()","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:02:25.382544Z","iopub.execute_input":"2023-09-05T19:02:25.383176Z","iopub.status.idle":"2023-09-05T19:02:25.397571Z","shell.execute_reply.started":"2023-09-05T19:02:25.383141Z","shell.execute_reply":"2023-09-05T19:02:25.396493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exploramos los datos. Como se puede ver, las diferencias entre letras y comandos no son tan sencillas de ver a simple vista!","metadata":{}},{"cell_type":"code","source":"letter_sample = df_train[y_train.is_letter.values].head(1)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:02:25.398981Z","iopub.execute_input":"2023-09-05T19:02:25.399335Z","iopub.status.idle":"2023-09-05T19:02:25.584057Z","shell.execute_reply.started":"2023-09-05T19:02:25.399306Z","shell.execute_reply":"2023-09-05T19:02:25.582715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig, axes = plt.subplots(nrows=6, ncols=2, figsize=(10,10), sharey=True)\n\nletter_sample = df_train[y_train.is_letter.values].head(1)\ncommand_sample = df_train[~(y_train.is_letter).values].head(1)\n\nix_channel = 0\nfor ix_row in range(6):\n    for ix_col in range(2):\n        label = \"Letra\" if ix_col == 0 else \"Comando\"\n        channel_cols = [c for c in df_train.columns if channels[ix_channel] in c]\n        axes[ix_row, ix_col].set_title(f\"{label} (canal {channels[ix_channel]})\")\n        if label == \"Letra\":\n            axes[ix_row, ix_col].plot(letter_sample[channel_cols].values[0])\n        else:\n            axes[ix_row, ix_col].plot(command_sample[channel_cols].values[0])\n\n    ix_channel += 1\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:02:25.586447Z","iopub.execute_input":"2023-09-05T19:02:25.586819Z","iopub.status.idle":"2023-09-05T19:02:28.723454Z","shell.execute_reply.started":"2023-09-05T19:02:25.586786Z","shell.execute_reply":"2023-09-05T19:02:28.722209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Extracción de características\n\nDefinimos las funciones para procesar las señales de EEG y extraer las características que verá el clasificador.","metadata":{}},{"cell_type":"markdown","source":"### Características\n\nSe procesa la señal temporal para extraer seis estadísticos por cada canal: media, desvío estandar, mínimo, máximo, curtosis y el coeficiente de asimetría de Fisher.","metadata":{}},{"cell_type":"code","source":"X_train = pd.DataFrame()\nX_test = pd.DataFrame()","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:04:43.498740Z","iopub.execute_input":"2023-09-05T19:04:43.499428Z","iopub.status.idle":"2023-09-05T19:04:43.507955Z","shell.execute_reply.started":"2023-09-05T19:04:43.499378Z","shell.execute_reply":"2023-09-05T19:04:43.506090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"statistics = [np.mean, np.std, np.min, np.max, kurtosis, skew]\n\nfor channel in channels:\n    channel_columns = [c for c in df_train.columns if channel in c]\n    for stat in statistics:\n        col_name = f'{channel}_{stat.__name__}'\n        X_train[col_name] = stat(df_train[channel_columns], axis=1)\n        X_test[col_name] = stat(df_test[channel_columns], axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:04:45.632437Z","iopub.execute_input":"2023-09-05T19:04:45.632936Z","iopub.status.idle":"2023-09-05T19:05:08.442511Z","shell.execute_reply.started":"2023-09-05T19:04:45.632900Z","shell.execute_reply":"2023-09-05T19:05:08.441149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Definición y entrenamiento del clasificador\n\nDefinimos y entrenamos un perceptrón multicapa al que le ingresan las características normalizadas.","metadata":{}},{"cell_type":"code","source":"X_train.head()","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:08.445283Z","iopub.execute_input":"2023-09-05T19:05:08.446096Z","iopub.status.idle":"2023-09-05T19:05:08.477798Z","shell.execute_reply.started":"2023-09-05T19:05:08.446052Z","shell.execute_reply":"2023-09-05T19:05:08.476591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\nfrom sklearn.ensemble import GradientBoostingClassifier\nfrom sklearn.pipeline import make_pipeline\nfrom sklearn.metrics import classification_report\n\n# feature scaling\nscaler = StandardScaler()\n\n# base classifier\nclf = GradientBoostingClassifier(\n    n_estimators=100,\n    max_depth=5,\n    random_state=RANDOM_SEED)\n# classifier\npipe = make_pipeline(scaler, clf)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:08.479683Z","iopub.execute_input":"2023-09-05T19:05:08.480490Z","iopub.status.idle":"2023-09-05T19:05:09.302713Z","shell.execute_reply.started":"2023-09-05T19:05:08.480445Z","shell.execute_reply":"2023-09-05T19:05:09.301623Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# training\npipe.fit(X_train, y_train.is_letter.values)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:09.305190Z","iopub.execute_input":"2023-09-05T19:05:09.305861Z","iopub.status.idle":"2023-09-05T19:05:18.951491Z","shell.execute_reply.started":"2023-09-05T19:05:09.305824Z","shell.execute_reply":"2023-09-05T19:05:18.950109Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred_train = pipe.predict(X_train)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:18.953359Z","iopub.execute_input":"2023-09-05T19:05:18.953715Z","iopub.status.idle":"2023-09-05T19:05:18.976213Z","shell.execute_reply.started":"2023-09-05T19:05:18.953687Z","shell.execute_reply":"2023-09-05T19:05:18.975055Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(classification_report(y_train.is_letter.values, y_pred_train))","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:18.978041Z","iopub.execute_input":"2023-09-05T19:05:18.978613Z","iopub.status.idle":"2023-09-05T19:05:19.001649Z","shell.execute_reply.started":"2023-09-05T19:05:18.978569Z","shell.execute_reply":"2023-09-05T19:05:19.000396Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Generar el archivo de predicciones\n\nRealizamos las predicciones con nuestro modelo ya entrenado.","metadata":{}},{"cell_type":"code","source":"predicted_labels = pipe.predict(X_test)","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:19.003195Z","iopub.execute_input":"2023-09-05T19:05:19.004371Z","iopub.status.idle":"2023-09-05T19:05:19.020748Z","shell.execute_reply.started":"2023-09-05T19:05:19.004334Z","shell.execute_reply":"2023-09-05T19:05:19.019803Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Luego escribimos las predicciones junto a los ids en un archivo (`\"submission.csv\"`).","metadata":{}},{"cell_type":"code","source":"df_test_predictions = pd.DataFrame({'is_letter' : predicted_labels})\ndf_test_predictions.index = df_test.index + 1\ndf_test_predictions.index.names = ['ID']\n\ndf_test_predictions.to_csv(\"submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2023-09-05T19:05:37.355475Z","iopub.execute_input":"2023-09-05T19:05:37.355902Z","iopub.status.idle":"2023-09-05T19:05:37.374687Z","shell.execute_reply.started":"2023-09-05T19:05:37.355869Z","shell.execute_reply":"2023-09-05T19:05:37.373328Z"},"trusted":true},"execution_count":null,"outputs":[]}],"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}}