{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Importation Library"},{"metadata":{"scrolled":true,"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"###### Library de base\nimport pandas as pd\nfrom datetime import datetime\nimport numpy as np\nimport random\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport gc\n\n###### Librabary Sklearn\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_squared_log_error\nfrom sklearn.ensemble import GradientBoostingRegressor\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.ensemble import RandomForestRegressor\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import RandomizedSearchCV\n\n\n###### Library LightGBM\n\nimport lightgbm as lgb\n\n###### Kaggle Specifique\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Importation de la base"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Importation de toute la base\n##############\n\n\n#train=pd.read_csv(\"/kaggle/input/ashrae-energy-prediction/train.csv\",sep=\",\")\nweather_train=pd.read_csv(\"/kaggle/input/ashrae-energy-prediction/weather_train.csv\",sep=\",\")\nbuilding_meta=pd.read_csv(\"/kaggle/input/ashrae-energy-prediction/building_metadata.csv\",sep=',')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"##############\n####  Importation d'un Pourcentage de la base\n##############\n\nrandom.seed(30)\n# On selectionne 20% des lignes de la bases pour tester les modèles\np = 0.1  # 20% of the lines\n# keep the header, then take only 1% of lines\n# if random from [0,1] interval is greater than 0.01 the row will be skipped\ntrain = pd.read_csv(\n         \"/kaggle/input/ashrae-energy-prediction/train.csv\",sep=\",\",\n         header=0, \n         skiprows=lambda i: i>0 and random.random() > p\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Definition de fonction"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Fonction pour réduire la taille de la base\n##############\n\n\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\n\n# Source : https://www.kaggle.com/caesarlupum/ashrae-start-here-a-gentle-introduction","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Fonction pour calculer les données manquantes\n##############\n\n\n\ndef missing_statistics(df):    \n    statitics = pd.DataFrame(df.isnull().sum()).reset_index()\n    statitics.columns=['COLUMN NAME',\"MISSING VALUES\"]\n    statitics['TOTAL ROWS'] = df.shape[0]\n    statitics['% MISSING'] = round((statitics['MISSING VALUES']/statitics['TOTAL ROWS'])*100,2)\n    return statitics\n\n# Source : https://www.kaggle.com/aitude/ashrae-missing-weather-data-handling","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Visualisation des valeurs manquantes\n##############\n\ndef val_manq(df):\n    percent = (df.isnull().sum()).sort_values(ascending=False)\n    percent.plot(kind='bar', figsize = (20,10), fontsize=20)\n    plt.xlabel('Columns')\n    plt.ylabel('Number of rows')\n    plt.title('Tot missing values')\nval_manq(train)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Remplissage des données manquantes"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Pourcentage de données manquantes\n##############\n\n\nprint(missing_statistics(train))\nprint(missing_statistics(weather_train))\nprint(missing_statistics(building_meta))","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Création de nouvelles colonnes\n##############\n\nweather_train[\"datetime\"] = pd.to_datetime(weather_train[\"timestamp\"])\nweather_train[\"annee\"] = weather_train[\"datetime\"].dt.year\nweather_train[\"mois\"] = weather_train[\"datetime\"].dt.month\nweather_train[\"semaine\"] = weather_train[\"datetime\"].dt.week\nweather_train[\"jour\"] = weather_train[\"datetime\"].dt.day\nweather_train[\"heure\"] = weather_train[\"datetime\"].dt.hour\nweather_train.drop(columns=[\"datetime\"],inplace=True)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Remplisssage des données manquantes de la base weather par des moyennes\n##############\n\n\ncol_weather=[\"air_temperature\",\"cloud_coverage\",\"dew_temperature\",\"precip_depth_1_hr\",\"sea_level_pressure\",\"wind_direction\",\"wind_speed\"]\nmean_weather=weather_train.groupby([\"site_id\",\"mois\"]).transform(lambda x: x.fillna(x.mean()))\nfor col in col_weather:\n    weather_train[col] = mean_weather[col]\nweather_train=weather_train.fillna(method='ffill')\nbuilding_meta.drop(columns=[\"year_built\",\"floor_count\"],inplace=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Manipulation de la base"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Encoding d'une variables qualitative\n##############\n#A faire après les graphiques\n\nlabelencoder=LabelEncoder()\nbuilding_meta[\"primary_use\"] = labelencoder.fit_transform(building_meta[\"primary_use\"])","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Merge des 3 bases\n##############\n\n\n\ndf=pd.merge(train,building_meta, left_on='building_id', right_on='building_id')\ndf=pd.merge(df,weather_train, on=['timestamp','site_id'])\ndf = reduce_mem_usage(df)\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Conversion d'unité d'un certain type de meter à un certain endroit\n##############\n\ndf.loc[(df[\"site_id\"] == 0) & (df[\"meter\"] == 0), \"meter_reading\"]=df.loc[(df[\"site_id\"] == 0) & (df[\"meter\"] == 0), \"meter_reading\"]*0.2931","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Vizualisation"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"print(min(df[\"timestamp\"]))\nprint(max(df[\"timestamp\"]))","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Description de la base\n##############\n\n\ndf.describe()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":false,"trusted":true},"cell_type":"code","source":"corr= df.corr()\nmask = np.zeros_like(corr)\nmask[np.triu_indices_from(mask)] = True\nplt.figure(figsize = (10,10))\nax = sns.heatmap(corr.round(2), mask=mask,\n            vmin=-1,     \n            cmap='coolwarm',\n            annot=True)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Calcul des consommations moyennes de chaques meter type par semaine\n##############\n\nmoyenne_conso_semaine = df.groupby(['semaine']).mean()\nmoyenne_conso_semaine_0 = df[df[\"meter\"]==0].groupby(['semaine']).mean()\nmoyenne_conso_semaine_1 = df[df[\"meter\"]==1].groupby(['semaine']).mean()\nmoyenne_conso_semaine_2 = df[df[\"meter\"]==2].groupby(['semaine']).mean()\nmoyenne_conso_semaine_3 = df[df[\"meter\"]==3].groupby(['semaine']).mean()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Plot Standard\n##############\n\n\nplt.figure(figsize=(10,10))\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine[\"meter_reading\"],label='moyenne')\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine_0[\"meter_reading\"],label='electricity')\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine_1[\"meter_reading\"],label='chilledwater')\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine_2[\"meter_reading\"],label='steam')\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine_3[\"meter_reading\"],label='hotwater')\nplt.ylabel('Consomation en Kwh')\nplt.xlabel('Semaine')\nplt.legend()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Plot Log de la valeur\n##############\n\n\n\nplt.figure(figsize=(10,10))\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log1p(moyenne_conso_semaine[\"meter_reading\"]),label='moyenne')\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log1p(moyenne_conso_semaine_0[\"meter_reading\"]),label='electricity')\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log1p(moyenne_conso_semaine_1[\"meter_reading\"]),label='chilledwater')\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log1p(moyenne_conso_semaine_2[\"meter_reading\"]),label='steam')\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log1p(moyenne_conso_semaine_3[\"meter_reading\"]),label='hotwater')\nplt.ylabel('log1p de la Consomation en Kwh')\nplt.xlabel('Semaine')\nplt.legend()\n\n\ndel moyenne_conso_semaine\ndel moyenne_conso_semaine_0\ndel moyenne_conso_semaine_1\ndel moyenne_conso_semaine_2\ndel moyenne_conso_semaine_3","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Calcul des consommations moyennes chaque site par semaine\n##############\n\nmoyenne_conso_semaine = df.groupby(['semaine']).mean()\n\nplt.figure(figsize=(10,10))\nplt.plot(range(0,len(moyenne_conso_semaine)),moyenne_conso_semaine[\"meter_reading\"],label='moyenne')\n\nfor i,k in enumerate (df[\"site_id\"].unique()):\n    moyenne_conso_site= df[df[\"site_id\"]==i].groupby(['semaine']).mean()\n    plt.plot(range(0,len(moyenne_conso_site)),moyenne_conso_site[\"meter_reading\"],label=i)\n    \nplt.legend()\n\n\n###### Un site semble se détaché sur reste, nous passons à plot des valeurs en log pour voir plus en détails\n\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Calcul des consommations moyennes de chaques site par semaine version log\n##############\n\nmoyenne_conso_semaine = df.groupby(['semaine']).mean()\n\nplt.figure(figsize=(10,10))\nplt.plot(range(0,len(moyenne_conso_semaine)),np.log(moyenne_conso_semaine[\"meter_reading\"]),label='moyenne')\n\nfor i,k in enumerate (df[\"site_id\"].unique()):\n    moyenne_conso_site= df[df[\"site_id\"]==i].groupby(['semaine']).mean()\n    plt.plot(range(0,len(moyenne_conso_site)),np.log1p(moyenne_conso_site[\"meter_reading\"]),label=i)\n\n    \nplt.ylabel('log1p de la Consomation en Kwh')\nplt.xlabel('Semaine')\nplt.legend()\n\n\n###### Le plot n'est pas beaucoup plus clair\n\n\ndel moyenne_conso_semaine\ndel moyenne_conso_site","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Calcul des consommations moyennes de chaques site par semaine version log\n##############\n\n\nplt.figure(figsize=(10,10))\nplt.hist(building_meta[\"square_feet\"],bins=30,color='coral')\nplt.ylabel('Nombre de batiment')\nplt.xlabel('Taille des batiments en pied carré')","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Pourcentage de chaque type de consomation\n##############\n\n\nmeter_type=train[\"meter\"].value_counts()\nmeter_type_perc=meter_type*100/sum(meter_type)\nnom=['electricity','chilledwater','steam', 'hotwater']\ny_position=[0,1,2,3]\nplt.figure(figsize=(10,10))\nA=plt.barh(y_position,meter_type_perc,\n       color='#66b3ff', align=\"center\")\nplt.yticks(y_position,nom)\n\nfor k in range(len(meter_type)):\n    plt.text(meter_type_perc[k]+0.5,\n             y_position[k]-0.05, \n             str(round(meter_type_perc[k],2))+'%', \n             fontsize=15,\n             color='dimgrey')\n    \nplt.xlim([0, max(meter_type_perc)+10])\n# Enléve l'échelle de l'axe x\nplt.tick_params(\n    axis='x',          # changes apply to the x-axis\n    which='both',      # both major and minor ticks are affected\n    bottom=False,      # ticks along the bottom edge are off\n    top=False,         # ticks along the top edge are off\n    labelbottom=False) # labels along the bottom edge are off\nplt.xlabel(\"Pourcentage des batiments\")\nplt.ylabel('Type de chauffage')\nplt.show()\n\n\ndel meter_type\ndel meter_type_perc","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Pourcentage d'est utilisation des batiments\n##############\n\n\nprimary_use=building_meta[\"primary_use\"].value_counts().reset_index()\nprimary_use_perc=primary_use[\"primary_use\"]*100/sum(primary_use[\"primary_use\"])\nnom=['Education','Office','Entertainment/public assembly' ,'Public services','Lodging/residential' ,'Other' ,'Healthcare','Parking','Warehouse/storage','Manufacturing/industrial','Retail','Services','Technology/science','Food sales and service','Utility','Religious worship']\ny_position=range(0,len(primary_use))\n\n\nplt.figure(figsize=(10,10))\nA=plt.barh(y_position,primary_use_perc,\n       color='#66b3ff', align=\"center\")\nplt.yticks(y_position,nom)\n\nfor k in range(len(primary_use_perc)):\n    plt.text(primary_use_perc[k]+0.5,\n             y_position[k]-0.15, \n             str(round(primary_use_perc[k],2))+'%', \n             fontsize=15,\n             color='dimgrey')\n    \n\nplt.xlim([0, max(primary_use_perc)+10])\n# Enléve l'échelle de l'axe x\nplt.tick_params(\n    axis='x',          # changes apply to the x-axis\n    which='both',      # both major and minor ticks are affected\n    bottom=False,      # ticks along the bottom edge are off\n    top=False,         # ticks along the top edge are off\n    labelbottom=False) # labels along the bottom edge are off\nplt.xlabel(\"Pourcentage des batiments\")\nplt.ylabel('Type de chauffage')\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Représentation de \"indicator of the primary category of activities of the \n#### building\"\n##############\n\nfig, ax = plt.subplots(figsize=(10,8))\nsns.countplot(y='primary_use', data=df)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Représentation de \"indicator of the primary category of activities of the \n#### building\" par mois\n##############\n\nfig, ax = plt.subplots(figsize=(10,8))\nsns.countplot(y='primary_use', data=df, hue='mois')","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Graphiques qui ne fonctionnent pas\n##############\n\n'''for bldg_id in [df['building_id']]:\n    plt.figure(figsize=(16,5))\n    tmp_df = df[df['building_id'] == bldg_id].copy()\n    tmp_df.set_index(tmp_df[\"timestamp\"], inplace=True)\n    tmp_df.resample(\"D\").meter_reading.sum().plot()\n    plt.title(f\"Meter readings for building #{bldg_id} \")\n    plt.xlabel(\"Sum of readings\")\n    plt.tight_layout()\n    plt.show()\n    \n    plt.figure(figsize=(16,5))\n    tmp_df = df.set_index(\"timestamp\", inplace=True)\n    tmp_df.meter_reading.sum().plot()\n    plt.title(f\"Meter readings for building\")\n    plt.xlabel(\"Sum of readings\")\n    plt.tight_layout()\n    plt.show()\n    \n    from pandas import Grouper\n\ngroups = df['meter_reading'].groupby(Grouper(freq='M'))\nmonths = concat([(x[1].values) for x in groups], axis=1)\nmonths = df(mois)\nmonths.columns = range(1,13)\nmonths.boxplot()\npyplot.show()\n\ndf_tmpY = df.groupby('annee').count()\nplt.plot(df_tmpY['meter_reading'])\n\ndf_tmp = df.groupby('mois').count()\nplt.plot(df_tmp['meter_reading'])\n\ndf.plot(df['air_temperature'], figsize=(12,4))\n\nsns.set()\ndf.resample('meter_reading').mean().plot(style=':')\n\ndf.set_index(\"timestamp\", inplace=True)\ndf.resample('D').meter_reading.sum().plot()\n'''","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Représentation de toutes les variables selon le temps\n##############\n\n# !!!! Attention long car toutes les valeurs de timestamp s'affichent !!!\n\ndf.set_index('timestamp', inplace=True) #le nouvel index correspond à timestamp ce qui permet de réaliser des graphiques temporels\ndf.plot(figsize=(12,4))","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"df.hist(figsize = (13,13))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"df_categorical = df.loc[:,['wind_speed']]\nsns.countplot(x=\"variable\", hue=\"value\",data= pd.melt(df_categorical));","execution_count":null,"outputs":[]},{"metadata":{"scrolled":false,"trusted":true},"cell_type":"code","source":"df_categorical = df.loc[:,['dew_temperature']]\ng = sns.countplot(x=\"variable\", hue=\"value\",data= pd.melt(df_categorical));\ng._legend.remove()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":false,"trusted":true},"cell_type":"code","source":"df_categorical = df.loc[:,['air_temperature']]\ng = sns.countplot(x=\"variable\", hue=\"value\",data= pd.melt(df_categorical));\ng._legend.remove()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#Représentation de l'évolution des température par mois; on préfère le second graphique\n#sous forme de ligne que le premier qui est un histogramme\n'''\ndf.groupby('mois')['air_temperature'].mean().plot(kind='bar')\nplt.ylabel('air_temperature')\nplt.show()\n'''\ntime_grp = df.groupby('mois')['air_temperature'].mean().reset_index()\nsns.lineplot(x='mois', y='air_temperature', data=time_grp)\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#Représentation de la vitesse du vent sur un an par mois\n\n'''df.groupby('mois')['wind_speed'].mean().plot(kind='bar')\nplt.ylabel('wind_speed')\nplt.show()'''\n\ntime_grp = df.groupby('mois')['wind_speed'].mean().reset_index()\nsns.lineplot(x='mois', y='wind_speed', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#représentation de la température de dew par mois sur un an\n\n'''df.groupby('mois')['dew_temperature'].mean().plot(kind='bar')\nplt.ylabel('dew_temperature')\nplt.show()'''\n\ntime_grp = df.groupby('mois')['dew_temperature'].mean().reset_index()\nsns.lineplot(x='mois', y='dew_temperature', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#représentation des nuages par mois pendant une annnée\n\n'''df.groupby('mois')['cloud_coverage'].mean().plot(kind='bar')\nplt.ylabel('cloud_coverage')\nplt.show()'''\n\ntime_grp = df.groupby('mois')['cloud_coverage'].mean().reset_index()\nsns.lineplot(x='mois', y='cloud_coverage', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"#Représentation des précipitations moyennes par heure par mois pendant une an\n\n'''df.groupby('mois')['precip_depth_1_hr'].mean().plot(kind='bar')\nplt.ylabel('air_temperature')\nplt.show()'''\n\ntime_grp = df.groupby('mois')['precip_depth_1_hr'].mean().reset_index()\nsns.lineplot(x='mois', y='precip_depth_1_hr', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"'''df.groupby('mois')['meter'].mean().plot(kind='bar')\nplt.ylabel('meter')\nplt.show()'''\n\ntime_grp = df.groupby('mois')['meter'].mean().reset_index()\nsns.lineplot(x='mois', y='meter', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"df.groupby('mois')['meter_reading'].mean().plot(kind='bar')\nplt.ylabel('meter_reading')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"time_grp = df.groupby('mois')['meter_reading'].mean().reset_index()\nsns.lineplot(x='mois', y='meter_reading', data=time_grp)","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Building par site\n##############\n\ndf_build_site = df.site_id.value_counts()\nfig, axes = plt.subplots(1,1,figsize=(10, 5), dpi=100)\nsns.barplot(x=df_build_site.index,\n           y=df_build_site.values,\n           palette = 'Blues_d',\n           saturation=.5)\naxes.set_title('Nombre de buildings par site')\ndel df_build_site","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Split des données Entrainement/Test"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Suppression des bases initiales\n##############\n\ndel train\ndel weather_train\ndel building_meta","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Création de la variable cible et des variables explicatioves\n#### Split en App/Test\n##############\n\n\nX=df.drop(columns=[\"meter_reading\"])\ny=np.log1p(df[\"meter_reading\"])\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)\n\n\ndel X\ndel y\ndel df\n\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Modèle de Prédiction"},{"metadata":{},"cell_type":"markdown","source":"## Random Forest"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Création de forets dans le but de réduire la demande mémoire\n##############\n\n\nfrom sklearn.ensemble import forest\ndef set_rf_samples(n):\n    forest._generate_sample_indices = (lambda rs, n_samples:\n        forest.check_random_state(rs).randint(0, n_samples, n))\nset_rf_samples(130000)\n\n\ndef reset_rf_samples():\n    \"\"\" Undoes the changes produced by set_rf_samples.\n    \"\"\"\n    forest._generate_sample_indices = (lambda rs, n_samples:\n        forest.check_random_state(rs).randint(0, n_samples, n_samples))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = RandomForestRegressor(n_estimators=60,\n                              random_state=0,\n                              n_jobs=-1)\nmodel.fit(X_train,y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred=model.predict(X_test)\nprint('The rmse of prediction is:', mean_squared_log_error(y_test, y_pred) ** 0.5)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"##############\n#### Importance des variables dans la foret d'arbre\n##############\n\nfeature_names = X_train.columns\nimportances = model.feature_importances_\nstd = np.std([tree.feature_importances_ for tree in model.estimators_],\n             axis=0)\nindices = np.argsort(importances)[::-1]\n\nplt.figure(figsize=(10,10))\nplt.title(\"Feature importances\")\nplt.bar(range(X_train.shape[1]), importances[indices],\n       color=\"r\", align=\"center\")\nplt.xticks(range(X_train.shape[1]), feature_names, rotation='vertical')\nplt.xlim([-1, X_train.shape[1]])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Kfold pour la réglage des parametres de la random forest\n#### Attention beaucoup de calcul\n##############\n\nfrom sklearn.model_selection import KFold\n\nkf = KFold(n_splits= 2,shuffle=True,random_state=42)\n\nn_estimators = [100, 150]\n\nmoyenne_erreur_K_fold = []\necart_type_erreur_K_fold =[]\n\nfor i in range(0,len(n_estimators)):\n    erreur_fold = []\n    for train_index, test_index in kf.split(X_train):\n        X_train_K_fold, X_test_K_fold = X_train.iloc[train_index], X_train.iloc[test_index]\n        y_train_K_fold, y_test_K_fold = y_train.iloc[train_index], y_train.iloc[test_index]\n        model_K_fold = RandomForestRegressor(n_estimators=n_estimators[i],\n                                             random_state=0,\n                                             n_jobs=-1,\n                                             )\n        model_K_fold.fit(X_train_K_fold,y_train_K_fold)\n        y_pred_K_fold = model_K_fold.predict(X_test_K_fold)\n        erreur = mean_squared_error(y_test_K_fold, y_pred_K_fold) ** 0.5\n        erreur_fold.append(erreur)\n    moyenne_erreur_K_fold.append(np.mean(erreur))\n    ecart_type_erreur_K_fold.append(np.std(erreur_fold))\n\ndel X_train_K_fold\ndel X_test_K_fold\ndel y_train_K_fold\ndel y_test_K_fold\n\ngc.collect()\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"print(moyenne_erreur_K_fold)\nprint(ecart_type_erreur_K_fold)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Kfold pour le réglage des paramétres de la random forest\nK fold a 3 partie pour éviter trop de calcul  \nRéglage effectué:\n- n_estimators : [50,100,150,200] \n    - rmsle respective : [2.968147610655667, 2.9671450330825153, 2.9666543089927586, 2.966109024713737]\n    - Pas d'amélioration significative, donc on peut choisir un n_estimators de 75\n- max_depth : [25, 50, 100, 150, 200] (n_estimators fixé à 75)\n    - rmsle respective : [2.9662009028792156, 2.967497273677587, 2.967527376580337, 2.967527376580337, 2.967527376580337]\n    - Augmentation de l'erreur donc on retente avec un nouvelle intervalle\n- max_depth : [5,10,15,20,25] (n_estimators fixé à 75)\n    - rmsle respective : [2.800616598084297, 2.8614102668615957, 2.922111845686289, 2.9581722179653602, 2.9662009028792156]\n    - Tjrs une augmentation de l'erreur donc on va choisir de ne pas mettre de limite au max_depth\n- min_samples_split = [5,10,15,20,25]\n    - [2.9673285523485937, 2.967651845164756, 2.966488144150637, 2.9648115928331764, 2.9625328461344123]\n"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Reset des forêts\n##############\n\nreset_rf_samples()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## KNN"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.neighbors import KNeighborsRegressor","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_train_knn, X_test_knn, y_train_knn, y_test_knn = train_test_split(X_train, y_train, test_size=0.33, random_state=42)\nk_range = [5, 10, 15, 20]\nerreur_knn = []\nfor i in range(0,len(k_range)):\n    knn = KNeighborsRegressor(n_neighbors=k_range[i],n_jobs=-1, weights='distance')\n    knn.fit(X_train_knn,y_train_knn)\n    y_pred = knn.predict(X_test_knn)\n    erreur = mean_squared_error(y_test_knn, y_pred)**0.5\n    erreur_knn.append(erreur)\n\ndel X_train_knn\ndel X_test_knn\ndel y_test_knn\ndel y_train_knn\ndel y_pred\n\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"plt.plot( k_range,erreur_knn , marker='o', markerfacecolor='blue', markersize=12, color='skyblue', linewidth=4)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Gradient Boosting avec LightGBM"},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Création des DataSets de LightGBM & des paramètres de ses datasets\n##############\n\ncategorical_features = [\"building_id\", \"site_id\", \"meter\", \"primary_use\"]\n\nlgb_train = lgb.Dataset(X_train, \n                        label=y_train,\n                        categorical_feature=categorical_features,\n                        free_raw_data=False)\n\nlgb_eval = lgb.Dataset(X_test, \n                       label=y_test,\n                       categorical_feature=categorical_features,\n                       free_raw_data=False)\n","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Paramètre du gradient boosting\n##############\n\nparams_lgb = {\n    \"objective\": \"regression\",\n    \"boosting\": \"gbdt\",\n    \"num_leaves\": 1000,\n    \"learning_rate\": 0.05,\n    \"feature_fraction\": 0.85,\n    \"reg_lambda\": 2,\n    \"metric\": \"rmse\",\n}","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true},"cell_type":"code","source":"##############\n#### Entrainement du modele\n##############\n\nmodel_lgb = lgb.train(params_lgb, \n                train_set=lgb_train, \n                num_boost_round=100, \n                valid_sets=[lgb_train,lgb_eval], \n                verbose_eval=25, \n                early_stopping_rounds=50)","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","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.6.5"}},"nbformat":4,"nbformat_minor":1}