{"cells":[{"metadata":{"trusted":false},"cell_type":"code","source":"#loading need libraries\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom scipy import stats\nfrom sklearn.preprocessing import StandardScaler","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Process Data: Categorize inputs, remove unuseful data, fill missing values, encoding some string values...\ndef process_data(train):\n\n\tcategories = ['currency', 'property_type', 'place_name', 'state_name']\n\tfor cat in categories:\n\t    train[cat] = pd.Categorical(train[cat], categories=train[cat].unique()).codes\n\n\t#Correlation between train attributes\n\n\t#Separate variable into new dataframe from original dataframe which has only numerical values\n\ttrain_corr = train.select_dtypes(include=[np.number])\n\tdel train_corr['id']\n\tdel train_corr['geonames_id']\n\n\ttrain = train_corr\n\n\ttrain['floor'] = train['floor'].fillna('None') #high missing ratio\n\ttrain['surface_total_in_m2'] = train['surface_total_in_m2'].fillna('None')\n\ttrain['expenses'] = train['expenses'].fillna('None')\n\ttrain['lon'] = train.groupby('place_name')['lon'].transform\n\t(\n\t    lambda x: x.fillna(x.median()))\n\ttrain['lat'] = train.groupby('place_name')['lat'].transform\n\t(\n\t    lambda x: x.fillna(x.median()))\n\ttrain['rooms'] = train['rooms'].fillna(train['rooms'].median())\n\ttrain['surface_covered_in_m2'] = train['surface_covered_in_m2'].fillna(train['surface_covered_in_m2'].median())\n\n\tfrom sklearn.preprocessing import LabelEncoder\n\tcols = ['property_type', 'place_name', 'state_name', 'lat', 'lon', 'currency', 'surface_total_in_m2', \n\t        'surface_covered_in_m2', 'floor', 'rooms', 'expenses']\n\tfor c in cols:\n\t    lbl = LabelEncoder() \n\t    lbl.fit(list(train[c].values)) \n\t    train[c] = lbl.transform(list(train[c].values))\n\treturn train","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"def transform_outliers(train):\n\tcols = ['floor', 'expenses','surface_covered_in_m2']#, 'surface_total_in_m2']\n\tfor col in cols:\n\t    q = train[col].quantile(0.99)\n\t    train.loc[train[col] > q, col] = q\n\treturn train","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"def scale_data(train):\n\tscaler = StandardScaler()\n\ttrain = scaler.fit_transform(train)\n\treturn pd.DataFrame(train), scaler","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Read data and prepare \ntrain = pd.read_csv('features-training.csv')\ntest = pd.read_csv('target-training.csv')\n\ntest['price'] = np.log1p(test['price'])\ntrain = process_data(train)\ntrain = transform_outliers(train)\n\ntrain, scaler = scale_data(train)\n\n\ntrain = pd.concat([train,test['price']], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"y = train['price']\ndel train['price']\nX = train.values\ny = y.values","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Import Keras \nfrom keras.layers import Input, Dense, BatchNormalization\nfrom keras.models import Model, Sequential\nfrom keras.layers import LeakyReLU\nfrom keras.optimizers import Adam\nfrom keras import backend as K\nfrom keras.utils.vis_utils import plot_model\nfrom keras.callbacks import LearningRateScheduler, TensorBoard\nfrom sklearn.metrics import mean_squared_error","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Hyperparameters\nfilename = 'house_prediction'\nACTIVATION = 'relu'\nEPOCHS = 2\nBATCH_SIZE = 128\nLEARNING_RATE= 0.01\nLOSS_FUNCTION = 'mean_squared_error'\nBETA_1 = 0.9\nBETA_2 = 0.999\nEPSILON = 1e-08\nEPOCHS_DROP = 20\nDROP = 0.8","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Build Neural Network\nmodel =  Sequential()\nmodel.add(Dense(128,  input_dim=13,  activation = ACTIVATION))\nmodel.add(Dense(128, activation = ACTIVATION))\nmodel.add(Dense(64,  activation = ACTIVATION))\nmodel.add(Dense(1))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Define loss metric\ndef root_mean_squared_error(y_true, y_pred):\n    return K.sqrt(K.mean(K.square(y_pred - y_true)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Define learning rate decay callback\ndef step_decay(epoch):\n   initial_lrate = LEARNING_RATE\n   drop = DROP\n   epochs_drop = float(EPOCHS_DROP)\n   lrate = initial_lrate * np.power(drop,  \n           np.floor((1+epoch)/epochs_drop))\n   if epoch % 10 == 0:\n   \t\tmodel.save(filename + \"_graph_\" + str(epoch))\n   return lrate","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Fit and predict model (longest part...)\nlrate = LearningRateScheduler(step_decay)\ntbCallBack = TensorBoard(log_dir='./' + filename, histogram_freq=0, write_graph=True, write_images=True)\n\nadam = Adam(lr=LEARNING_RATE, beta_1=BETA_1, beta_2=BETA_2, epsilon=EPSILON)\nmodel.compile (loss = root_mean_squared_error, optimizer = adam, metrics = ['mse'])\nmodel.fit (X, y, epochs = EPOCHS, batch_size = BATCH_SIZE, verbose = 1, callbacks=[lrate, tbCallBack], validation_split=0.1)\n\ny_hat = model.predict(X)\nprint (\"Total LMSE: \" + str(mean_squared_error(y_hat, y)))\n\ny_hat = np.expm1(y_hat)\nnp.savetxt('y_hat.csv', y_hat, delimiter=',', fmt=['%.10f'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"#Predict lb data\nlb = pd.read_csv('features-test.csv')\nid_lb = lb['id'].values.reshape((lb['id'].values.shape[0], 1)).astype(int)\nlb = process_data(lb)\nlb = transform_outliers(lb)\nlb = pd.DataFrame(scaler.transform(lb))\ny_lb = np.expm1(model.predict(lb.values))\n\nprint (id_lb)\nres = np.hstack([id_lb, y_lb])\nnp.savetxt('submission.csv', res, delimiter=',', fmt=['%d', '%.10f'])\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3 (Intel, 2018 update 2)","language":"python","name":"c009-intel_distribution_of_python_3_2018u2"},"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.3"}},"nbformat":4,"nbformat_minor":1}