{"metadata":{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Load Data**","metadata":{}},{"cell_type":"code","source":"# Make sure GPU is turned on and see GPU type\n!nvidia-smi -L","metadata":{"execution":{"iopub.status.busy":"2022-05-12T13:21:42.159513Z","iopub.execute_input":"2022-05-12T13:21:42.159851Z","iopub.status.idle":"2022-05-12T13:21:42.94755Z","shell.execute_reply.started":"2022-05-12T13:21:42.159818Z","shell.execute_reply":"2022-05-12T13:21:42.946579Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Read CPU information\n!lscpu | grep CPU","metadata":{"execution":{"iopub.status.busy":"2022-05-12T13:20:37.59305Z","iopub.execute_input":"2022-05-12T13:20:37.593501Z","iopub.status.idle":"2022-05-12T13:20:38.391038Z","shell.execute_reply.started":"2022-05-12T13:20:37.59345Z","shell.execute_reply":"2022-05-12T13:20:38.389996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Importing the libraries\nimport pandas as pd\nimport numpy as np\nimport random\nimport os\nimport time\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.model_selection import GridSearchCV\n\nimport tensorflow as tf\nfrom keras.models import Sequential\nfrom keras.layers import Dense, Dropout\nfrom keras.optimizers import Adam\nfrom keras.utils.np_utils import to_categorical","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install catboost","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from catboost import CatBoostRegressor, CatBoostClassifier","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed: int):    \n    random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    np.random.seed(seed)\n    tf.random.set_seed(seed)\n\n    os.environ['TF_DETERMINISTIC_OPS'] = '1'\n    os.environ['TF_CUDNN_DETERMINISTIC'] = '1'\n    \n    #tf.config.threading.set_inter_op_parallelism_threads(1)\n    #tf.config.threading.set_intra_op_parallelism_threads(1)\n\nseed = 42 \nseed_everything(seed)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/eurecom-aml-2022-challenge-1/public/train.csv', low_memory = True)\n#df = pd.read_csv(\"drive/MyDrive/AML/train.csv\")\n#df.to_pickle(\"drive/MyDrive/AML/TrainingSet\")\n#df = pd.read_pickle(\"drive/MyDrive/AML/TrainingSet\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv('../input/eurecom-aml-2022-challenge-1/public/test_feat.csv', low_memory = True)\n#df_test = pd.read_csv(\"drive/MyDrive/AML/test_feat.csv\")\n#df_test.to_pickle(\"drive/MyDrive/AML/TestFeatures\")\n#df_test = pd.read_pickle(\"drive/MyDrive/AML/TestFeatures\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.head()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Data Pre-processing**","metadata":{}},{"cell_type":"code","source":"#Handling missing data\ndf.replace([np.inf, -np.inf], np.nan, inplace = True)\ndf.replace(True, 1, inplace = True)\ndf.replace(False, 0, inplace = True)\ndf.dropna(inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.replace(True, 1, inplace = True)\ndf_test.replace(False, 0, inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"counter = 0\nto_remove_columns = []\nfor col in range(df.shape[1]):\n    uniques = df[df.columns[col]].unique()\n    print(f\"Column {col} (('{df.columns[col]}')) has {len(uniques)} unique values.\")\n    if len(uniques) < 0.001*df.shape[0]:\n        counter += 1\n    if len(uniques) < 2:\n        to_remove_columns.append(df.columns[col])\ndf.drop(columns = to_remove_columns, inplace = True)\nprint(*to_remove_columns, sep = \", \", end = ''); print(\" columns removed\")\nprint(f\"{counter} features have unique values less than 0.1% of data length.\")","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.drop(columns = to_remove_columns, inplace = True)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test.shape","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Train test split\nX = df.iloc[:, 1:-1].values#.to_numpy().astype(np.float64)\ny = df.iloc[:, -1].values#.to_numpy().astype(np.float64)\nX_train, X_val, y_train, y_val = train_test_split(X, y, random_state = seed, test_size = 0.33)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = df_test.iloc[:, 1:].values#.to_numpy().astype(np.float64)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Outliers\ny_train_sorted = sorted(y_train.tolist())\nmin_temperature = y_train_sorted[0]\nmax_temperature = y_train_sorted[-1]\ndown_temperatures = y_train_sorted[int(round(0.001 * len(y_train_sorted)))]\nup_temperatures = y_train_sorted[int(round(0.999 * len(y_train_sorted)))]\nprint(f'Minimal temperature in training set is {min_temperature}.')\nprint(f'Maximal temperature in training set is {max_temperature}.')\nprint(f'Approximately 99.8% of temperatures are highrer than {down_temperatures} and lower than {up_temperatures}.')\nrow_indexes = np.where((y_train > down_temperatures) & (y_train < up_temperatures))\ny_train = y_train[row_indexes]\nX_train = X_train[row_indexes]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Outliers\ny_sorted = sorted(y.tolist())\nmin_temperature = y_sorted[0]\nmax_temperature = y_sorted[-1]\ndown_temperatures = y_sorted[int(round(0.001 * len(y_sorted)))]\nup_temperatures = y_sorted[int(round(0.999 * len(y_sorted)))]\nprint(f'Minimal temperature in dataset set is {min_temperature}.')\nprint(f'Maximal temperature in dataset set is {max_temperature}.')\nprint(f'Approximately 99.8% of temperatures are highrer than {down_temperatures} and lower than {up_temperatures}.')\nrow_indexes = np.where((y > down_temperatures) & (y < up_temperatures))\ny = y[row_indexes]\nX = X[row_indexes]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Scaling\nXmean, Xstd, ymean, ystd = X_train.mean(0), X_train.std(0), y_train.mean(), y_train.std()\nX_train = (X_train - Xmean) / Xstd\ny_train = (y_train - ymean) / ystd\nX_val = (X_val - Xmean) / Xstd\ny_val = (y_val - ymean) / ystd","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Scaling\nXmean, Xstd, ymean, ystd = X.mean(0), X.std(0), y.mean(), y.std()\nX = (X - Xmean) / Xstd\ny = (y - ymean) / ystd\nX_test = (X_test - Xmean) / Xstd","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#PCA feature selection\ncovariance_matrix = np.cov(X_train.T)\neigen_values, eigen_vectors = np.linalg.eig(covariance_matrix)\nvariance_explained = []\nargs=np.argsort(eigen_values)\nargs=np.flip(args)\neigen_values = eigen_values[args]\neigen_vectors = eigen_vectors[args]\nfor i in eigen_values:\n    variance_explained.append((i / sum(eigen_values)) * 100)\n\ncumulative_variance_explained = np.cumsum(variance_explained)\n\nprint(cumulative_variance_explained)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#14 first components represent 70% of the data \n#22 first components represent 80% of the data \n#33 first components represent 90% of the data\n#61 first components represent 99% of the data\nprojection_matrix = (eigen_vectors.T[:][:22]).T \nX_train = X_train.dot(projection_matrix)\nX_val = X_val.dot(projection_matrix)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n#PCA feature selection\ncovariance_matrix = np.cov(X.T)\neigen_values, eigen_vectors = np.linalg.eig(covariance_matrix)\nvariance_explained = []\nargs=np.argsort(eigen_values)\nargs=np.flip(args)\neigen_values = eigen_values[args]\neigen_vectors = eigen_vectors[args]\nfor i in eigen_values:\n    variance_explained.append((i / sum(eigen_values)) * 100)\n\ncumulative_variance_explained = np.cumsum(variance_explained)\n\nprint(cumulative_variance_explained)\n'''","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"'''\n#14 first components to represent 70% of the data \n#22 first components to represent 80% of the data \n#33 first components to represent 90% of the data\n#61 first components to represent 99% of the data\nprojection_matrix = (eigen_vectors.T[:][:22]).T \nX = X.dot(projection_matrix)\nX_test = X_test.dot(projection_matrix)\n'''","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Submission**","metadata":{}},{"cell_type":"code","source":"def submission_df(ypred, name):\n\n    submission_df = pd.DataFrame(data = {'index': df_test['index'].values,\n                                   'fact_temperature': ypred.squeeze()})\n    path = \"/kaggle/working\"\n    #path = \"drive/MyDrive/AML\"\n    path = os.path.join(path, \"submission\" + name + \".pt\")\n    submission_df.to_csv(path, index = False)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Model Selection**","metadata":{}},{"cell_type":"markdown","source":"**Random Forest Regressor**","metadata":{}},{"cell_type":"code","source":"#Random forest Regressor\n\ndef fit_pred_model(model):\n    model.fit(X_train, y_train)\n    ypred_train = model.predict(X_train)\n    ypred_val = model.predict(X_val)\n\n    train_rmse = mean_squared_error(y_train, ypred_train, squared = False)\n    val_rmse = mean_squared_error(y_val, ypred_val, squared = False)\n    print(f'{model.__class__} | Train RMSE: {train_rmse:.3f}')\n    print(f'{model.__class__} | Validation RMSE: {val_rmse:.3f}')\n\n    return model\n\nRFreg = fit_pred_model(RandomForestRegressor(n_jobs = 8, n_estimators = 32, max_depth = 64))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_RF = RFreg.predict(X_test) * ystd + ymean\n\n#submission_df(ypred_RF, 'RFreg')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Catboost Regressor**","metadata":{}},{"cell_type":"code","source":"#Catboost Regressor\n\ndef fit_pred_model(model):\n    model.fit(X_train, y_train)\n    ypred_train = model.predict(X_train)\n    ypred_val = model.predict(X_val)\n\n    train_rmse = mean_squared_error(y_train, ypred_train, squared = False)\n    val_rmse = mean_squared_error(y_val, ypred_val, squared = False)\n    print(f'{model.__class__} | Train RMSE: {train_rmse:.3f}')\n    print(f'{model.__class__} | Validation RMSE: {val_rmse:.3f}')\n\n    return model\n\nCBreg = fit_pred_model(CatBoostRegressor(loss_function = 'RMSE', iterations = 50000, learning_rate = 0.01, \n                                      depth = 12, task_type = 'GPU', random_seed = seed))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_CB = CBreg.predict(X_test) * ystd + ymean\n\n#submission_df(ypred_CB, 'CBreg')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Ensemble Catboost Regressor**","metadata":{}},{"cell_type":"code","source":"#Ensemble Catboost Regressor \n\nensemble_size = 10\n\ntrained_models = []\nfor sd in range(ensemble_size):    \n    model = CatBoostRegressor(loss_function = 'RMSE', iterations = 10000, learning_rate = 0.01, \n                              depth = 10, task_type = 'GPU', random_seed = sd*7)\n        \n    print(f'\\n Model index: {sd}\\n')\n    \n    model.fit(X_train, y_train)\n    \n    trained_models.append(model)\n\nall_preds_tr = []\nall_preds_va = []\nfor model in trained_models:\n        ypreds_train = np.asarray(model.predict(X_train))\n        ypreds_val = np.asarray(model.predict(X_val))\n        all_preds_tr.append(ypreds_train)\n        all_preds_va.append(ypreds_val)\nall_preds_train = np.stack(all_preds_tr, axis = 0)\nall_preds_val = np.stack(all_preds_va, axis = 0)\n\nypred_train = np.squeeze(np.mean(all_preds_train, axis = 0))\nypred_val = np.squeeze(np.mean(all_preds_val, axis = 0))\n\ntrain_rmse = mean_squared_error(y_train, ypred_train, squared = False)\nval_rmse = mean_squared_error(y_val, ypred_val, squared = False)\nprint(f'{model.__class__} | Train RMSE: {train_rmse:.3f}')\nprint(f'{model.__class__} | Validation RMSE: {val_rmse:.3f}')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_preds_te = []\nfor model in trained_models:\n        ypreds_test = np.asarray(model.predict(X_test))\n        all_preds_te.append(ypreds_test)\n\nall_preds_test = np.stack(all_preds_te, axis = 0)\n\nypred_test = np.squeeze(np.mean(all_preds_test, axis = 0))\n\nypred_ECB = ypred_test * ystd + ymean\n\n#submission_df(ypred_ECB, 'ECBreg')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Final Models**","metadata":{}},{"cell_type":"markdown","source":"**Random Forest Regressor with Cross Validation**","metadata":{}},{"cell_type":"code","source":"#Random Forest Regressor with CV\n\nst = time.time()\n\nmodel = RandomForestRegressor(n_jobs = 8, n_estimators = 32, max_depth = 64)\n\nmodel_parameters = {\n     'n_estimators': [24, 32, 64, 100], \n     'max_depth': [60, 64, 80]\n     }\n\nsearch = GridSearchCV(model, model_parameters, scoring = 'neg_root_mean_squared_error')\n \nsearch.fit(X, y)\n\nRFregCV = search.best_estimator_","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_RFCV = RFregCV.predict(X_test) * ystd + ymean\n\nsubmission_df(ypred_RFCV, 'RFregCV')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Random Forest Regressor**","metadata":{}},{"cell_type":"code","source":"#Random Forest Regressor\n\nst = time.time()\n\nRFreg = RandomForestRegressor(n_jobs = 8, n_estimators = 32, max_depth = 64)\n\nRFreg.fit(X, y)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_RFAll = RFreg.predict(X_test) * ystd + ymean\n\nsubmission_df(ypred_RFAll, 'RFregAll')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Catboost Regressor with Cross Cross Validation**","metadata":{}},{"cell_type":"code","source":"#Catboost Regressor with CV\n\nst = time.time()\n\nmodel = CatBoostRegressor(loss_function = 'RMSE', iterations = 50000, \n                  learning_rate = 0.01, depth = 10, task_type = 'GPU', random_seed = seed)\n\nmodel_parameters = {\n    'learning_rate': [0.03, 0.02, 0.01],\n    'iterations': [10000, 30000, 50000],\n    'depth': [8, 10, 12]\n    }\n\nsearch = GridSearchCV(model, model_parameters, scoring = 'neg_root_mean_squared_error')\n \nsearch.fit(X, y)\n\nCBregCV = search.best_estimator_","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_CBCV = CBregCV.predict(X_test) * ystd + ymean\n\nsubmission_df(ypred_CBCV, 'CBregCV')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Catboost Regressor**","metadata":{}},{"cell_type":"code","source":"#Catboost Regressor\n\nst = time.time()\n\nCBreg = CatBoostRegressor(loss_function = 'RMSE', iterations = 50000, learning_rate = 0.01,\n                          depth = 12, task_type = 'GPU', random_seed = seed)\n\nCBreg.fit(X, y)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_CB = CBreg.predict(X_test) * ystd + ymean\n\nsubmission_df(ypred_CB, 'CBregAll')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Ensemble Catboost Regressor**","metadata":{}},{"cell_type":"code","source":"#Ensemble Catboost Regressor \n\nst = time.time()\n\nensemble_size = 10\n\ntrained_models = []\nfor sd in range(ensemble_size):    \n    model = CatBoostRegressor(loss_function = 'RMSE', iterations = 10000, learning_rate = 0.01, \n                              depth = 10, task_type = 'GPU', random_seed = sd*7)\n        \n    print(f'\\n Model index: {sd}\\n')\n    \n    model.fit(X, y)\n    \n    trained_models.append(model)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_preds_te = []\nfor model in trained_models:\n        ypreds_test = np.asarray(model.predict(X_test))\n        all_preds_te.append(ypreds_test)\n\nall_preds_test = np.stack(all_preds_te, axis = 0)\n\nypred_test = np.squeeze(np.mean(all_preds_test, axis = 0))\n\nypred_ECBAll = ypred_test * ystd + ymean\n\nsubmission_df(ypred_ECBAll, 'ECBregAll')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Catboost Classifier**","metadata":{}},{"cell_type":"code","source":"y = df.iloc[:, -1].to_numpy().astype(np.int64)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_sorted = sorted(y.tolist())\nmin_temperature = y_sorted[0]\nmax_temperature = y_sorted[-1]\ndown_temperatures = y_sorted[int(round(0.001 * len(y_sorted)))]\nup_temperatures = y_sorted[int(round(0.999 * len(y_sorted)))]\nprint(f'Minimal temperature in dataset set is {min_temperature}.')\nprint(f'Maximal temperature in dataset set is {max_temperature}.')\nprint(f'Approximately 99.8% of temperatures are highrer than {down_temperatures} and lower than {up_temperatures}.')\nrow_indexes = np.where((y > down_temperatures) & (y < up_temperatures))\ny = y[row_indexes]\n#y[np.where(y <= down_temperatures)] = down_temperatures + 1\n#y[np.where(y >= up_temperatures)] = up_temperatures - 1","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Catboost Classifier\n\nst = time.time()\n\nCBclass = CatBoostClassifier(loss_function = 'MultiClass', iterations = 10000, learning_rate = 0.01,\n                          depth = 10, task_type = 'GPU', random_seed = seed)\n\nCBclass.fit(X, y)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_CB = CBclass.predict(X_test)\n\nsubmission_df(ypred_CB, 'CBclassAll')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Artificial Neural Network Classifier**","metadata":{}},{"cell_type":"code","source":"y = df.iloc[:, -1].to_numpy().astype(np.int64)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_sorted = sorted(y.tolist())\nmin_temperature = y_sorted[0]\nmax_temperature = y_sorted[-1]\ndown_temperatures = y_sorted[int(round(0.001 * len(y_sorted)))]\nup_temperatures = y_sorted[int(round(0.999 * len(y_sorted)))]\nprint(f'Minimal temperature in dataset set is {min_temperature}.')\nprint(f'Maximal temperature in dataset set is {max_temperature}.')\nprint(f'Approximately 99.8% of temperatures are highrer than {down_temperatures} and lower than {up_temperatures}.')\nrow_indexes = np.where((y > down_temperatures) & (y < up_temperatures))\ny = y[row_indexes]\n#y[np.where(y <= down_temperatures)] = down_temperatures + 1\n#y[np.where(y >= up_temperatures)] = up_temperatures - 1","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#y[y < 0] += len(np.unique(y))\nabs_min_val = abs(np.min(y))\ny += abs_min_val\ny_cat = to_categorical(y)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_val, y_train, y_val = train_test_split(X, y_cat, random_state = seed, test_size = 0.1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#ANN Classifier\n\nst = time.time()\n\nmodel = Sequential()\nmodel.add(Dense(512, activation = \"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(256, activation = \"relu\"))\nmodel.add(Dropout(0.2))\nmodel.add(Dense(128, activation = \"relu\"))\n#model.add(Dropout(0.2))\nmodel.add(Dense(96, activation = \"relu\"))\n#model.add(Dropout(0.2))\nmodel.add(Dense(64, activation = \"softmax\"))\nmodel.compile(Adam(learning_rate = 0.001), \"categorical_crossentropy\", metrics = [\"accuracy\"])#\"SparseCategoricalCrossentropy\" #\"SparseCategoricalAccuracy\"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.fit(X_train, y_train, epochs = 100, batch_size = 64, validation_data = (X_val, y_val))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ypred_ANN = model.predict(X_test)\n\npredictions = np.argmax(ypred_ANN, axis = -1) \n#predictions[predictions >= up_temperatures] -= len(np.unique(y))\npredictions -= abs_min_val\n\nsubmission_df(predictions, 'ANNclassAll')\n\net = time.time()\n\nprint('Execution time:', et - st, 'seconds')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}