{"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":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport gc\nimport math\nplt.style.use(style='ggplot')\nplt.rcParams['figure.figsize'] = (10, 6)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","id":"0e8qLK4aKix7","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from scipy.stats import uniform\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import train_test_split, GridSearchCV, RandomizedSearchCV\nfrom sklearn.linear_model import SGDRegressor, Ridge, Lasso\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.ensemble import StackingRegressor\nfrom lightgbm import LGBMRegressor\nfrom sklearn.pipeline import Pipeline\nfrom sklearn.metrics import mean_squared_error","metadata":{"id":"ZyAMEF9dh2Cq","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Data from Kaggle","metadata":{"id":"3oKrG1IOLB7C"}},{"cell_type":"markdown","source":"Load data to Colab from Kaggle using Kaggle API without uploading it localy. ","metadata":{"id":"iyZFu5O2ipvk"}},{"cell_type":"code","source":"# ! pip install -q kaggle","metadata":{"id":"hgdNDPq_LPN_","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"From Kaggle -> Account: Download a Kaggle.JSON File from this button: ![image.png](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4MAAACYCAYAAABebjw/AAAgAElEQVR4Ae2dzW8byZ3355g/YY6b4x73mGuOC55yDMCTYCCGAV+sk2JghCDRGpEdWJisBWJGsxtpYq/mCTV+LDn2UrZB2aYVm34ZzmiGgjWULRkaU9E88ligozCR8X3wq+7qruoXvtMixa8Bmc3u6qpffepXL9+uquZ74D8SIAESIAESIAESIAESIAESIIGBI/DewOWYGSYBEiABEiABEiABEiABEiABEgDFIJ2ABEiABEiABEiABEiABEiABAaQAMXgABY6s0wCJEACJEACJEACJEACJEACFIP0ARIgARIgARIgARIgARIgARIYQAIUgwNY6MwyCZAACZAACZAACZAACZAACVAM0gdIgARIgARIgARIgARIgARIYAAJUAwOYKEzyyRAAiRAAiRAAiRAAiRAAiRAMUgfIAESIAESIAESIAESIAESIIEBJEAxOICFziyTAAmQAAmQAAmQAAmQAAmQAMUgfYAESIAESIAESIAESIAESIAEBpAAxeAAFjqzTAIkQAIkQAIkQAIkQAIkQAIUg/QBEiABEiABEiABEiABEiABEhhAAhSDA1jozDIJkAAJkAAJkAAJkAAJkAAJUAzSB0iABEiABEiABEiABEiABEhgAAlQDA5goTPLJEACJEACJEACJEACJEACJNBRMXhQreLgbQTUtweoVqvW30Ew2IFcD50NhuJ3EiABEiABEiABEiABEiABEiCBDhDonBisrCGTSiH9xU7YrO3HSKVS9t/MPJaf7Xlh36xlkFpcwxvvDA9IgARIgARIgARIgARIgARIgAS6RaBjYnBv9Rpm/jeDazOPUQ5aq8Rg4PzeGm7OpFH43glMMRiExu8kQAIkQAIkQAIkQAIkQAIk0D0CHRKDeyj+WYSdfM7gwVZguWeUGASw82QG6S+dmUSKwe4VMmMmARIgARIgARIgARIgARIggSCBzojB7wtI/6kAkXUi6mbub8GSgzXE4MwTisFgofA7CZAACZAACZAACZAACZAACXSbQEfE4M4XaW+GD/vrWErdxUbVMD1KDFa38OBP/iwiZwYNXjwkARIgARIgARIgARIgARIggS4T6IAYLOPxzDyKr7WlVaxnU1h6ZqhBJQYv4vLVecyrv8u4mLqIzFc73gwixaDmx08SIAESIAESIAESIAESIAES6D6BtsXgwdYDzATfFCrfzTeDKjH4ABvmz0tY60id5aXWPd3PO1MgARIgARIgARIgARIgARIggYEl0KYYPMDW/Rlc+3rH+g3B6pt13E1d82cLo5aJBpBzZjAAhF9JgARIgARIgARIgARIgARIoIsE2hOD1Q1b9HmGuiJx1f0dQYpBjwwPSIAESIAESIAESIAESIAESKAXCLQlBqvPluzloEaO1PJR9w2joBg0yPCQBEiABEiABEiABEiABEiABA6fQFti8PDNpwUkQAIkQAIkQAIkQAIkQAIkQAKtEKAYbIUa7yEBEiABEiABEiABEiABEiCBPidAMdjnBUjzSYAESIAESIAESIAESIAESKAVAhSDrVDjPSRAAiRAAiRAAiRAAiRAAiTQ5wQoBvu8AGk+CZAACZAACZAACZAACZAACbRCgGKwFWq8hwRIgARIgARIgARIgARIgAT6nADFYJ8XIM0nARIgARIgARIgARIgARIggVYIUAy2Qo33kAAJkAAJkAAJkAAJkAAJkECfE6AY7PMCpPkkQAIkQAIkQAIkQAIkQAIk0AoBisFWqPEeEiABEiABEiABEiABEiABEuhzAhSDfV6ANJ8ESIAESIAESIAESIAESIAEWiFAMdgKNd5DAiRAAiRAAiRAAiRAAiRAAn1OgGKwzwuQ5pMACZAACZAACZAACZAACZBAKwQoBluhxntIgARIgARIgARIgARIgARIoM8JUAz2eQHSfBIgARIgARIgARIgARIgARJohQDFYCvUeA8JkAAJkAAJkAAJkAAJkAAJ9DkBisE+L0CaTwIkQAIkQAIkQAIkQAIkQAKtEKAYbIUa7yEBEiABEiABEiABEiABEiCBPidAMdjnBUjzSYAESIAESIAESIAESIAESKAVAhSDrVDjPSRAAiRAAiRAAiRAAiRAAiTQ5wTaFoPVSgWVajQFuRZzKXBDBaWHJVQCZzv5VdlyEIyxiorYvx88363vTnqNMQGwH8+2poUHkk7DqdSMqmMXJS8xnJUPSTnovwjTo8uvY9b1UURVbBYKKMew7KOMtGlqIxyarG+mRVKHtksolMqxfmsG79Xj6osCCtsRFcozuPttr5fUuzqo1W6qttFoa3qtnXxXjDqazmH2N23U8YYZtJC/Wj7YcLo9FLAqdaZWO/IObRVbOtz/1W8nG8tf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bw/PeqY80ATE98QHI/81IQbpx5EEB+ZkTT8aGArMKAmQAAmQAAmQwCASaEsMlrf/itd7e4PIjXnuAQLie+KDkf+aEIP040iCA3Oyph8NDAVmlARIgARIgARIYBAJtCUG/16tqpkZGUxxhnAQ3edw8iy+Jj4nM3rig5H/mhCD9ONIgkf+ZEN+dOQpMIMkQAIkQAIkQAKDTKAtMSjgZCAtMysyMJd9N/wjg277gPia+FysEBTHbEIM0o8H02cb8qNB7h2YdxIgARIgARIggSNPoG0xeOQJMYP9SaBJMdifmaTVJEACJEACJEACJEACXL/+jQAAAcxJREFUJNA6AYrB1tnxzl4mQDHYy6VD20iABEiABEiABEiABHqAAMVgDxQCTegCAYrBLkBllCRAAiRAAiRAAiRAAkeJAMXgUSpN5sUnQDHos+ARCZAACZAACZAACZAACUQQoBiMgMJTR4AAxeARKERmgQRIgARIgARIgARIoJsEKAa7SZdxHx4BisHDY8+USYAESIAESIAESIAE+oIAxWBfFBONbJoAxWDTyHgDCZAACZAACZAACZDAYBGgGBys8h6c3FIMDk5ZM6ckQAIkQAIkQAIkQAItEaAYbAkbb+p5AhSDPV9ENJAESIAESIAESIAESOBwCVAMHi5/pt4tAhSD3SLLeEmABEiABEiABEiABI4IAYrBI1KQzEaAAMVgAAi/kgAJkAAJkAAJkAAJkIBNoL4YNAfVPAbIoP8Y2D7PbyRAAiRAAiRAAiRAAiRAAgCixeCPftR/A36KNJZZnA+wqpMACZAACZAACZAACZAACYQIRIvB//gPCos4YcHz/eUbv/hFyOl5ggRIgARIgARIgARIgARIIG5mkGRIgARIgARIgARIgARIgARIgASONIHomcEjnWVmjgRIgARIgARIgARIgARIgARI4P8D9ibCu/kt8fAAAAAASUVORK5CYII=)","metadata":{"id":"ivejMPmHi1YJ"}},{"cell_type":"markdown","source":"and upload the file in the next cell.\nYou must upload the file everytime you reset the session.","metadata":{"id":"7Ow9LBUVjRs1"}},{"cell_type":"code","source":"# from google.colab import files\n# files.upload() #upload kaggle.json","metadata":{"id":"u2c7Q51WXxIW","outputId":"5eb3b086-dde2-4ea8-c044-2cfa6bf32a08","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !mkdir -p ~/.kaggle","metadata":{"id":"poerO8qrX8Sv","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !cp kaggle.json ~/.kaggle/","metadata":{"id":"Sw0jI-tJT4w6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # change the file permissions\n# ! chmod 600 ~/.kaggle/kaggle.json","metadata":{"id":"RnYpMPOTSykv","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # updating kaggle api\n# !pip install --upgrade --force-reinstall --no-deps kaggle","metadata":{"id":"ANvEYfc8fhhn","outputId":"80e305df-6cb3-4015-d37c-105168c7c8b1","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ! kaggle competitions download -c ashrae-energy-prediction","metadata":{"id":"Z5lD8B7KLE7S","outputId":"ae550c59-23bb-425a-9be1-7103fe67569a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# #unzipping the zip files and deleting the zip files\n# !unzip \\*.zip  && rm *.zip","metadata":{"id":"p2Cfr7OdZup8","outputId":"e1a30a82-9250-4620-8f0c-d569a434d6b6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Loading Data","metadata":{"id":"lnEx9JUEKiyJ"}},{"cell_type":"code","source":"# load train and test data\n\n# Kaggle\ntrain = pd.read_csv('../input/ashrae-energy-prediction/train.csv', parse_dates=['timestamp'], infer_datetime_format=True)\ntest = pd.read_csv('../input/ashrae-energy-prediction/test.csv', parse_dates=['timestamp'], infer_datetime_format=True)\n\n# Colab\n# train = pd.read_csv('/content/train.csv', parse_dates=['timestamp'], infer_datetime_format=True)\n# test = pd.read_csv('/content/test.csv', parse_dates=['timestamp'], infer_datetime_format=True)","metadata":{"id":"4s_Mgow-KiyJ","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"id":"Yln6ak9toM6I","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load weather data\n# Kaggle\nweather_train = pd.read_csv('../input/ashrae-energy-prediction/weather_train.csv', parse_dates=['timestamp'], infer_datetime_format=True)\nweather_test = pd.read_csv('../input/ashrae-energy-prediction/weather_test.csv', parse_dates=['timestamp'], infer_datetime_format=True)\n\n# Colab\n# weather_train = pd.read_csv('/content/weather_train.csv', parse_dates=['timestamp'], infer_datetime_format=True)\n# weather_test = pd.read_csv('/content/weather_test.csv', parse_dates=['timestamp'], infer_datetime_format=True)","metadata":{"id":"fNozg2RkKiyK","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"weather_train.info()","metadata":{"id":"4D73UFVGKiyK","outputId":"cc676975-de14-467b-a7e5-cfcb5880426a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#load Buildings data\n# Kaggle\nbuilding = pd.read_csv('../input/ashrae-energy-prediction/building_metadata.csv')\n\n# Colab\n# building = pd.read_csv('/content/building_metadata.csv')","metadata":{"id":"OCrsS64iKiyL","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"building.info()","metadata":{"id":"mNeSq1MzoSAj","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Reducing Memory Usage","metadata":{"id":"XmGRQc0g6lHU"}},{"cell_type":"code","source":"## Function to reduce the DF size\ndef reduce_mem_usage(df, verbose=True):\n    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n    start_mem = df.memory_usage().sum() / 1024**2    \n    for col in df.columns:\n        col_type = df[col].dtypes\n        if col_type in numerics:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)    \n    end_mem = df.memory_usage().sum() / 1024**2\n    if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))\n    return df","metadata":{"id":"tWfHVcFg6dBc","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = reduce_mem_usage(train)\ntest = reduce_mem_usage(test)\n\nweather_train = reduce_mem_usage(weather_train)\nweather_test = reduce_mem_usage(weather_test)\nbuilding = reduce_mem_usage(building)","metadata":{"id":"bJq5eHLJ6sZL","outputId":"85c3b8c2-cbed-408f-f9ea-5426b4ff9b75","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Weather Data Imputation","metadata":{"id":"GScKAngSrCrh"}},{"cell_type":"code","source":"# get cloumns that have null in train data\nmissing_cols = [col for col in weather_train.columns if weather_train[col].isna().any()] \n\n# stores the mean of each feature for each site id\nfill_lib = weather_train.groupby('site_id')[missing_cols].transform('mean') \n\n# for each feature with missing values, fill the missing entry with the mean for that site\nweather_train.fillna(fill_lib, inplace=True)","metadata":{"id":"wmmGdeUcLd4G","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# get cloumns that have null in test data\nmissing_cols = [col for col in weather_test.columns if weather_test[col].isna().any()]\n\n# stores the mean of each feature for each site id\nfill_lib = weather_test.groupby('site_id')[missing_cols].transform('mean')\n\n# for each feature with missing values, fill the missing entry with the mean for that site\nweather_test.fillna(fill_lib, inplace=True)","metadata":{"id":"D4s66S2Wq9S7","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Merge datasets with train and test","metadata":{"id":"yK--g_fkKiyL"}},{"cell_type":"markdown","source":"Merge the three datasets in one Dataframe","metadata":{}},{"cell_type":"code","source":"train = train.merge(building, on = 'building_id', how = 'left')\ntest = test.merge(building, on = 'building_id', how = 'left')","metadata":{"id":"_OfDLmR2KiyM","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train.merge(weather_train, on = ['site_id', 'timestamp'], how = 'left')\ntest = test.merge(weather_test, on = ['site_id', 'timestamp'], how = 'left')","metadata":{"id":"YzRLVZavKiyM","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# delete non-used variables to free some memory \ndel weather_train, weather_test, building\ngc.collect()","metadata":{"id":"CRyKLXDmjfbl","outputId":"dad19cb0-f873-42ed-e4be-9348e2c9f3b9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('train shape: ', train.shape)\nprint('test shape:  ', test.shape)","metadata":{"id":"2Hg62lCIKiyM","outputId":"f82c617c-b8c3-4bcb-bac0-076a9c54fc92","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"id":"r7e3DhWN8yTz","outputId":"0e152dd5-1995-4eed-d3d4-89a9b3113fbd","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Imputation","metadata":{"id":"wz6vQzKTS_Rb"}},{"cell_type":"code","source":"train.isna().sum() / len(train)","metadata":{"id":"ek63hPe48007","outputId":"90bc9d8c-d121-4859-93ab-146ad484b0c9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**drop columns that have lots of nulls**","metadata":{"id":"D7Oo4Mu2r0AN"}},{"cell_type":"code","source":"train.drop(['year_built', 'floor_count', 'cloud_coverage'], axis='columns', inplace=True)\ntest.drop(['year_built', 'floor_count', 'cloud_coverage'], axis='columns', inplace=True)\n\ntrain.columns","metadata":{"id":"A6acG42QBA2a","outputId":"00b08661-bdcb-4297-d344-c3a4b4841bcb","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check columns that have nulls\ntrain.isna().sum() / len(train)","metadata":{"id":"IEwNgNHAFckX","outputId":"dff27880-b8b7-44a6-f796-e59cfabb275b","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.isna().sum() / len(test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_viz = train.sample(10000)","metadata":{"id":"JyhKRIJ4E6zh","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Exploratory Data Analysis","metadata":{"id":"JyT1hBiEsUsb"}},{"cell_type":"code","source":"sns.displot(train_viz['air_temperature'], kde=True)","metadata":{"id":"DXVLihJiFUlI","outputId":"8928326e-14d6-4488-cf81-b7db2c55cd42","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['air_temperature'].fillna(value=train['air_temperature'].median(), inplace=True)\ntest['air_temperature'].fillna(value=train['air_temperature'].median(), inplace=True)","metadata":{"id":"PnazjRdfPsKp","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train_viz['dew_temperature'], kde=True)","metadata":{"id":"ctZSkeiHFluS","outputId":"916d935b-065f-48cd-8e48-99f6e0007ec9","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['dew_temperature'].fillna(value=train['dew_temperature'].median(), inplace=True)\ntest['dew_temperature'].fillna(value=train['dew_temperature'].median(), inplace=True)","metadata":{"id":"CCnyfIbTQeiC","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train_viz['precip_depth_1_hr'], kde=True)","metadata":{"id":"S9vnimoqFy63","outputId":"33b3ace7-9b93-4be6-e628-21d86b25aad7","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['precip_depth_1_hr'].fillna(value=train['precip_depth_1_hr'].median(), inplace=True)\ntest['precip_depth_1_hr'].fillna(value=train['precip_depth_1_hr'].median(), inplace=True)","metadata":{"id":"F_m1PRHdQ2Ww","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train_viz['sea_level_pressure'], kde=True) ","metadata":{"id":"xvWkt-F5Gl7M","outputId":"45c63fa8-6b50-4ac7-c71e-ab795f238038","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['sea_level_pressure'].fillna(value=train['sea_level_pressure'].median(), inplace=True)\ntest['sea_level_pressure'].fillna(value=train['sea_level_pressure'].median(), inplace=True)","metadata":{"id":"uKOU690-RQvI","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train_viz['wind_direction'], kde=True)","metadata":{"id":"wlv5JbqJGyxq","outputId":"db342089-3392-48be-87b5-9f2a193832e0","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['wind_direction'].fillna(value=train['wind_direction'].median(), inplace=True)\ntest['wind_direction'].fillna(value=train['wind_direction'].median(), inplace=True)","metadata":{"id":"CwsMoYgQPTGD","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.displot(train_viz['wind_speed'], kde=True)","metadata":{"id":"pLYyJib9RnQI","outputId":"8f7e5ee2-2674-4ac2-ac71-cbdfeb026097","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['wind_speed'].fillna(value=train['wind_speed'].median(), inplace=True)\ntest['wind_speed'].fillna(value=train['wind_speed'].median(), inplace=True)","metadata":{"id":"y9dWXs2rRsyz","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check if there are any variables that still have nulls\ntrain.isna().sum() / len(train)","metadata":{"id":"6ltPVTYJRhht","outputId":"a9ffebd1-52a8-4248-d4fe-4fbca7428fe8","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.isna().sum() / len(test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['site_id'] = train['site_id'].astype(object)","metadata":{"id":"CcpsEieogX4p","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['site_id'].value_counts(normalize=True).plot(kind='bar')","metadata":{"id":"GHdk-rkYgPRI","outputId":"a7321c9b-0853-4a27-c52c-98befbbdcc81","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Correlation Analysis","metadata":{"id":"94eaZWMZTIIs"}},{"cell_type":"markdown","source":"Check the correlation between numerical variables","metadata":{"id":"CIxfs4g9spMZ"}},{"cell_type":"code","source":"corr = train_viz.corr()\nmask = np.triu(np.ones_like(corr, dtype=bool))\nsns.heatmap(corr, cmap='YlGnBu', annot=True)","metadata":{"id":"IjhpfepNR3AQ","outputId":"16b066ba-a6e2-4a7c-c93d-5f619c3f0185","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"From the heatmap we can see that dew_temperature and air_temperature have strong correlation, so we will drop dew_temperature from the data.","metadata":{"id":"rT9Z01yisxLq"}},{"cell_type":"code","source":"train.drop(['dew_temperature'], axis='columns', inplace=True)\ntest.drop(['dew_temperature'], axis='columns', inplace=True)","metadata":{"id":"pFl4VpGfWVPH","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# drop building_id from dataset\ntest_ids = test['building_id']\ntrain.drop(['building_id'], axis='columns', inplace=True)\ntest.drop(['building_id'], axis='columns', inplace=True)","metadata":{"id":"ngbrnkqHXT1h","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Target Variable Analysis","metadata":{"id":"xLbWePttKiyN"}},{"cell_type":"code","source":"print (\"Skew is:\", train.meter_reading.skew())\nsns.displot(train.meter_reading.sample(1000), kde=True )\nplt.show()","metadata":{"id":"l4x_SVqCKiyN","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train['meter_reading'] = np.log(train['meter_reading']+1)\n# train['meter_reading'] = np.expm1(train['meter_reading'])","metadata":{"id":"EVIFTqW7KiyO","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print (\"Skew is:\", train.meter_reading.skew())\nsns.displot(train.meter_reading.sample(1000), kde=True)\nplt.show()","metadata":{"id":"oRZncf5tKiyO","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Now lets explore outliers in the Target Variable","metadata":{}},{"cell_type":"code","source":"sns.boxplot(x = train['meter_reading'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = train[train['meter_reading'] <= 10]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.boxplot(x = train['meter_reading'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"id":"nfuvJFzPgI0n","outputId":"2c7b3a51-0297-480e-c182-d8da43b6001e","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Feature Engineering","metadata":{"id":"VjoAoqPDqtSz"}},{"cell_type":"code","source":"train['timestamp']","metadata":{"id":"OB2PaGhYlAlR","outputId":"10b18a36-dbfe-4799-8009-5d743a594ff6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# extract more data from timestamp\ntrain['year'] = train['timestamp'].dt.year\ntrain['month'] = train['timestamp'].dt.month\ntrain['day'] = train['timestamp'].dt.day\ntrain['hour'] = train['timestamp'].dt.hour","metadata":{"id":"mDjTgoxAleVg","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# extract more data from timestamp\ntest['year'] = test['timestamp'].dt.year\ntest['month'] = test['timestamp'].dt.month\ntest['day'] = test['timestamp'].dt.day\ntest['hour'] = test['timestamp'].dt.hour","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# drop timestamp column\ntrain.drop(['timestamp'], axis='columns', inplace=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.drop(['timestamp'], axis='columns', inplace=True)","metadata":{"id":"A5c9RGR7q2EW","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preprocessing","metadata":{"id":"dZNUl1jTepZE"}},{"cell_type":"markdown","source":"## Label Encoding","metadata":{"id":"iQTccHWme1WV"}},{"cell_type":"markdown","source":"Apply label encoding on categorical variables.","metadata":{"id":"wvfl51J7yqA9"}},{"cell_type":"code","source":"le = LabelEncoder()\ncategorical_cols = list(train.select_dtypes(include=object))\ntrain[categorical_cols] = train[categorical_cols].apply(le.fit_transform)\ntrain[categorical_cols]","metadata":{"id":"nToedBgeT4xk","outputId":"d17df52e-4184-4c63-a62e-befd6a9692d6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categorical_cols = list(test.select_dtypes(include=object))\ntest[categorical_cols] = test[categorical_cols].apply(le.fit_transform)\ntest[categorical_cols]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train Test Split","metadata":{"id":"Yrr2PJuRe_bn"}},{"cell_type":"markdown","source":"Split the train data to train and test data, 75% Train and 25% Test.","metadata":{"id":"S9MVIDAlz4zG"}},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(train.drop(['meter_reading'],\n                                  axis='columns'), train['meter_reading'],\n                                  test_size=0.25, random_state=0)","metadata":{"id":"QhRbXFMvfCB3","outputId":"e98b5549-d239-4030-f4b6-dc0a682c4f50","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train.shape)\nprint(X_test.shape)\nprint(y_train.shape)\nprint(y_test.shape)","metadata":{"id":"UR-4vGDX0LHu","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = reduce_mem_usage(X_train)\nX_test = reduce_mem_usage(X_test)","metadata":{"id":"WjB9Sc5X9w9n","outputId":"5402e37a-9f9d-41a7-958e-30c59ecde9b6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Feature Scaling","metadata":{"id":"gejK2JH2aqrs"}},{"cell_type":"markdown","source":"Scale the numerical variables for better results on regression models.","metadata":{"id":"c_Ek-Fx10M33"}},{"cell_type":"code","source":"ssc = StandardScaler()\nssc.fit(X_train)\nX_train = ssc.transform(X_train)\nX_test = ssc.transform(X_test)","metadata":{"id":"eBQu5E45apN2","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# delete non-used variables to free some memory \n# del ssc\ngc.collect()","metadata":{"id":"2IM3vcsLTER_","outputId":"c67e950c-d28d-4419-840b-5391deeaf307","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modeling","metadata":{"id":"cFIMlN2exwPV"}},{"cell_type":"markdown","source":"## Comparing Models","metadata":{"id":"dqQoG0abqCr0"}},{"cell_type":"code","source":"sgdreg = SGDRegressor()\nsgdreg.fit(X_train, y_train)\ny_pred = sgdreg.predict(X_test)\nprint(\"RMSLE for Stochastic Gradient Descent: \", math.sqrt(mean_squared_error(y_test, y_pred)))","metadata":{"id":"Wr4XbsSEqFCv","outputId":"112ba8aa-6615-486a-c214-ffa8a7fca9ee","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del sgdreg, y_pred\n# gc.collect()","metadata":{"id":"N3_bo7Iy_9Da","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ridgereg = Ridge()\nridgereg.fit(X_train, y_train)\ny_pred = ridgereg.predict(X_test)\nprint(\"RMSLE for Ridge: \", math.sqrt(mean_squared_error(y_test, y_pred)))","metadata":{"id":"Sz4oledAqwu-","outputId":"c58d350d-9f83-44bd-bdeb-a8a7e4bb1d0a","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del ridgereg, y_pred\n# gc.collect()","metadata":{"id":"2ts3kuCAAf0i","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lassoreg = Lasso()\nlassoreg.fit(X_train, y_train)\ny_pred = lassoreg.predict(X_test)\nprint(\"RMSLE for Lasso: \", math.sqrt(mean_squared_error(y_test, y_pred)))","metadata":{"id":"Rhg2RWWaq5dt","outputId":"5ddb7b5b-61f2-4817-ac3c-f0171f7295d5","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del lassoreg, y_pred\n# gc.collect()","metadata":{"id":"05dY-b40A8hA","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## GridSearchCV","metadata":{"id":"BoPyaP1NJy1c"}},{"cell_type":"markdown","source":"Use GridSearch to get the best hyperparameters for the models.","metadata":{"id":"DDdSMyEZ07L-"}},{"cell_type":"code","source":"# parameters = dict(alpha=[0.001, 0.003, 0.1, 0.3, 1, 3])\n# clf = GridSearchCV(Ridge(), parameters)\n# search = clf.fit(X_train, y_train)\n# search.best_params_","metadata":{"id":"ZoI9XCeXJxuk","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# y_pred = clf.predict(X_test)\n# print(\"RMSLE for GridSearch Ridge: \", math.sqrt(mean_squared_error(y_test, y_pred)))","metadata":{"id":"ViW1VuDAKh5Z","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del y_pred\n# gc.collect()","metadata":{"id":"Asu5jCDrKocE","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We couldn't get any result from GridSearch as it crashes the memory.","metadata":{"id":"4XYGqYGm1C5f"}},{"cell_type":"markdown","source":"## Using RandomizedSearchCV","metadata":{"id":"wHw-5B3DBJMC"}},{"cell_type":"markdown","source":"Use Randomized Search to get the best hyperparameters for the best model.","metadata":{"id":"mtn6jBWn1s-r"}},{"cell_type":"code","source":"distributions = dict(alpha=uniform(loc=1, scale=3))\nclf = RandomizedSearchCV(Ridge(), distributions, random_state=42, n_iter=4)\nsearch = clf.fit(X_train, y_train)\nsearch.best_params_","metadata":{"id":"cOVGeaoxBLh5","outputId":"a78175ee-1bff-454a-9ca7-42ca86d2b1ec","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = clf.predict(X_test)\nprint(\"RMSLE for RandomizedSearch Ridge: \", math.sqrt(mean_squared_error(y_test, y_pred)))","metadata":{"id":"wFPsAcoPH9IP","outputId":"92f658db-3a9f-4ad1-cc3e-73194ee5691f","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# delete non-used variables to free some memory \ndel clf, y_pred\ngc.collect()","metadata":{"id":"51xRiz0SKTM8","outputId":"4cf720fc-765b-40c5-b8ae-5e88f5c44b39","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Light GBM","metadata":{"id":"S_aIymB2pDFZ"}},{"cell_type":"code","source":"lgb = LGBMRegressor(boosting_type='gbdt',\n                    objective='regression',\n                    metric='rmse',\n                    learning_rate=0.03,\n                    num_leaves=40,\n                    n_estimators=1000,\n                    subsample=0.8)\nlgb.fit(X_train, y_train)","metadata":{"id":"aIXyUpXg0t0k","outputId":"97ee189a-8125-4ee8-c5f2-854a34e47f93","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = lgb.predict(X_test)","metadata":{"id":"fk_0ehK01aEo","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"error = math.sqrt(mean_squared_error(y_test, y_pred))\nprint(error)","metadata":{"id":"WSdZMI03yrZk","outputId":"01e5b9f6-3a6b-469a-c89f-61c88e144454","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del lgb, y_pred\n# gc.collect()","metadata":{"id":"QMoaBq6vPh26","outputId":"94ef56ba-2190-4bea-a1ac-92f7e22d8e6d","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# del X_train, y_train, X_test, y_test\n# gc.collect()","metadata":{"id":"V61QdI4WogxG","outputId":"c60b82ab-3b59-43a2-df7e-5df711e4564b","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"As we can see, LightGBM is the best model in the 4 models we tried.","metadata":{}},{"cell_type":"markdown","source":"## Trying KFold CV","metadata":{"id":"Cu1BN9kkodp6"}},{"cell_type":"code","source":"# take a sample from the data to apply K-Fold on it\ntrain_sample = train.sample(100000)\ngc.collect()","metadata":{"id":"9hG40D0MzpAN","outputId":"5f9797d3-ec37-4fd9-808b-eaeccaa1ec73","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import make_scorer\nfrom sklearn.metrics import mean_squared_log_error\n\ndef rmsle(y, y_pred, **kwargs):\n    out = np.sqrt(mean_squared_log_error(np.exp(y), np.exp(y_pred)))\n    return out\n\nrmsle_scorer = make_scorer(rmsle, greater_is_better=False)","metadata":{"id":"Cpz6KBXO2KFz","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import RidgeCV\nfrom sklearn.model_selection import RepeatedKFold\n\ncv = RepeatedKFold(n_splits=3, n_repeats=3, random_state=42)\nmodel = RidgeCV(cv=cv, scoring=rmsle_scorer, normalize=True)\nmodel.fit(train_sample.drop(['meter_reading'], axis='columns'), train_sample['meter_reading'])","metadata":{"id":"tce884EVmv-N","outputId":"25ded8cd-bd78-4088-c50a-9381f70d59bb","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.score(train_sample.drop(['meter_reading'], axis='columns'), train_sample['meter_reading'])","metadata":{"id":"tRcaUmJQt-Kl","outputId":"00375ef4-c8bb-47ba-b383-f2fd88a0672d","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Ensemble Model","metadata":{"id":"R_EnUa-XDxKG"}},{"cell_type":"markdown","source":"After Trying 4 models, we will the the best 3 (SGD, Ridge and LGBM) and make an ensemble model, this may improve our model performance.","metadata":{}},{"cell_type":"code","source":"#create a dictionary of our models\nestimators=[('SGD', sgdreg), ('Ridge', ridgereg), ('LGBM', lgb)]\n\n#create our voting classifier, inputting our models\nensemble = StackingRegressor(estimators=estimators, \n                             final_estimator=LGBMRegressor(objective='regression'))\n\n#fit model to training data\nensemble.fit(X_train, y_train)\n\n#test our model on the test data\nensemble.score(X_test, y_test)","metadata":{"id":"WTLzLwmtDxnn","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = ensemble.predict(X_test)\nerror = math.sqrt(mean_squared_error(y_test, y_pred))\nprint(error)","metadata":{"id":"t-qlCQe1HX3E","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# free memory from some variables\ndel X_train, y_train, X_test, y_test\ndel lassoreg, ridgereg, lgb, sgdreg","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Our ensemble model performes slightly better than the LBGM Model, so we will submit its predictions to the comptetion. ","metadata":{}},{"cell_type":"markdown","source":"# Submission","metadata":{"id":"lt_O4pIhRFRL"}},{"cell_type":"code","source":"submission = pd.DataFrame()\nsubmission['row_id'] = test['row_id']\n\ntest.drop('row_id', axis = 1, inplace = True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = ssc.transform(test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del train\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"prediction = ensemble.predict(test)\nfinal_predictions = np.expm1(prediction)\n\nsubmission['meter_reading'] = final_predictions\nsubmission.to_csv('submission.csv', index=False)","metadata":{"id":"TjZMhXCgcKOO","trusted":true},"execution_count":null,"outputs":[]}]}