{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load in \n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom sklearn.ensemble import GradientBoostingRegressor\nfrom sklearn.model_selection import KFold\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.model_selection import train_test_split\nfrom pandas import DataFrame\nfrom scipy import stats\nfrom sklearn import preprocessing\nfrom scipy.stats import zscore\n\nimport seaborn as sns\nimport matplotlib.pylab as plt\n\n%matplotlib inline\n\nfrom IPython.core.interactiveshell import InteractiveShell\nInteractiveShell.ast_node_interactivity = \"all\"\n\nimport seaborn as sns\nimport matplotlib.pylab as plt\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory\n\nimport os\nprint(os.listdir(\"../input\"))\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def reduce_mem_usage(df):\n    \"\"\" iterate through all the columns of a dataframe and modify the data type\n        to reduce memory usage.        \n    \"\"\"\n    start_mem = df.memory_usage().sum() / 1024**2\n    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n    \n    for col in df.columns:\n        col_type = df[col].dtype\n        \n        if col_type != object:\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        else:\n            df[col] = df[col].astype('category')\n\n    end_mem = df.memory_usage().sum() / 1024**2\n    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n    \n    return df","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Merge History Transaction Data**"},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true},"cell_type":"code","source":"train = reduce_mem_usage(pd.read_csv(\"../input/train.csv\"))\ntest = reduce_mem_usage(pd.read_csv(\"../input/test.csv\"))\nhist_txns = reduce_mem_usage(pd.read_csv(\"../input/historical_transactions.csv\"))\nnew_txns = reduce_mem_usage(pd.read_csv(\"../input/new_merchant_transactions.csv\"))\nmerchants = reduce_mem_usage(pd.read_csv(\"../input/merchants.csv\"))\nall_txns = pd.concat([hist_txns, new_txns], ignore_index=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Filter only valid transactions**"},{"metadata":{"trusted":false},"cell_type":"code","source":"all_txns_train=all_txns[(all_txns['card_id'].isin(train['card_id']))].reset_index()\nall_txns_test=all_txns[(all_txns['card_id'].isin(test['card_id']))].reset_index()\ndel all_txns\ndel hist_txns\ndel new_txns","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"all_txns_train.head(5)\nall_txns_train.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Fix Null**"},{"metadata":{"trusted":false},"cell_type":"code","source":"le = preprocessing.LabelEncoder()\nfor dataset in [all_txns_train,all_txns_test]:\n    dataset['category_1_en']=le.fit_transform(dataset['category_1'])\n    g = pd.Series(dataset['category_3'], dtype=\"category\")\n    dataset['category_3']=g.cat.add_categories(\"D\").fillna(\"D\")\n    dataset['category_3_en']=le.fit_transform(dataset['category_3'])\n    dataset['category_2']=dataset['category_2'].fillna(0)\n    dataset.drop(['index','category_1','category_3','merchant_category_id'],axis=1,inplace=True)\n    #dataset[dataset.columns[dataset.dtypes != np.object]] = dataset[dataset.columns[dataset.dtypes != np.object]].abs()\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"all_txns_train.head(5)\nall_txns_train.isnull().sum()\nall_txns_train.dtypes\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Univariate Analysis**"},{"metadata":{"trusted":false},"cell_type":"code","source":"col_names=['city_id','installments','month_lag','purchase_amount','category_2','state_id','subsector_id','category_1_en','category_3_en']\n#fig, ax = plt.subplots(len(col_names), figsize=(16,12)),\nfig, ax = plt.subplots(9, 2, figsize = (15, 35))\nfor i, col_val in enumerate(col_names):\n    sns.boxplot(x= all_txns_train[col_val], ax = ax[i,0])\n    sns.distplot(all_txns_train[col_val], ax = ax[i,1])\nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"col_names=['city_id','installments','month_lag','purchase_amount','category_2','state_id','subsector_id','category_1_en','category_3_en']\n#fig, ax = plt.subplots(len(col_names), figsize=(16,12)),\nfig, ax = plt.subplots(9, 2, figsize = (15, 35))\nfor i, col_val in enumerate(col_names):\n    sns.boxplot(x= all_txns_test[col_val], ax = ax[i,0])\n    sns.distplot(all_txns_test[col_val], ax = ax[i,1])\nplt.tight_layout()","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"col_names=['city_id','installments','month_lag','category_2','state_id','subsector_id','category_1_en','category_3_en']\nfor i, col_val in enumerate(col_names):\n    print (\"Unique Values for {}  {}\" .format(col_val,sorted(all_txns_train[col_val].unique())))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Groupby cardId and apply aggregateion based on Univariate analysis**"},{"metadata":{"trusted":false},"cell_type":"code","source":"train_data = all_txns_train.groupby(\"card_id\").agg({\n            \"city_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"installments\": {'mode': lambda x: x.mode()[0],'sum':np.sum,'unique':lambda x: x.nunique()},\n            \"month_lag\":{'mode': lambda x: x.mode()[0],'sum':np.sum,'unique':lambda x: x.nunique()},\n            \"purchase_amount\": [np.mean,np.sum],\n            \"purchase_date\": [np.max],\n            \"merchant_id\":{'unique':lambda x: x.nunique()},\n            \"category_2\": {\"0\": lambda x: x[x==0].count(),\n                           \"1\": lambda x: x[x==1].count(),\n                           \"2\": lambda x: x[x==2].count(),\n                           \"3\": lambda x: x[x==3].count(),\n                           \"4\": lambda x: x[x==4].count(),\n                           \"5\": lambda x: x[x==5].count()},\n            \"authorized_flag\": {\"Y\": lambda x: x[x == 'Y'].count(),\n                                \"N\": lambda x: x[x == 'N'].count()},\n            \"state_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"subsector_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"category_1_en\": {\"0\": lambda x: x[x==0].count(),\n                              \"1\": lambda x: x[x==1].count()},\n            \"category_3_en\": {\"0\": lambda x: x[x==0].count(),\n                              \"1\": lambda x: x[x==1].count(),\n                              \"2\": lambda x: x[x==2].count(),\n                              \"3\": lambda x: x[x==3].count()}\n        })\ntrain_data.columns = [\"_\".join(x) for x in train_data.columns.ravel()]\ntrain_data = train_data.reset_index()\n    \ntest_data = all_txns_test.groupby(\"card_id\").agg({\n            \"city_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"installments\": {'mode': lambda x: x.mode()[0],'sum':np.sum,'unique':lambda x: x.nunique()},\n            \"month_lag\":{'mode': lambda x: x.mode()[0],'sum':np.sum,'unique':lambda x: x.nunique()},\n            \"purchase_amount\": [np.mean,np.sum],\n            \"purchase_date\": [np.max],\n            \"merchant_id\":{'unique':lambda x: x.nunique()},\n            \"category_2\": {\"0\": lambda x: x[x==0].count(),\n                           \"1\": lambda x: x[x==1].count(),\n                           \"2\": lambda x: x[x==2].count(),\n                           \"3\": lambda x: x[x==3].count(),\n                           \"4\": lambda x: x[x==4].count(),\n                           \"5\": lambda x: x[x==5].count()},\n            \"authorized_flag\": {\"Y\": lambda x: x[x == 'Y'].count(),\n                                \"N\": lambda x: x[x == 'N'].count()},\n            \"state_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"subsector_id\": {'mode': lambda x: x.mode()[0],'unique':lambda x: x.nunique()},\n            \"category_1_en\": {\"0\": lambda x: x[x==0].count(),\n                              \"1\": lambda x: x[x==1].count()},\n            \"category_3_en\": {\"0\": lambda x: x[x==0].count(),\n                              \"1\": lambda x: x[x==1].count(),\n                              \"2\": lambda x: x[x==2].count(),\n                              \"3\": lambda x: x[x==3].count()}\n        })\ntest_data.columns = [\"_\".join(x) for x in test_data.columns.ravel()]\ntest_data = test_data.reset_index()\n    \n#Append the grouped data to train/test set based on cardID\ntrain_data = train.join(train_data.set_index(\"card_id\"), on=\"card_id\")\ntest_data = test.join(test_data.set_index(\"card_id\"), on=\"card_id\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data['target']=train_data['target'].astype('float64')","execution_count":9,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Bivariate against target"},{"metadata":{"trusted":false},"cell_type":"code","source":"def scatter_p(fea,target):\n    n_f = len(fea)\n    n_row = n_f//3+1\n    fig=plt.figure(figsize=(20,15))\n    i = 1\n    for f in fea:\n        x=train_data[f]\n        y=train_data[target]\n        m, b = np.polyfit(x, y, 1)    \n        \n        ax=fig.add_subplot(n_row,3,i)\n        plt.plot(x,y,'.',color='b')\n        plt.plot(x, m*x + b, '-',color='r')\n        plt.xlabel(f)\n        plt.ylabel(target)\n        i += 1","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"scatter_p(fea=['feature_1','feature_2', 'feature_3','city_id_mode','city_id_unique','installments_mode'],target='target')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"scatter_p(fea=['installments_sum','installments_unique', 'month_lag_mode','month_lag_sum','month_lag_unique','purchase_amount_mean'],target='target')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"scatter_p(fea=['purchase_amount_sum','merchant_id_unique', 'state_id_mode','state_id_unique','subsector_id_mode','subsector_id_unique'],target='target')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"plt.figure(figsize=(8,8))\nplt.hist(train_data.target,bins=10,color='b')\nplt.title('Histogram of target')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_dummies=train_data.drop(['first_active_month','card_id','target','purchase_date_amax'],1)\ntest_data_dummies=test_data.drop(['first_active_month','card_id','purchase_date_amax'],1)\ny_train=train_data.loc[:,train_data.columns=='target']","execution_count":10,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_dummies = pd.get_dummies(train_data_dummies, columns=['feature_1','feature_2','feature_3'])\ntest_data_dummies = pd.get_dummies(test_data_dummies, columns=['feature_1','feature_2','feature_3'])","execution_count":11,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_data_dummies.head()","execution_count":16,"outputs":[{"output_type":"execute_result","execution_count":16,"data":{"text/plain":"   city_id_mode  city_id_unique     ...       feature_3_0  feature_3_1\n0     -0.597562        0.939537     ...         -0.876431     0.876431\n1     -0.597562        0.939537     ...          1.140992    -1.140992\n2      0.093086       -0.113231     ...          1.140992    -1.140992\n3     -1.082882        0.413153     ...          1.140992    -1.140992\n4     -1.082882        0.413153     ...          1.140992    -1.140992\n\n[5 rows x 39 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>city_id_mode</th>\n      <th>city_id_unique</th>\n      <th>installments_mode</th>\n      <th>installments_sum</th>\n      <th>installments_unique</th>\n      <th>month_lag_mode</th>\n      <th>month_lag_sum</th>\n      <th>month_lag_unique</th>\n      <th>purchase_amount_mean</th>\n      <th>purchase_amount_sum</th>\n      <th>merchant_id_unique</th>\n      <th>category_2_0</th>\n      <th>category_2_1</th>\n      <th>category_2_2</th>\n      <th>category_2_3</th>\n      <th>category_2_4</th>\n      <th>category_2_5</th>\n      <th>authorized_flag_Y</th>\n      <th>authorized_flag_N</th>\n      <th>state_id_mode</th>\n      <th>state_id_unique</th>\n      <th>subsector_id_mode</th>\n      <th>subsector_id_unique</th>\n      <th>category_1_en_0</th>\n      <th>category_1_en_1</th>\n      <th>category_3_en_0</th>\n      <th>category_3_en_1</th>\n      <th>category_3_en_2</th>\n      <th>category_3_en_3</th>\n      <th>feature_1_1</th>\n      <th>feature_1_2</th>\n      <th>feature_1_3</th>\n      <th>feature_1_4</th>\n      <th>feature_1_5</th>\n      <th>feature_2_1</th>\n      <th>feature_2_2</th>\n      <th>feature_2_3</th>\n      <th>feature_3_0</th>\n      <th>feature_3_1</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>-0.597562</td>\n      <td>0.939537</td>\n      <td>-0.738435</td>\n      <td>-0.554690</td>\n      <td>-0.563581</td>\n      <td>0.489216</td>\n      <td>-0.971623</td>\n      <td>0.458545</td>\n      <td>-0.003037</td>\n      <td>-0.014150</td>\n      <td>2.260470</td>\n      <td>-0.0</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>1.794725</td>\n      <td>0.442647</td>\n      <td>-0.267853</td>\n      <td>0.045415</td>\n      <td>0.685138</td>\n      <td>1.612435</td>\n      <td>1.865411</td>\n      <td>-0.333868</td>\n      <td>2.382449</td>\n      <td>-0.466892</td>\n      <td>-0.557439</td>\n      <td>-0.427906</td>\n      <td>-0.251779</td>\n      <td>-0.617946</td>\n      <td>-0.757132</td>\n      <td>-0.330513</td>\n      <td>1.992552</td>\n      <td>-0.889961</td>\n      <td>1.303080</td>\n      <td>-0.480201</td>\n      <td>-0.876431</td>\n      <td>0.876431</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>-0.597562</td>\n      <td>0.939537</td>\n      <td>0.552686</td>\n      <td>4.659456</td>\n      <td>2.378682</td>\n      <td>1.060632</td>\n      <td>-2.234287</td>\n      <td>1.567382</td>\n      <td>-0.002993</td>\n      <td>-0.016763</td>\n      <td>3.166259</td>\n      <td>0.0</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>2.532686</td>\n      <td>0.274495</td>\n      <td>-0.267853</td>\n      <td>0.045415</td>\n      <td>0.685138</td>\n      <td>2.187267</td>\n      <td>2.268767</td>\n      <td>1.240727</td>\n      <td>-0.522021</td>\n      <td>3.312391</td>\n      <td>5.993349</td>\n      <td>0.762221</td>\n      <td>-0.251779</td>\n      <td>-0.617946</td>\n      <td>-0.757132</td>\n      <td>3.025597</td>\n      <td>-0.501869</td>\n      <td>1.123645</td>\n      <td>-0.767412</td>\n      <td>-0.480201</td>\n      <td>1.140992</td>\n      <td>-1.140992</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>0.093086</td>\n      <td>-0.113231</td>\n      <td>-0.738435</td>\n      <td>-0.592959</td>\n      <td>-0.983905</td>\n      <td>-1.796449</td>\n      <td>0.038180</td>\n      <td>1.012964</td>\n      <td>-0.003101</td>\n      <td>-0.003045</td>\n      <td>-0.749088</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>0.0</td>\n      <td>-0.448675</td>\n      <td>-0.482193</td>\n      <td>-0.887491</td>\n      <td>-0.579466</td>\n      <td>0.570980</td>\n      <td>-0.878507</td>\n      <td>-0.429878</td>\n      <td>-0.333868</td>\n      <td>-0.063968</td>\n      <td>-0.521270</td>\n      <td>-0.557439</td>\n      <td>-0.427906</td>\n      <td>-0.251779</td>\n      <td>1.618264</td>\n      <td>-0.757132</td>\n      <td>-0.330513</td>\n      <td>-0.501869</td>\n      <td>-0.889961</td>\n      <td>1.303080</td>\n      <td>-0.480201</td>\n      <td>1.140992</td>\n      <td>-1.140992</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>-1.082882</td>\n      <td>0.413153</td>\n      <td>0.552686</td>\n      <td>0.258525</td>\n      <td>0.277065</td>\n      <td>-0.082200</td>\n      <td>0.304177</td>\n      <td>-0.373082</td>\n      <td>-0.003053</td>\n      <td>-0.004851</td>\n      <td>0.507329</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>-0.035417</td>\n      <td>-0.650346</td>\n      <td>1.745971</td>\n      <td>1.295177</td>\n      <td>1.027613</td>\n      <td>0.462769</td>\n      <td>-0.170578</td>\n      <td>0.326446</td>\n      <td>-0.522021</td>\n      <td>0.484726</td>\n      <td>0.079443</td>\n      <td>1.357285</td>\n      <td>-0.251779</td>\n      <td>-0.617946</td>\n      <td>-0.757132</td>\n      <td>3.025597</td>\n      <td>-0.501869</td>\n      <td>-0.889961</td>\n      <td>-0.767412</td>\n      <td>2.082459</td>\n      <td>1.140992</td>\n      <td>-1.140992</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>-1.082882</td>\n      <td>0.413153</td>\n      <td>0.552686</td>\n      <td>1.483132</td>\n      <td>0.697389</td>\n      <td>0.774924</td>\n      <td>0.453595</td>\n      <td>-0.927500</td>\n      <td>-0.002714</td>\n      <td>-0.005926</td>\n      <td>1.822184</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>-0.0</td>\n      <td>0.0</td>\n      <td>-0.0</td>\n      <td>0.751741</td>\n      <td>-0.229964</td>\n      <td>1.745971</td>\n      <td>2.544939</td>\n      <td>1.027613</td>\n      <td>1.229213</td>\n      <td>0.607324</td>\n      <td>0.529620</td>\n      <td>-0.522021</td>\n      <td>1.653857</td>\n      <td>0.170426</td>\n      <td>0.167158</td>\n      <td>3.971737</td>\n      <td>-0.617946</td>\n      <td>-0.757132</td>\n      <td>-0.330513</td>\n      <td>-0.501869</td>\n      <td>-0.889961</td>\n      <td>-0.767412</td>\n      <td>2.082459</td>\n      <td>1.140992</td>\n      <td>-1.140992</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from scipy.stats import zscore\ntrain_data_dummies=train_data_dummies.apply(zscore)\ntest_data_dummies=test_data_dummies.apply(zscore)","execution_count":15,"outputs":[{"output_type":"stream","text":"/opt/conda/lib/python3.6/site-packages/numpy/core/_methods.py:107: RuntimeWarning: overflow encountered in reduce\n  arrmean = umr_sum(arr, axis, dtype, keepdims=True)\n","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import models\nfrom keras import optimizers\nfrom keras.models import Sequential\nfrom keras.layers import Dense,Dropout\nfrom keras.layers import BatchNormalization\nfrom keras import backend\nfrom keras.callbacks import EarlyStopping,ModelCheckpoint","execution_count":17,"outputs":[{"output_type":"stream","text":"Using TensorFlow backend.\n","name":"stderr"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"def rmse(y_true, y_pred):\n    return backend.sqrt(backend.mean(backend.square(y_pred - y_true)))","execution_count":18,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#Initialize Sequential Graph (model)\nmodel = models.Sequential()\n#Add Dense layer for prediction - Keras declares weights and bias automatically \nmodel.add(Dense(150, input_dim=len(train_data_dummies.columns),kernel_initializer='normal', activation='relu'))\nmodel.add(BatchNormalization())\n#model.add(Dropout(0.2))\nmodel.add(Dense(100, activation='relu'))\nmodel.add(Dense(60, activation='relu'))\n#model.add(Dropout(0.2))\nmodel.add(Dense(30, activation='relu'))\nmodel.add(Dense(1, activation='linear'))\n#Create optimizer with non-default learning rate \nsgd_optimizer = optimizers.SGD(lr=0.0003, momentum=0.9, decay=0.0, nesterov=False) \n#Compile the model - add Loss and Gradient Descent optimizer \n#early_stop = EarlyStopping(monitor='rmse', patience=3)\nmodel.compile(optimizer='adam', loss='mse', metrics=['mse',rmse])\nfilepath=\"weights.best.hdf5\"\ncheckpoint = ModelCheckpoint(filepath, monitor='rmse', verbose=1, save_best_only=True, mode='min')\ncallbacks_list = [checkpoint]\nhistory = model.fit(train_data_dummies, y_train, epochs=20,callbacks=callbacks_list)\nprint (model.summary)","execution_count":19,"outputs":[{"output_type":"stream","text":"WARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nColocations handled automatically by placer.\nWARNING:tensorflow:From /opt/conda/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.\nInstructions for updating:\nUse tf.cast instead.\nEpoch 1/20\n201917/201917 [==============================] - 30s 148us/step - loss: 14.6993 - mean_squared_error: 14.6993 - rmse: 3.1263\n\nEpoch 00001: rmse improved from inf to 3.12635, saving model to weights.best.hdf5\nEpoch 2/20\n201917/201917 [==============================] - 25s 124us/step - loss: 14.6314 - mean_squared_error: 14.6314 - rmse: 3.1245\n\nEpoch 00002: rmse improved from 3.12635 to 3.12453, saving model to weights.best.hdf5\nEpoch 3/20\n201917/201917 [==============================] - 26s 131us/step - loss: 14.6100 - mean_squared_error: 14.6100 - rmse: 3.1232\n\nEpoch 00003: rmse improved from 3.12453 to 3.12319, saving model to weights.best.hdf5\nEpoch 4/20\n201917/201917 [==============================] - 25s 124us/step - loss: 14.5737 - mean_squared_error: 14.5737 - rmse: 3.1294\n\nEpoch 00004: rmse did not improve from 3.12319\nEpoch 5/20\n201917/201917 [==============================] - 25s 124us/step - loss: 14.5725 - mean_squared_error: 14.5725 - rmse: 3.1302\n\nEpoch 00005: rmse did not improve from 3.12319\nEpoch 6/20\n201917/201917 [==============================] - 27s 133us/step - loss: 14.5408 - mean_squared_error: 14.5408 - rmse: 3.1262\n\nEpoch 00006: rmse did not improve from 3.12319\nEpoch 7/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.5365 - mean_squared_error: 14.5365 - rmse: 3.1248\n\nEpoch 00007: rmse did not improve from 3.12319\nEpoch 8/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.5148 - mean_squared_error: 14.5148 - rmse: 3.1230\n\nEpoch 00008: rmse improved from 3.12319 to 3.12301, saving model to weights.best.hdf5\nEpoch 9/20\n201917/201917 [==============================] - 28s 139us/step - loss: 14.5004 - mean_squared_error: 14.5004 - rmse: 3.1337\n\nEpoch 00009: rmse did not improve from 3.12301\nEpoch 10/20\n201917/201917 [==============================] - 26s 127us/step - loss: 14.4900 - mean_squared_error: 14.4900 - rmse: 3.1198\n\nEpoch 00010: rmse improved from 3.12301 to 3.11982, saving model to weights.best.hdf5\nEpoch 11/20\n201917/201917 [==============================] - 25s 124us/step - loss: 14.4835 - mean_squared_error: 14.4835 - rmse: 3.1215\n\nEpoch 00011: rmse did not improve from 3.11982\nEpoch 12/20\n201917/201917 [==============================] - 28s 137us/step - loss: 14.4474 - mean_squared_error: 14.4474 - rmse: 3.1234\n\nEpoch 00012: rmse did not improve from 3.11982\nEpoch 13/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.4428 - mean_squared_error: 14.4428 - rmse: 3.1263\n\nEpoch 00013: rmse did not improve from 3.11982\nEpoch 14/20\n201917/201917 [==============================] - 25s 126us/step - loss: 14.4072 - mean_squared_error: 14.4072 - rmse: 3.1226\n\nEpoch 00014: rmse did not improve from 3.11982\nEpoch 15/20\n201917/201917 [==============================] - 27s 132us/step - loss: 14.4176 - mean_squared_error: 14.4176 - rmse: 3.1260\n\nEpoch 00015: rmse did not improve from 3.11982\nEpoch 16/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.3843 - mean_squared_error: 14.3843 - rmse: 3.1204\n\nEpoch 00016: rmse did not improve from 3.11982\nEpoch 17/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.3838 - mean_squared_error: 14.3838 - rmse: 3.1285\n\nEpoch 00017: rmse did not improve from 3.11982\nEpoch 18/20\n201917/201917 [==============================] - 27s 132us/step - loss: 14.3362 - mean_squared_error: 14.3362 - rmse: 3.1190\n\nEpoch 00018: rmse improved from 3.11982 to 3.11900, saving model to weights.best.hdf5\nEpoch 19/20\n201917/201917 [==============================] - 25s 125us/step - loss: 14.3143 - mean_squared_error: 14.3143 - rmse: 3.1142\n\nEpoch 00019: rmse improved from 3.11900 to 3.11420, saving model to weights.best.hdf5\nEpoch 20/20\n201917/201917 [==============================] - 25s 124us/step - loss: 14.3002 - mean_squared_error: 14.3002 - rmse: 3.1146\n\nEpoch 00020: rmse did not improve from 3.11420\n<bound method Network.summary of <keras.engine.sequential.Sequential object at 0x7f7e215442b0>>\n","name":"stdout"}]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.plot(history.history['rmse'])\nplt.show()","execution_count":20,"outputs":[{"output_type":"execute_result","execution_count":20,"data":{"text/plain":"[<matplotlib.lines.Line2D at 0x7f7e066a31d0>]"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAYoAAAD8CAYAAABpcuN4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3Xl8lNW9+PHPN+uErJAMYZIQwhZQtqAhAlagWCtqXdqqlbYKWmvt+vPVe9t6f731d/WuvW1vvba1at3X2lq3KtxKvYhW1ogsQdmyCCSBLJCd7Of3xzwThmGSTJJZMpnv+/WaFzPPc555zgyT+c5zzvecI8YYlFJKqf5EhboCSimlRjcNFEoppQakgUIppdSANFAopZQakAYKpZRSA9JAoZRSakAaKJRSSg1IA4VSSqkBaaBQSik1oJhQV8AfMjIyTF5eXqiroZRSYeWDDz6oM8bYBys3JgJFXl4excXFoa6GUkqFFRH5xJdy2vSklFJqQBoolFJKDUgDhVJKqQFpoFBKKTUgDRRKKaUGpIFCKaXUgDRQKKWUGpAGChWxensNf9hxlPaunlBXRalRTQOFilgfHm3gh3/aw1/2HQ91VZQa1TRQqIhVVtsCQGXD6RDXRKnRTQOFiljlda0AVDe0h7gmSo1uGihUxOoLFI16RaHUQDRQqIjlChRVekWh1IA0UKiI1NtrzgQKvaJQakAaKFREOt7UTkd3L9lpCTS0dXG6U1NkleqPBgoVkVxXE0unpwN6VaHUQDRQqIhUZgWKi2dkAJr5pNRABg0UImITke0isltE9onIvV7KLBORnSLSLSLXu22fYm3fZR17p7V9nIi8KSL7re3/4XbMWhGptY7ZJSK3++vFKuVSXttKQmw0C3PTAL2iUGogviyF2gGsNMa0iEgs8DcRWW+M2epW5giwFvh7j2OrgSXGmA4RSQJKROR1oAH4uTFmo4jEAW+LyBXGmPXWcS8aY74zkhem1EDK61rIy0hkUqoN0CsKpQYyaKAwxhigxXoYa92MR5kKABHp9dje6fYwHusKxhjTBmx0lRGRnUDOsF6BUsNQUd/GeY5k4mOiyUiK17EUSg3Apz4KEYkWkV1ADbDBGLPN1xOIyGQR2QMcBX5qjKny2J8GXA287bb5iyKyR0ReEpHJvp5LKV909fRy5GQbUzMSAchOs1HVqFcUSvXHp0BhjOkxxhTg/NVfJCJzfT2BMeaoMWY+MANYIyKZrn0iEgO8ADxgjCmzNv8ZyLOO2QA85e15ReQOESkWkeLa2lpfq6MUR0+20dNrmJqRBIAjNYEqne9JqX4NKevJGNOAs8lo1VBPZF1JlACXuG1+BDhkjLnfrVy9MabDevgocGE/z/eIMabQGFNot9uHWh0VwVypsa4rCkeajeqG0zhbWZVSnnzJerJbzUOISAJwGbDflycXkRzrGERkPPAp4ID1+F+AVOAuj2Mcbg+vAT725VxK+coVKKZZgSIrNYHWzh6a2rtDWS2lRi1frigcwEarn2EHzj6KN0TkPhG5BkBEFonIMeAG4GER2Wcdex6wTUR2A5twZjrtFZEc4MfA+YArfdaVBvs9K2V2N/A9nNlUSvlNWV0raeNiGZ8YBzivKEAnB1SqP75kPe0BFnrZfo/b/R14yVoyxmwA5nvZfgyQfs73D8A/DFYvpYaroq6VvPTEvseO1ATAmSI7e1JKqKql1KilI7NVxCmva+1rdgLIsq4odNCdUt5poFARpa2zm+rG9r6ObICJyTaio0QH3SnVDw0UKqJU1LUBMNV+JlBERwmTUmyaIqtUPzRQqIjimRrr4ki1adOTUv3QQKEiSkW9M1C4d2YDONISqNbR2Up5pYFCRZSy2lYyU+JJjD874S8r1UZ1Y7sOulPKCw0UKqKU17Wc0+wEzqanzu5e6ls7vRylVGTTQKEiSnlda98cT+4caWfGUiilzqaBQkWMU62dnGrrOmsMhUuWNehOO7SVOpcGChUxyuu9ZzzBmUF31Zoiq9Q5NFCoiFFhpcbmeQkUExLjiI+J0nUplPJCA4WKGOV1rUQJ5E4Yd84+EXGOpdArCqXOoYFCRYyyulYmTxhHXIz3j70jVcdSKOWNBgoVMcprW732T7i4FjBSSp1NA4WKCMYYKuoHDhRZqQmcaO6gp1cH3SnlTgOFigg1zR20dfZ4TY11caTZ6Ok11DRr85NS7nxZCtUmIttFZLe18ty9XsosE5GdItItIte7bZ9ibd9lHXun274LRWSviBwWkQdERKztE0Rkg4gcsv4d768XqyJXWW3/GU8ufWMpdNCdUmfx5YqiA1hpjFkAFACrRGSxR5kjOJcsfd5jezWwxBhTAFwE3C0iWda+3wJfB2Zat1XW9ruBt40xM4G3rccqALaV1XPvn/fReLor1FUJuP5mjXWXleYKFNpPoZQ7X5ZCNUCL9TDWuhmPMhUAItLrsd194px4rMAkIg4gxRiz1Xr8NHAdsB64FlhhHfMU8A7wI59fkRrU7qMN/PytA7x3qA5wLtzzzRXTQ1yrwCqvayEuJqrvqsEbXTtbKe986qMQkWgR2QXUABuMMdt8PYGITBaRPcBR4KfGmCogGzjmVuyYtQ0g0xhTbd0/DmT6ei41sP3Hm7jj6WKu/c37lFQ28uMrz6Nwynhe3HGE3jHegVte18rU9ESiorwu1Q5Aii2WpPgYbXpSysOgVxQAxpgeoEBE0oBXRGSuMabEx2OPAvOtJqdXReQlXytnjDEi4vUbTETuAO4AyM3N9fUpI1J5XSu/3HCQP++pIikuhu9fls9tn5pKUnwM9uR47npxF1vL6lk6IyPUVQ2YsrpW8icmD1rOkWrTKwqlPPgUKFyMMQ0ishFnf4JPgcLt2CoRKQEuAd4Hctx25wCV1v0TIuIwxlRbTVQ1/TzfI8AjAIWFhWP75/AwVTac5oG/HuKlnceIi47izuXT+cayaaSNi+srs2ruJFJfj+X57UfGbKDo7unl6Mk2Lp8zadCyuoCRUucaNFCIiB3osoJEAnAZ8FNfnlxEcoB6Y8xpK3vpU8AvrSDQZHWKbwNuAX5lHfY6sAb4D+vf14b6oiJdTXM7D24s5fltRwC4ZckUvrliOhOTbeeUtcVG88ULcnhmawX1LR2kJ8UHu7oBV9lwmq4ew9T0/juyXbJSbXxU1RSEWikVPny5onAAT4lINM4+jT8YY94QkfuAYmPM6yKyCHgFGA9cLSL3GmPmAOcBv7CajwT4uTFmr/W83wKeBBJwdmKvt7b/B/AHEfka8Alwoz9eaCRoaOvkoU1lPLW5gs6eXm4szOG7K2f2ZfP0Z3XRZB5/v5yXd1by9WXTglTb4ClzZTzZBw8UjtQE6lo66OjuIT4mOtBVUyos+JL1tAdY6GX7PW73d3B2U5Jr+wZgfj/PWwzM9bK9Hrh0sHqpM5rbu3j8bxU8+l4ZLZ3dXLsgi7s+kz/gmAF3MzOTKZwynhe2H+H2S6ZiDWkZM8prB0+NdXFlPh1vbGeKD1cgSkWCIfVRqNHFGMOj75Xz4DuHOdXWxeVzMvn+ZbOYNWnwTltPq4ty+bs/7mZb+UkWT0sPQG1Dp7yulWRbDOmJcYOWzU47M+hOA4VSTjqFRxh766MT/Ou6j5mbncrr37mYh28uHFaQALhqvoMUWwwvbD/i51qGXkV9K9MyEn26UnKk6lgKpTxpoAhjfztUR2JcNI+vXcT8nLQRPZctNprPL8xmfclxTrV2Dn5AGCmrbfW5Gc5hDcjTzCelztBAEca2lNWzaOoEYqP989+4+qJcOrt7efnDysELh4n2rh6qGk/71D8BkBAXzfhxsTqNh1JuNFCEqZqmdg7XtLB0uv/6E2ZPSmFhbhovbD+Cc+aW8PdJfRvG+NaR7aILGCl1Ng0UYWpLWT0AS6f7d5Dc6kW5HK5pofiTU3593lApr3NOUzYtI8nnY7LSdElUpdxpoAhTW0rrSbHFcJ4jxa/P+7kFDpLix06ntmsMRV7Guetk90evKJQ6mwaKMLW5tJ7F09KJHmCSu+EYFxfDdQuzeHNPNY1t4T/9eEVdK/bkeJJtsT4f40iz0Xi6i9aO7gDWTKnwoYEiDB071caRk21+7Z9wt7ool47uXl758NjghUc516yxQ+EaS6Epsko5aaAIQ1tKnf0TS/zcP+EyJyuV+TmpvLD9aNh3apfXDbxOtjcOXekuIhhj+PX/HuJwTXOoqzLqaaAIQ1tK60lPjCM/0/cO2qFaXZTLgRPN7DzSELBzBFrj6S7qWjp9muPJnQ66iwyVDaf5+VsH+f32o6GuyqingSLMGGPYXFrPkunpAZ2T6eoFWSTGRfP7MO7UrvBh+VNvJqXaENErirGupNI5S/DBmpZBSioNFGGmvK6V403tLAlQ/4RLUnwM1xRk8+c9VTS1h2endkW9M1BMG2KgiI2Owp4Ur1cUY9y+qkYADp3QpqfBaKAIM4EaP+HN6qLJtHf18lqYjtQuq21FBHLTfU+NddEFjMa+kkpnoKhubKc5TH8MBYsGijCzubQeR6qNvGF8+Q3VvOxU5mSl8HyYdmqX17WSnZYwrHUlslJtVOqguzGtpKqpb0bhQ9r8NCANFGHEGMPWIPRPuIgIq4ty+bi6iT3HGgN+Pn8bTsaTiyM1geqG9rAMkGpwNU3t1DZ3cPWCLAAOn9BAMRANFGHk4IkW6ls7WRLE9SKuLcgiITY67EZqG2Mor2sdcv+ES1aajdNdPTSe1iaJsajE6p9YNXcS8TFRHNR+igENGihExCYi20Vkt4jsE5F7vZRZJiI7RaRbRK53214gIlus4/aIyJfc9r0nIrusW5WIvGptXyEijW777vE8X6TaXFoHEPCObHfJtliuXuDg9d1VYdWOW9vSQUtH97CvKLLSdCzFWFZS2YQIzM1OZbo9STOfBuHLFUUHsNIYswAoAFaJyGKPMkeAtcDzHtvbgFus9bNXAfeLSBqAMeYSY0yBMaYA2AK87Hbce659xpj7hvyqxqjNpfVMSR9HzvjA90+4W12US1tnD6/vrgrqeUeioq4NgKn24Y010bEUY1tJZSNTMxJJio8hPzOJw3pFMaBBA4VxcoXbWOtmPMpUWGtr93psP2iMOWTdrwJqALt7GRFJAVYCrw73RUSCnl7D1rL6oDY7uRRMTmP2pOSwGph0ZtbYEV5RaObTmLSvqom5WamAc834Ks18GpBPfRQiEi0iu3B+0W8wxmwb6olEpAiIA0o9dl0HvG2MaXLbtsRq6lovInP6eb47RKRYRIpra2uHWp2w81FVE83t3UFtdnIREb58US57KxvZGyad2mV1rcRFR/V94Q9VRlI8MVFCtWY+jTknWzupbDjN3GznzMszJzqvOjXzqX8+BQpjTI/VRJQDFInI3KGcREQcwDPArcaYXo/dq4EX3B7vBKZYTV2/op8rDWPMI8aYQmNMod1u91ZkTAlF/4S7awuyscVG8cKO8OjULq9tJTd93LBn142OEjJTbDqWYgxyjZ9wXVHkZzrXmdfMp/4NKevJGNMAbMTZ3+ATq2npTeDHxpitHvsygCJrv+scTa6mLmPMOiDWKhfRNpfWM2NiEhOTbSE5f2pCLFfNy+K1DyvDYvrtkaTGumSl6ViKsciV8TTHChSTJ4zTzKdB+JL1ZHd1QItIAnAZsN+XJxeROOAV4GljzEteilwPvGGMaXc7ZpJYgwSs5qoooN6X841VXT297Kg4GbBpxX315Ysm09rZwxt7Rnendk+v4ZOTbcPun3DJSkvQzuwxaF9lE7kTxpE6zrlGSXSUaObTIHy5onAAG0VkD7ADZx/FGyJyn4hcAyAii0TkGHAD8LCI7LOOvRFYBqx1S3ctcHvumzi72QmcwaNERHYDDwA3mQgf9bTnWANtnT0hDxQX5I4nPzOJ50d5p3ZVw2k6u3tHfEXhSE3geGM7vb0R/fEbc0qqGvv6J1w082lgMYMVsLKZFnrZfo/b/R04+y88yzwLPDvAc6/wsu3XwK8Hq1ck2Xy4HhG4aGpoA4WIcNOiXO574yP2VTX2XbqPNuV9y5+OvOmpq8dQ19oRsiY/5V+Np7v4pL6NGwsnn7V9ZmYyr+5yjhUaymqIkUJHZoeBLWX1nDcphfHWvDSh9IULsomLiRrVqbKuQDHSpifXAkbVOuhuzPioyplcOTf77B85mvk0MA0Uo1x7Vw/Fn5wKebOTS9q4OK6a5+DVDys53dkT6up4VV7XSmJcNPbk+BE9jw66G3v29XVkezY9aebTQDRQjHI7j5yis7s3ZGmx3qwuyqW5o3vUdmqX1bUy1Z444okTdRqPsaekshFHqo2MpLN/RGjm08A0UIxyW0rriY4SiqZOCHVV+izKG890e+KonSiwoq6VqRkjXyZ2/LhY4mOiqNIU2TGjpKrJa9+aK/NJm568i/hA0d41OptPXLaU1jMvO3VUdbC5ph/feaSB/cebBj8giDq6ezh2qm3EGU/gfJ1ZuoDRmNHW2U1pbcs5GU8u+ZlJutpdPyI6UGzcX8Pyn22ktHZ0/opo7ehm19GGUdXs5PKFC3KIix59ndpHT7bRa2Bqhn8mTsxKs1E1hvsoRms/UyB8XN2EMWdGZHvSOZ/6F9GBYro9ie4ew61P7KCupSPU1TnHjoqTdPeaUdOR7W5CYhyr5k7i5Z3HRtWXTVmtM+PJH01PcGYBo7HocE0LC//5LV764FioqxIUJZXeM55cXJlPh7X56RwRHShy08fx6JpCaprbuf2p4lH1hQfOtNjYaKFwyujpn3D31cVTaGrv5o5nikfNrzBXauzU9JE3PYFzSdSa5na6ezynKAt//7F+P+1dvTy8qTQiVvIrqWwkIymOzBTv2XCuzKdDmvl0jogOFAALc8dz/5cWsvtYA3e9+CE9o2gU7pbSehbmjichbuhrPgdD0dQJ/OcX57OltJ4bHtoyKtJIK+pbSU+M65ueYaQcaQn0GjjRPPquOEdiS2k9f/34BAWT0zhU08L7h0MzS87hmhY6u4MThF0d2f1lw2nmU/8iPlCAcznEf7zqfP6y7wT/vu7jUFcHcI4gLalsDMn6E0Nx46LJPHHrIo6dOs11v3m/L089VMpqRz4ZoLu+sRRjKPOpt9fwr+s+Ijstgae/VkRGUhxPbi4Pej0OnWjms7/cxBPvB/7c7V09HDrR3G9HNmjm00A0UFhuuziPtUvzePRv5Ty1uSLU1WF7+Ul6DaOyf8LTJTPt/PHOJQjCjQ9tYdPB0K0P4o9ZY925xlKMpVlkX91VSUllEz+4fBYptli+XJTL2/tr+KS+Naj1eGhTGb0G3t5fE/BzHTzRTHev6bcj20Uzn7zTQGEREX7yufP5zHmZ3Pvnffz1oxMhrc/m0jpssVEU5KaFtB6+Os+Rwqvfvpjc9ERue3IHL4Zg3YqWjm5qmjtGPMeTuzOjs8dGh3Z7Vw8/+8sB5uekcs2CLMDZ1xQtwlObPwlaPaoaTvParkqS4mP44JNTNAW4j2uwjmwXzXzyTgOFm+go4YHVBczNTuW7L3zInmMNIavLltJ6CqdMID5mdPZPeDMp1cYfvrGYi2dk8KM/7eXnfzkQ1E7SCj/N8eQu2RZLcnzMmGl6euxv5VQ3tvN/rzyPKGtRp4kpNq6a7+CPxUdpCdJaI4++52xu+pfr5tLTa9h8uC6g5yupaiTFFkPO+IFXPNTMJ+80UHgYFxfDo2sKmZAYx21PFnPsVFvQ61Df0sH+482jcvzEYJJtsTy2ppCbFk3m1xsPc9eLu+joDk42WZkr48nuv0ABzuansbB2dl1LB799p5TLzs9ksUff19qleTR3dPOnIKTKNrR18vsdR7hmQRZXzXeQHB/DOwcC21y5r7KRudn9d2S7aOaTdxoovJiYbOOp2xbR2d3DrU/soPF0cC9Dt5adBMKjf8Kb2Ogo/v0L8/j7z+bz2q4qbnlsO41tgX8PXVcUeX5KjXVxpNlGRUbXSN3/14O0d/XwD1fMPmffwtzxFExO46nNFQFff+PpLZ/Q1tnDN5ZPJzY6iotnZLDpYG3Arj67enr5+HjzoM1OcCbz6VCN9lO400DRjxkTk3no5gupqG/lzmc+CFoKHzj7J5LiY5jnwwd7tBIRvrNyJvd/qYCdR07xxYc2c/RkYK/OyutayU5LwBbr3+a6sTDo7nBNMy9sP8pXLsplmt37YMRbL86jrK6Vdw8F7tf96c4entxcwaWzJzJrkvPX+4pZdqob2zkYoF/xrhRczxljvelb7U6vKM7iy1KoNhHZLiK7RWSfiNzrpcwyEdkpIt0icr3b9gIR2WIdt0dEvuS270kRKfdc+U6cHhCRw9YxF/jrxQ7V0ukZ/PSL89lSVs/dL+8JWnv7ltJ6iqZOICY6/OP4dQuzefq2i6hpaufzD24OaL9PWV0reX6ausNdVqqN+tbOUT8v2ED+fd1+xsVG871LZ/Zb5oq5DiYmx/PE+xUBq8cfio9ysrWTb66Y3rdt+Sw7AJsOBib7qaTSmbLtyxUFaOaTN758E3UAK40xC4ACYJWILPYocwRYCzzvsb0NuMUYMwdYBdzvWn/b8gNjTIF122VtuwKYad3uAH47lBfkb1+4IIfvX5bPyzsruf+vhwJ+vuON7ZTVtYZts5M3S6an86dvLiU+JoovPbw1IBllxhjKa1v8mhrr4rBSZI+HaT/F5sN1vL2/hm+vnEF6Uv9rdMTFRPHVxVPYdLA2IPOfdfX08si7ZRROGU9h3pnZBhypCczKTA5YP8W+qiYS46J9Hq2vmU/nGjRQGCfXpybWuhmPMhXWkqm9HtsPGmMOWfergBrAPsgprwWets67FUgTEYdPryZAvrtyBtdfmMN/v30o4PPibClzZn94djaGu5mZybzy7aXMmJjEHc8U88yWCr8+/8nWTprau/02x5O7LCtFNhynG3cOrvuY7LQE1i7NG7T86qJc4qKjeDoAY4ne3FNNZcNp7lw+/Zx9y2fZ2VFxktYAZF2VVDZyflZKX5bXYDTz6Vw+tW2ISLSI7ML5Rb/BGLNtqCcSkSIgDih12/yvVvPSL0XE9VMnG3CfkvSYtS1kRIR/+/w8Lp6Rzt1/2sP7AUzl23y4ntSEWM53DN6eGm4mJtt48RuL+fSsifzktX3827qP/dZxWlHv/9RYF9cVRThmPr3yYSX7qpr44apZPvXd2JPj+dwCBy99cMyvYxuMMTy0qZT8zCRWzp54zv4V+Xa6egybS/07lUhPr+Gjau9rUPRHM5/O5VOgMMb0GGMKgBygSETmDuUk1hXBM8CtxhjXVcc/ALOBRcAE4EdDfM47RKRYRIprawM/EjguJorffvVCptkTufPZDwI2H8yWsnqWTEv3+ddPuBkXF8PDN1/IzYun8Mi7ZXznhZ1+SZ89M2tsAAJFmE7jcbrTObhuQU4qV8/P8vm4W5dOpbWzhz8W++/q+Z0Dtew/3sw3lk33+tm+MG884+Ki/d5PUV7XSltnj8/9E6CZT94MqbfUGNMAbMTZ3+ATEUkB3gR+bDUluZ6r2mpe6gCeAIqsXZXAZLenyLG2edblEWNMoTGm0G4frDXLP1JssTxxaxG22GhufWIHNU3+/YV59GQbx06dDsvxE0MREx3FfdfO4f9eOZt1e4/z93/cM+Iri/K6VmKiZNABVcNhi40mPTEu7K4oHvtbGceb2vnxVecP6YfHvJxUCqeM56nNFX6bJPO3m0rJSrVxTYH3gBUfE83S6Rm8c8C/abJnOrJ9v0LXzKdz+ZL1ZHd1QItIAnAZsN+XJxeROOAVnH0OL3nsc1j/CnAdUGLteh24xcp+Wgw0GmOqfXw9AZedlsATaxdxqq2T257a4dc21c2lziatsdSR3R8R4Y5l0/nRqtn8eXcV//mXAyN6vvK6VnInjAtYpli4jaWobXYOrrt8TuawltFde3EeR062sdEP8zB98Mkptpef5PZLphE7wP/P8ll2jp063Tdw0h9KKhuJj4liRj8pwf2ZqZlPZ/Hlr8oBbBSRPcAOnH0Ub4jIfSJyDYCILBKRY8ANwMMiss869kZgGbDWMw0WeE5E9gJ7gQzgX6zt64Ay4DDwO+BbI3+Z/jU3O5Vff3khH1U18b0XPqTLT2sVbC6tJyMpnhkT/d8hO1rduXwaX7kol4c2lfLs1uHPNeTvyQA9hdtYil/+9SAd3b38aNW5g+t8cfmcSUxKsfGkHzq1H9pUStq4WG4qmjxguRX5zpYBf2Y/lVQ1MtuRMuQfEPma+XQWX7Ke9hhjFhpj5htj5hpj7rO232OMed26v8MYk2OMSTTGpFvpsBhjnjXGxLqlwPalwRpjVhpj5lnP+VVXZpXVHPVtY8x0a39x4F7+8K2cncm9187l7f01rHl85COPjTFsKa1n6fT0QacZGEtEhHuvmcPK2RO557US3v546Kmzvb0m4IEiKzV8lkQ9dKKZ328/wlcXT+l3cN1gYqOjuHnJFP52uG5Ev6wP1zSz4aMTrFmSx7i4mAHLTp4wjmn2RL/NPtzba9hX2cRcHwbaedLMp7OF/4iuELp58RR+ccMCdlSc5PMPvt+3utpwlNa2UtPcMeb7J7yJiY7iV6sXcn5WCt95fuiTMR5vaqeju9fvczy5c6Ql0NzeHRa/MP9t3cckxscMOLjOF6uLcomLiRrRVcVDm8qwxUaxxofUXIAV+RPZWlbvl9Umj55qo7mje0gd2S4zNfPpLBooRuiLF+bw/NcX03C6i+t+8z5bhpnetyWC+ie8SYyP4fG1i/omYxzKdB99y58GtOkpPKYb/9uhOjYeqOU7n57BhMS4ET3XhMQ4rivI4uWdlcO6YnZNJX7Tolyf67J8lp3O7l62lo88TbZvavEhpMa65Grm01k0UPjBorwJvPqti7Enx3PzY9v4/fahr8Wwpaye7LQEcif4fwqKcDEx2caTt1qTMT65w+cvp7K+6cUD17fjWsBoNA+667EG1+WMT/D5F/xg1i6dyumuHl4sHvpn+rG/ldNr4PZLpvp8zEVTJ2CLjWKTH/opSqoaiYkS8icN/XOhmU9n00DhJ7np43j5W0tZMj2du1/ey7+++ZHPqYW9vc7+icXTIqt/wpuZmck8ckshR+rbuOOZYp/GWJTXtpIQG01mSv9zTWYJAAAdy0lEQVTTU4xUOFxRvLzzGB9XN/HDVbP9NjHi+VkpXDR1Ak9t/mRIqbINbZ28sN05lXjOeN9//Nhio1k8Ld0v/RQllY3kZyYPe02XmZlJ2kdh0UDhRym2WJ5Yu4hblkzhd++V841nPvApfXb/8WZOtXVFbLOTp8XT0vnZDfPZVn6SH/gwxqK8roW8jMSABtnMFBtRMnoH3Z3u7OHnbx2gYHIaV8/374w3t16cR2XDaTYMYY6uM1OJTxvy+Vbk2ymvax3R0qzGGPZVNQ1p/ISn/MxkKhtOB20xp9FMA4WfOQeTzeXea+bwv/tPcP1DWwZtrthS5myPjcSO7P5cW5DNDy6fxeu7q/j5WwOPsaiobwvI1B3uYqOjmJhsG7WD7n73Xhknmjr48VXn+T1gfua8TLLTEnhyc7lP5V1Tia+cPZHZk4b+Rb18lnOKj5FcVVQ3tnOytXNYHdkurswnHU+hgSJg1izN4/G1izh2so1rf/M+u472n8mzpbSOvPRxfe3gyulbK6azuiiXB98p5blt3sdYdPX0cuRkW0A7sl1G66C7muZ2HtpUyqo5k1iUN/TBdYOJiY7iliVT2Fp2ko+rmwYt/8cPnFOJe5v8zxdTMxKZkj5uRP0UQ51a3Ju+zCdtftJAEUgrZk3kT99yTa+9hTf2VJ1Tprunl21lJ1kyPSMENRzdRIR/vnYOn55l5yevlngdJXz0ZBs9vSYogSJrlA66++WGg3R293K3l5Xr/OVLiyZji43iyUHWqui2phK/cMp4FuWNH/b5lufb2VxaP+w1QEqqmogSOG8YVzQufZlPekWhgSLQ8jOTee3bFzMvO5XvPP8hD7x96Ky5bEqqmmju6Nb+iX7EREfx6y9fwPlZKXz7+Z19vxRdygO0TrY3jlQblQ2ng7aAlS8OHG/mxR1HuXnJFPICGCzTxsXx+YU5vLqrkpOtnf2We3NvNcdOOacSH0kT2IpZdk539VBccWpYx++rbGTGxCQS4obfqa+ZT2dooAiC9KR4nvv6RXxhYTb/teEgd724q++XkmvcxVhbf8KfEuNjeHzNIsaPi+PWJ3dw7NSZMRZ9gcLP62R740hLoKO7l1NBWP/bV/++/mOS4mP43sqRDa7zxa0X59HR3cvvd3hPlTXG8Nt3Spk5MYlLvUwlPhSLp6UTFx3FOweGN9dUSVXjsMZPeNLMJycNFEESHxPNL25cwA8un8Vru6r48u+2UtvcwebSOvIzk7AnBy61cyyYmOIcY9He1cPaJ86MsSirayVtXCzjRzi4zBejbQGj57cd4Z0DtXx35cygvP78zGQunpHOM1s+8Tq/2TsHranEl3ufSnwoxsXFcNG0CcPq0K5pbudEUwdz/LDmvGY+OWmgCCIR4dufnsGDX7mAj6qbuO4377Oj4iRLtX/CJzMzk3n45gv5pL6VbzzrHGNREeA5nty5kg1Gw1iKbWX13PNaCStm2bntU74PaBuptUunUt3Yzlv7zk2VfeidUhypNq5Z4PvaFwNZnm/nUE0LlUMMzPuqXCOyR774l2Y+OWmgCIEr5zn4wzeW0NXTS3tXrzY7DcHS6Rn87PoFbC07yY9e2kNZbfAChSPNNegutFcUR0+28c3ndjIlfRwPrF5IdBAXuVo5eyKTJ5ybKrvzyCm2WVOJx8X452tlxSznbLJDzX7aZ/Vjne+PQKGZT4AGipCZn5PGa9+5mH+86jyvS0Oq/l230DnG4tVdVRxvag/4GAqXjMR4YqOFqhBmPrV2dPP1p4vp7unl0TWLSLHFBvX80VHCmiV57Kg4dVZiwUPvlJKaEMtNiwaeSnwoptuTyE5LGHI/RUllE1MzEkn2w3uTO2EccZr5pIEilBypCX79BRZJnGMsnF9Kw51Ke6iiooRJqaEbS9Hba/j+H3Zx8EQzv/nKBUG7kvJ0Q+FkxsVF84SVKnu4ppm3PjrBmqV5JMYPPJX4UIgIy2c502Q7u31f86WkqpE5friagDOZT3pFoVQYco6xmMuDX7mAS88L3hWZIzUhZJ3Z9799iL/sO8E/XnU+l8wMzvK/3qQmxPLFC3L48+4q6lo6eNiaSnytnyYidLc8305LRzcffOJbmmxDWyfHTp0e0UA7T/mZSRE/3bgvS6HaRGS7iOwWkX0icq+XMstEZKeIdIvI9W7bC0Rki3XcHhH5ktu+50TkgIiUiMjjIhJrbV8hIo1uK+Ld468Xq8aWmOgorpznGPakb8ORlWoLSdPTm3uqeeDtQ9xYmMOtF+cF/fye1izNo7Onl//acJBXd1XypcLJI57W3Jul09OJiRKfs5/OdGT7M1Bo5pMvVxQdwEpjzAKgAFhlrWXt7giwFnjeY3sbcIu14t0q4H7X+tvAc8BsYB6QANzudtx7bivi3TeUF6RUIDnSEjjR1D6kmVRHqqSykb/74y4Kp4znn6+bOypmGJ4xMYll+Xae33bEmkp86JP/+SLZFkth3nif+ylc/Sb+anoC+pYmjuTxFL4shWpcy5QCsdbNeJSpMMbsAXo9th80xhyy7lcBNYDderzOem4DbAdyRvpilAq0rFQb3b2GupaOoJyvtrmDO54uZsK4OH771QuDevU0mFutpqar5zuYHMB1VJbnT2T/8WZONA1+JVdS1UR2WoJfx5XkW5lPByO4Q9unPgoRiRaRXTi/6DcYY7YN9UQiUgTEAaUe22OBm4H/cdu8xGrqWi8ic4Z6LqUCJZgLGHV093Dnsx9wsq2TR24pHHWDMpfn2/nJ587n7ivOC+h5+tJkfWh+2lfZOKKpxb3RzCcfA4UxpscYU4DzV3+RiMwdyklExAE8A9xqjPFMX3gQeNcY8571eCcwxWrq+hXwaj/PeYeIFItIcW2tfxZjV2owjtTgDLozxvCTV0v44JNT/OKGAr92zvpLVJTwtU9NZZI1Yj1QZk9KJjMlftDxFM3tXZTVtfq1fwI08wmGmPVkjGkANuLsb/CJiKQAbwI/NsZs9dj3/3A2RX3f7RxNrqYuY8w6IFZEzhm6bIx5xBhTaIwptNtDlwGiIktWWnCm8XhycwV/KD7G91bO4Co/L0QUbkSE5fl23jtUS7eXqUNcPq52/uIPRFCN9MwnX7Ke7K4OaBFJAC4D9vvy5CISB7wCPG2Meclj3+3A5cBq96sMEZkkVm+d1VwVBYx8pXWl/CA1IZaE2OiAZj69d6iWf37jIy6fk8ldn8kP2HnCyfL8iTS1dw+4rsteV0e2n5ueQDOffLmicAAbRWQPsANnH8UbInKfiFwDICKLROQYcAPwsIjss469EVgGrHVLdy2w9j0EZAJbPNJgrwdKRGQ38ABwkxlN8zqriCYiAV3AqLyulW8/t5P8zGT+68aCEU+uN1Z8amYG0YOkye6rbGRicjwTk/3fFBbpmU+DDqO0spkWetl+j9v9HXjJWjLGPAs828/zej23MebXwK8Hq5dSoZKVmhCQJVGb2ru4/akdxERH8btbCv06yjncpSbEsnByGu8cqOXvPjvLa5mSqsaA9eW4Zz4VTE4bpPTYoyOzlRoiR6qNaj/3UfT0Gv7PCx/ySX0bD37lgoCmm4arFbPs7K1s9JqafLqzh8M1LX6ZMdYbV+ZTpF5RaKBQaogcaQnUtnQMaf6hwfznX/az8UAt9147R2cT7sfyfOdULe96aX76+HgTvQa/rEHhzZnV7iIzRVYDhVJDlJ1mwxh8GgDmi5d3HuPhTWXcsmQKX7loil+ecyyak5VCRlKc134K19TigUwjjuTMJw0USg2RP8dSfHjkFHe/vJcl09L5yefOH/HzjWVRUcKymXbePVh7zhQqJZVNjB8X27cKYSBEcuaTBgqlhijLTwsYHTvVxjee+YDMlHge/MoFxEbrn+Ngls+yc6qtqy8V1sXVkR3IebAiOfNJP5lKDZHrimKoS3S6q2lu56uPbqO9q4fH1iwKyprXY8ElM+2IcNYkgR3dPRw80cwcP4/I9hTJcz5poFBqiBLjY0ixxVA9zEF3DW2d3PLYdmqaO3jytqK+LyA1uAmJcSzISTurn+LQiRa6eozf53jyFMmZTxoolBqGrLSEYTU9tXZ0s/aJHZTVtvK7Wwq5IHd8AGo3ti3Pt7PraAOnWjuBM1OL+3uOJ0+RnPmkgUKpYXAMYwGj9q4evv50MXsrG/n1lxdy8YxzpjBTPlgxy44x8N7hOsDZP5EcH0NuEMaeRGrmkwYKpYbBMcQriq6eXr77wodsLq3n5zfM57NzJgWwdmPb/Jw0xo+L7eunKKls4vyslKBMdzJzYlJEZj5poFBqGLLTEjjV1sXpzp5By/b2Gn740h42fHSC+66dw+cX6hpdIxEdJVwy0867B+vo6unl4+qmoE3DPtPqT4q0fgoNFEoNgyPVtxRZYwz/7/V9vPJhJT+4fBa3LMkLQu3GvuX5dupaOvjz7io6unsD3pHtEqmZTxoolBoGV4rsYP0UP3/rAM9s/YRvLJvGt1ZMD0bVIsKyfOcaNA++41wwM9Ad2S6RmvmkgUKpYehbwGiAK4qHNpXym42lrC7K5e4rZgd0MFiksSfHMzc7hcM1Ldhio5hmTwrKeSM180kDhVLD4Fr+s7+xFM9t+4T/WL+fqxdk8S/XzdUgEQArrEkCz3ekEB3EdTsiMfNJA4VSwxAfE01GUpzXPorXdlXyj6+WsHL2RP7rxgVB/RKLJMtnOZuf5gV5PXFX5lNrBGU+aaBQapgcXhYw+utHJ/j+H3ZTlDdB528KsIWT07i2IItrCrKDel5X5tOhCOqn8GXNbJuIbBeR3SKyT0Tu9VJmmYjsFJFuEbnebXuBiGyxjtsjIl9y2zdVRLaJyGERedFaXxsRibceH7b25/nnpSrlX54LGG0predbz+9kTlYKj64pxBYbHcLajX0x0VH8900LuXBKcEe3uzKfDkVQP4UvP3c6gJXGmAVAAbBKRBZ7lDkCrAWe99jeBtxijJkDrALuFxHXOoI/BX5pjJkBnAK+Zm3/GnDK2v5Lq5xSo45zGg/nFcWuow3c/tQOpkwYx1O3FpFsiw1x7VSguDKf9IrCjXFyvSOx1s14lKmw1tbu9dh+0BhzyLpfBdQAdnH27K0EXrKKPgVcZ92/1nqMtf9S0Z5ANQplpdlo6eimuOIka5/YzoSkOJ69/SKdCXaMi8TMJ58aUEUkWkR24fyi32CM2TbUE4lIERAHlALpQIMxxtUbdAxwNTRmA0cBrP2NVnnP57tDRIpFpLi29twVr5QKNNdYilse305cdBTPfW0xmSmBWzhHjR6RlvnkU6AwxvQYYwqAHKBIROYO5SQi4gCeAW41xvhloWFjzCPGmEJjTKHdbvfHUyo1JK6xFPExUTx7+0Xkpgd+Ujo1OkRa5tOQUjKMMQ3ARpz9DT4RkRTgTeDHxpit1uZ6IE1EYqzHOUCldb8SmGwdGwOkWuWVGlXOd6RybUEWT992ka4pEWEiLfPJl6wnu6sDWkQSgMuA/b48uZXJ9ArwtDHG1R+BMcbgDDiuDKk1wGvW/detx1j7/9cqr9SokhAXzX/ftJB5OcHN41ehN9NaFjVSMp98uaJwABtFZA+wA2cfxRsicp+IXAMgIotE5BhwA/CwiOyzjr0RWAasFZFd1q3A2vcj4PsichhnH8Rj1vbHgHRr+/eBu/3wOpVSym+mpCdGVOZTzGAFrGymhV623+N2fwfO5iPPMs8Cz/bzvGVAkZft7TgDjlJKjUquzCe9olBKKdWvmROTOBghmU8aKJRSahjyMyMn80kDhVJKDUMkrXangUIppYbBlfkUCSO0NVAopdQwTElPJDk+hh0VJ0NdlYDTQKGUUsMQHSVcet5E3vroBF09fplwYtTSQKGUUsN0xTwHDW1dbCsb21cVGiiUUmqYlufbSYyL5s291aGuSkBpoFBKqWGyxUaz8rxM3tp3nO4x3PykgUIppUbgyrmTqG/tZPsY7tTWQKGUUiOwYtZEEmKjWTeGm580UCil1AgkxEWzcvZE/qfkBD29Y3Oiaw0USik1QlfMm0RdSwfFY7T5SQOFUkqN0KdnTSQ+Jor1JcdDXZWA0EChlFIjlBgfw6dnTWR9STW9Y7D5SQOFUkr5wRXzJnGiqYOdR06Fuip+58tSqDYR2S4iu0Vkn4jc66XMMhHZKSLdInK9x77/EZEGEXnDY/t7bqveVYnIq9b2FSLS6LbvHpRSapRbOXsicTFRrNs79pqffLmi6ABWGmMWAAXAKhFZ7FHmCLAWeN7L8T8DbvbcaIy5xBhTYIwpALYAL7vtfs+1zxhznw91VEqpkEq2xbJspn1MNj8NGiiMk2vC9VjrZjzKVFhLpp4zNNEY8zbQ7zy8IpICrAReHUK9lVJq1Llq/iSqG9vZdawh1FXxK5/6KEQkWkR2ATXABmPMNj/W4TrgbWNMk9u2JVZT13oRmdNPne4QkWIRKa6trfVjdZRSanguPS+T2Ghh/RgbfOdToDDG9FhNRDlAkYjM9WMdVgMvuD3eCUyxmrp+RT9XGsaYR4wxhcaYQrvd7sfqKKXU8KTYYrlkpp11e49jzNhpfhpS1pMxpgHYCKzyx8lFJAMoAt50O0eTq6nLGLMOiLXKKaXUqHflPAeVDafZc6wx1FXxG1+ynuwikmbdTwAuA/b76fzXA28YY9rdzjdJRMS6X2TVsd5P51NKqYC67LxMYqKEdSVjp/nJlysKB7BRRPYAO3D2UbwhIveJyDUAIrJIRI4BNwAPi8g+18Ei8h7wR+BSETkmIpe7PfdNnN3sBM7gUSIiu4EHgJvMWLqGU0qNaanjYrl4Rgbrx1Dzk4yFF1JYWGiKi4tDXQ2llALgxR1H+NGf9vLGdz/F3OzUUFenXyLygTGmcLByOjJbKaX87LPnTyI6SsbM1OMaKJRSys/GJ8axdHo66/ZWj4nmJw0USikVAFfMdVBR38b+4/2ONw4bGiiUUioALp+TSZQwJpqfNFAopVQApCfFs3haOm+OgeYnDRRKKRUgV8xzUFbbyqGalsELj2IaKJRSKkAun5OJCLy5J7ybnzRQKKVUgExMtlGUN4H1YT5KWwOFUkoF0JXzHBw80cLhmvDNftJAoZRSAbRq7iREYH0Yr3yngUIppQIoM8VG4ZTxvBnGabIaKJRSKsCumOtg//FmymrDM/tJA4VSSgXYqrmTAFhfEp7NTxoolFIqwLLSEliYmxa22U8aKJRSKgiumuegpLKJI/Vtoa7KkGmgUEqpIHA1P4Xjyne+LIVqE5HtIrJbRPaJyL1eyiwTkZ0i0i0i13vs+x8RaRCRNzy2Pyki5SKyy7oVWNtFRB4QkcMiskdELhjpi1RKqVDLGT+OBTmprA/D7Cdfrig6gJXGmAVAAbBKRBZ7lDkCrAWe93L8z4Cb+3nuHxhjCqzbLmvbFcBM63YH8Fsf6qiUUqPelfMc7D7WyNGT4dX8NGigME6unK5Y62Y8ylQYY/YAvV6OfxsYypDEa4GnrfNuBdJExDGE45VSalS6Yq7zq+x/wiz7yac+ChGJFpFdQA2wwRizzU/n/1ereemXIhJvbcsGjrqVOWZtU0qpsJabPo652Slh10/hU6AwxvQYYwqAHKBIROb64dz/AMwGFgETgB8N5WARuUNEikWkuLa21g/VUUqpwLtiroMPjzRQ1XA61FXx2ZCynowxDcBGYNVIT2yMqbaalzqAJ4Aia1clMNmtaI61zfP4R4wxhcaYQrvdPtLqKKVUUFw5z9n8FE6D73zJerKLSJp1PwG4DNg/0hO7+h1ERIDrgBJr1+vALVb202Kg0RgTXtdpSinVj6kZiZznSBlx9lNXTy/by09yOAiLIsX4UMYBPCUi0TgDyx+MMW+IyH1AsTHmdRFZBLwCjAeuFpF7jTFzAETkPZxNTEkicgz4mjHmL8BzImIHBNgF3Gmdbx1wJXAYaANu9deLVUqp0eDKuZP4xYaDHG9sZ1Kqzefjjp5s491DtWw6UMuW0nqaO7pZuzSPf7pmTgBrCxLua7kCFBYWmuLi4lBXQymlfFJa28Klv9jEP119PmsvntpvubbObraW1fPuwTrePVhLWV0rANlpCSzLz2DZTDtLZ2SQmhA7rHqIyAfGmMLByvlyRaGUUsqPptuTmJWZzLqS42cFCmMM+483s+lgLe8erKW44hSdPb3YYqNYPC2dry6ewrJ8O9PtiThb7YNDA4VSSoXAFfMm8d9vH+LA8Wb2H2/i3YN1vHeolprmDgBmZSazZqkzMCzKm4AtNjpkddVAoZRSIXDlPAf3//UQl9//LgCpCbFcMjODZfl2ls20D6nvItA0UCilVAjkZyZz12dmIgjL8jOYn5NGdFTwmpOGQgOFUkqFyF2fyQ91FXyi04wrpZQakAYKpZRSA9JAoZRSakAaKJRSSg1IA4VSSqkBaaBQSik1IA0USimlBqSBQiml1IDGxOyxIlILfDLMwzOAOj9Wx99Ge/1g9NdR6zcyWr+RGc31m2KMGXTltzERKEZCRIp9mWY3VEZ7/WD011HrNzJav5EZ7fXzhTY9KaWUGpAGCqWUUgPSQAGPhLoCgxjt9YPRX0et38ho/UZmtNdvUBHfR6GUUmpgekWhlFJqQBETKERklYgcEJHDInK3l/3xIvKitX+biOQFsW6TRWSjiHwkIvtE5P94KbNCRBpFZJd1uydY9bPOXyEie61zF3vZLyLygPX+7RGRC4JYt1lu78suEWkSkbs8ygT9/RORx0WkRkRK3LZNEJENInLI+nd8P8euscocEpE1Qazfz0Rkv/V/+IqIpPVz7ICfhwDW759EpNLt//HKfo4d8O89gPV70a1uFSKyq59jA/7++ZUxZszfgGigFJgGxAG7gfM9ynwLeMi6fxPwYhDr5wAusO4nAwe91G8F8EYI38MKIGOA/VcC6wEBFgPbQvh/fRxnfnhI3z9gGXABUOK27T+Bu637dwM/9XLcBKDM+ne8dX98kOr3WSDGuv9Tb/Xz5fMQwPr9E/D3PnwGBvx7D1T9PPb/ArgnVO+fP2+RckVRBBw2xpQZYzqB3wPXepS5FnjKuv8ScKmIBGVdQmNMtTFmp3W/GfgYyA7Guf3oWuBp47QVSBMRRwjqcSlQaowZ7gBMvzHGvAuc9Njs/jl7CrjOy6GXAxuMMSeNMaeADcCqYNTPGPOWMabbergVyPH3eX3Vz/vnC1/+3kdsoPpZ3x03Ai/4+7yhECmBIhs46vb4GOd+EfeVsf5QGoH0oNTOjdXktRDY5mX3EhHZLSLrRWROUCsGBnhLRD4QkTu87PflPQ6Gm+j/jzOU759LpjGm2rp/HMj0Uma0vJe34bxK9Gawz0MgfcdqGnu8n6a70fD+XQKcMMYc6md/KN+/IYuUQBEWRCQJ+BNwlzGmyWP3TpzNKQuAXwGvBrl6nzLGXABcAXxbRJYF+fyDEpE44Brgj152h/r9O4dxtkGMyrRDEfkx0A0810+RUH0efgtMBwqAapzNO6PRaga+mhj1f0/uIiVQVAKT3R7nWNu8lhGRGCAVqA9K7ZznjMUZJJ4zxrzsud8Y02SMabHurwNiRSQjWPUzxlRa/9YAr+C8vHfny3scaFcAO40xJzx3hPr9c3PC1SRn/VvjpUxI30sRWQt8DviKFczO4cPnISCMMSeMMT3GmF7gd/2cN9TvXwzwBeDF/sqE6v0brkgJFDuAmSIy1frVeRPwukeZ1wFXdsn1wP/290fib1Z75mPAx8aY/+qnzCRXn4mIFOH8vwtKIBORRBFJdt3H2eFZ4lHsdeAWK/tpMdDo1sQSLP3+igvl++fB/XO2BnjNS5m/AJ8VkfFW08pnrW0BJyKrgB8C1xhj2vop48vnIVD1c+/3+nw/5/Xl7z2QPgPsN8Yc87YzlO/fsIW6Nz1YN5xZOQdxZkP82Np2H84/CAAbziaLw8B2YFoQ6/YpnE0Qe4Bd1u1K4E7gTqvMd4B9ODM4tgJLg1i/adZ5d1t1cL1/7vUT4DfW+7sXKAzy/28izi/+VLdtIX3/cAataqALZzv513D2e70NHAL+CkywyhYCj7ode5v1WTwM3BrE+h3G2b7v+hy6MgGzgHUDfR6CVL9nrM/XHpxf/g7P+lmPz/l7D0b9rO1Puj53bmWD/v7586Yjs5VSSg0oUpqelFJKDZMGCqWUUgPSQKGUUmpAGiiUUkoNSAOFUkqpAWmgUEopNSANFEoppQakgUIppdSA/j/sVNaP1wfFcQAAAABJRU5ErkJggg==\n"},"metadata":{}}]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.load_weights('weights.best.hdf5')\ntest_data['target'] = model.predict(test_data_dummies)\nprint (test_data[['card_id','target']].head(10))\nsubmission_file = test_data[['card_id', 'target']]\n# print (submission_file.head(20))\n\nsubmission_file.to_csv('submission.csv', index=False)","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.4"}},"nbformat":4,"nbformat_minor":1}