{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"categoricals = [\"site_id\", \"building_id\", \"primary_use\", \"hour\", \"weekday\", \"meter\",  \"wind_direction\"]\nnumericals = [\"square_feet\", \"year_built\", \"air_temperature\", \"cloud_coverage\",\n              \"dew_temperature\", 'precip_depth_1_hr', 'floor_count', 'beaufort_scale']\n\nfeat_cols = categoricals + numericals","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Carregamento dos dados de treinamento\nUtiliza arquivos pickles criados em versão anterior do notebook para acelerar tempo de carregamento"},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_pickle('/kaggle/input/ashrae-pickle/train.pickle')\ntarget = pd.read_pickle('/kaggle/input/ashrae-pickle/target.pickle')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Treinamento do modelo (não precisa rodar)\nUtiliza K-Fold para Cross Validation, treinando 4 modelos diferentes\n\nEste passo é opcional, visto que já foi executado, e o modelo salvo nos arquivos lgb_i.txt (ver Seção Carregamento do modelo salvo)"},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import mean_squared_error\nimport lightgbm as lgb\nfrom sklearn.model_selection import KFold, StratifiedKFold\nfrom tqdm import tqdm\n\n\nparams = {\n            'boosting_type': 'gbdt',\n            'objective': 'regression',\n            'metric': {'rmse'},\n            'subsample': 0.25,\n            'subsample_freq': 1,\n            'learning_rate': 0.4,\n            'num_leaves': 20,\n            'feature_fraction': 0.9,\n            'lambda_l1': 1,  \n            'lambda_l2': 1\n            }\n\nfolds = 4\nseed = 666\n\nkf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=seed)\n\nmodels = []\nfor train_index, val_index in kf.split(train, train['building_id']):\n    train_X = train[feat_cols].iloc[train_index]\n    val_X = train[feat_cols].iloc[val_index]\n    train_y = target.iloc[train_index]\n    val_y = target.iloc[val_index]\n    lgb_train = lgb.Dataset(train_X, train_y, categorical_feature=categoricals)\n    lgb_eval = lgb.Dataset(val_X, val_y, categorical_feature=categoricals)\n    gbm = lgb.train(params,\n                lgb_train,\n                num_boost_round=500,\n                valid_sets=(lgb_train, lgb_eval),\n                early_stopping_rounds=100,\n                verbose_eval = 100)\n    models.append(gbm)\n\n# Salva modelo treinado\nfor i in range(len(models)):\n    models[i].save_model('lgb_{}.txt'.format(i), num_iteration=models[i].best_iteration)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Carregamento dos dados de teste (não precisa rodar)\nA fazer: criar arquivo pickle para acelerar tempo de carregamento\n\nEste passo é opcional, apenas caso queira enviar submissão para a competição, visto que os dados de teste não possuem os valores do target"},{"metadata":{"trusted":true},"cell_type":"code","source":"import gc\ndel train, train_X, val_X, lgb_train, lgb_eval, train_y, val_y, target\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def degToCompass(num):\n    val=int((num/22.5)+.5)\n    arr=[i for i in range(0,16)]\n    return arr[(val % 16)]\n\ndef average_imputation(df, column_name):\n    imputation = df.groupby(['timestamp'])[column_name].mean()\n    \n    df.loc[df[column_name].isnull(), column_name] = df[df[column_name].isnull()][[column_name]].apply(lambda x: imputation[df['timestamp'][x.index]].values)\n    del imputation\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\n\nle = LabelEncoder()\nbuilding_df = pd.read_csv(\"../input/ashrae-energy-prediction/building_metadata.csv\")\ntest = pd.read_csv(\"../input/ashrae-energy-prediction/test.csv\")\ntest = test.merge(building_df, left_on = \"building_id\", right_on = \"building_id\", how = \"left\")\ndel building_df\ngc.collect()\ntest[\"primary_use\"] = le.fit_transform(test[\"primary_use\"])  # TODO: talvez de merda\n\nweather_test = pd.read_csv(\"../input/ashrae-energy-prediction/weather_test.csv\")\n\ntest = test.merge(weather_test, left_on = [\"site_id\", \"timestamp\"], right_on = [\"site_id\", \"timestamp\"], how = \"left\")\ndel weather_test\ngc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test[\"timestamp\"] = pd.to_datetime(test[\"timestamp\"])\ntest[\"hour\"] = test[\"timestamp\"].dt.hour\ntest[\"weekday\"] = test[\"timestamp\"].dt.weekday\ntest[\"weekday\"] = test['weekday'].astype(np.uint8)\ntest[\"hour\"] = test['hour'].astype(np.uint8)\ntest['year_built'] = test['year_built']-1900\ntest['square_feet'] = np.log(test['square_feet'])\n\ntest = average_imputation(test, 'wind_speed')\ntest = average_imputation(test, 'wind_direction')\n\nbeaufort = [(0, 0, 0.3), (1, 0.3, 1.6), (2, 1.6, 3.4), (3, 3.4, 5.5), (4, 5.5, 8), (5, 8, 10.8), (6, 10.8, 13.9), \n          (7, 13.9, 17.2), (8, 17.2, 20.8), (9, 20.8, 24.5), (10, 24.5, 28.5), (11, 28.5, 33), (12, 33, 200)]\n\nfor item in beaufort:\n    test.loc[(test['wind_speed']>=item[1]) & (test['wind_speed']<item[2]), 'beaufort_scale'] = item[0]\ntest['wind_direction'] = test['wind_direction'].apply(degToCompass)\n\ntest['wind_direction'] = test['wind_direction'].apply(degToCompass)\ntest['beaufort_scale'] = test['beaufort_scale'].astype(np.uint8)\ntest[\"wind_direction\"] = test['wind_direction'].astype(np.uint8)\ntest[\"meter\"] = test['meter'].astype(np.uint8)\ntest[\"site_id\"] = test['site_id'].astype(np.uint8)\n\ntest = test[feat_cols]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Faz predicao na base de teste\nfrom tqdm import tqdm\n\nfolds = 4\ni=0\nres=[]\nstep_size = 50000\nfor j in tqdm(range(int(np.ceil(test.shape[0]/50000)))):\n    res.append(np.expm1(sum([model.predict(test.iloc[i:i+step_size]) for model in models])/folds))\n    i+=step_size","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Submissao do resultado do teste\nres = np.concatenate(res)\nsubmission = pd.read_csv('/kaggle/input/ashrae-energy-prediction/sample_submission.csv')\nsubmission['meter_reading'] = res\nsubmission.loc[submission['meter_reading']<0, 'meter_reading'] = 0\nsubmission.to_csv('submission.csv', index=False)\nsubmission","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Carregamento do modelo salvo\nCarrega modelo pré-treinado"},{"metadata":{"trusted":true},"cell_type":"code","source":"import lightgbm as lgb\nmodels = []\nfor i in range(4):\n    model = lgb.Booster(model_file='/kaggle/input/ashrae-pickle/lgb_{}.txt'.format(i))\n    models.append(model)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# Visualizacao do Feature Importance\nimport seaborn as sns\ndf_fimp = pd.DataFrame()\nfor i in range(4):\n    df_cv = pd.DataFrame()\n    df_cv[\"feature\"] = feat_cols\n    df_cv[\"importance\"] = models[i].feature_importance()\n    df_cv[\"cv\"] = i\n    df_fimp = pd.concat([df_fimp, df_cv], axis=0)\n\nsns.barplot(x=\"importance\", y=\"feature\", data=df_fimp.sort_values(by=\"importance\", ascending=False))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del test\ntrain = pd.read_pickle('/kaggle/input/ashrae-pickle/train.pickle')\ntarget = pd.read_pickle('/kaggle/input/ashrae-pickle/target.pickle')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"predicted = []\nfor i in range(100, 200):\n    train_X = train[feat_cols].iloc[i]\n    prediction = sum([model.predict(train_X) for model in models])/4\n    predicted.append(prediction)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from matplotlib import pyplot as plt\n\nplt.plot(train.iloc[100:200].index, target.iloc[100:200])\nplt.plot(train.iloc[100:200].index, predicted)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import KFold, StratifiedKFold\n\nfolds = 4\nseed = 666\n\nkf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=seed)\ni = 0\nkf_split = kf.split(train, train['building_id'])\ntrain_index, val_index = kf_split[0]\ntrain_X = train[feat_cols].iloc[train_index]\nval_y = target.iloc[val_index]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"start = 230\nsize = 50\nprediction = models[i].predict(train_X.iloc[start:start+size])\nplt.plot(val_y.iloc[start:start+size].values)\nplt.plot(prediction)\nplt.legend(['Real', 'Predição'])","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}