In [1]:
import keras
import numpy as np
import pandas as pd

from keras.layers import Input, Dense
from keras.models import Model, Sequential


Using TensorFlow backend.

In [2]:
df = pd.read_csv("../housing-conditions-in-copenhagen/data.csv",sep="\s+")

In [3]:
df.head()


Out[3]:
housing influence contact_with_neighbours satisfaction n
1 1 1 1 1 21
2 1 1 1 2 21
3 1 1 1 3 28
4 1 1 2 1 14
5 1 1 2 2 19

In [4]:
df.describe()


Out[4]:
housing influence contact_with_neighbours satisfaction n
count 72.00000 72.000000 72.000000 72.000000 72.000000
mean 2.50000 2.000000 1.500000 2.000000 23.347222
std 1.12588 0.822226 0.503509 0.822226 17.666041
min 1.00000 1.000000 1.000000 1.000000 3.000000
25% 1.75000 1.000000 1.000000 1.000000 10.000000
50% 2.50000 2.000000 1.500000 2.000000 19.500000
75% 3.25000 3.000000 2.000000 3.000000 31.750000
max 4.00000 3.000000 2.000000 3.000000 86.000000

In [5]:
df_new = pd.concat([df,pd.get_dummies(df["housing"],prefix="housing")],axis=1).drop(["housing"],axis=1)
df_new = pd.concat([df_new,pd.get_dummies(df["influence"],prefix="influence")],axis=1).drop(["influence"],axis=1)
df_new = pd.concat([df_new,pd.get_dummies(df["satisfaction"],prefix="satisfaction")],axis=1).drop(["satisfaction"],axis=1)

In [6]:
df_new["contact_with_neighbours"] = df_new["contact_with_neighbours"].map(lambda v: 0 if v == 1 else 1)

In [13]:
df_new.head()


Out[13]:
contact_with_neighbours n housing_1 housing_2 housing_3 housing_4 influence_1 influence_2 influence_3 satisfaction_1 satisfaction_2 satisfaction_3
1 0 21 1 0 0 0 1 0 0 1 0 0
2 0 21 1 0 0 0 1 0 0 0 1 0
3 0 28 1 0 0 0 1 0 0 0 0 1
4 1 14 1 0 0 0 1 0 0 1 0 0
5 1 19 1 0 0 0 1 0 0 0 1 0

In [8]:
y = df_new["contact_with_neighbours"].values.reshape(-1,1)
X = df_new.drop(["contact_with_neighbours"], axis=1).values

In [9]:
y.shape, X.shape


Out[9]:
((72, 1), (72, 11))

In [10]:
indices = np.arange(72)
np.random.shuffle(indices)
num_validation_samples = int(0.2*72)

y = y[indices]
X = X[indices]

X_train = X[:-num_validation_samples]
y_train = y[:-num_validation_samples]
X_val = X[-num_validation_samples:]
y_val = y[-num_validation_samples:]

In [11]:
X_train.shape,y_train.shape,X_val.shape, y_val.shape


Out[11]:
((58, 11), (58, 1), (14, 11), (14, 1))

In [12]:
model = Sequential()
model.add(Dense(1, 
                activation='sigmoid', 
                input_dim=X.shape[1]))

rmsprop = keras.optimizers.RMSprop(lr=0.01)
model.compile(optimizer=rmsprop, loss='mse', metrics=['mse'])

early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=5, verbose=0, mode='auto')

model.fit(X, 
          y, 
          epochs=300, 
          validation_data=(X_val, y_val),
          callbacks = [early_stopping])


Train on 72 samples, validate on 14 samples
Epoch 1/300
72/72 [==============================] - 0s - loss: 0.4841 - mean_squared_error: 0.4841 - val_loss: 0.5723 - val_mean_squared_error: 0.5723
Epoch 2/300
72/72 [==============================] - 0s - loss: 0.4754 - mean_squared_error: 0.4754 - val_loss: 0.5702 - val_mean_squared_error: 0.5702
Epoch 3/300
72/72 [==============================] - 0s - loss: 0.4644 - mean_squared_error: 0.4644 - val_loss: 0.5651 - val_mean_squared_error: 0.5651
Epoch 4/300
72/72 [==============================] - 0s - loss: 0.4527 - mean_squared_error: 0.4527 - val_loss: 0.5474 - val_mean_squared_error: 0.5474
Epoch 5/300
72/72 [==============================] - 0s - loss: 0.4281 - mean_squared_error: 0.4281 - val_loss: 0.5112 - val_mean_squared_error: 0.5112
Epoch 6/300
72/72 [==============================] - 0s - loss: 0.3883 - mean_squared_error: 0.3883 - val_loss: 0.4228 - val_mean_squared_error: 0.4228
Epoch 7/300
72/72 [==============================] - 0s - loss: 0.3187 - mean_squared_error: 0.3187 - val_loss: 0.2956 - val_mean_squared_error: 0.2956
Epoch 8/300
72/72 [==============================] - 0s - loss: 0.2710 - mean_squared_error: 0.2710 - val_loss: 0.2641 - val_mean_squared_error: 0.2641
Epoch 9/300
72/72 [==============================] - 0s - loss: 0.2717 - mean_squared_error: 0.2717 - val_loss: 0.2575 - val_mean_squared_error: 0.2575
Epoch 10/300
72/72 [==============================] - 0s - loss: 0.2657 - mean_squared_error: 0.2657 - val_loss: 0.2420 - val_mean_squared_error: 0.2420
Epoch 11/300
72/72 [==============================] - 0s - loss: 0.2757 - mean_squared_error: 0.2757 - val_loss: 0.2439 - val_mean_squared_error: 0.2439
Epoch 12/300
72/72 [==============================] - 0s - loss: 0.2635 - mean_squared_error: 0.2635 - val_loss: 0.2357 - val_mean_squared_error: 0.2357
Epoch 13/300
72/72 [==============================] - 0s - loss: 0.2719 - mean_squared_error: 0.2719 - val_loss: 0.2336 - val_mean_squared_error: 0.2336
Epoch 14/300
72/72 [==============================] - 0s - loss: 0.2692 - mean_squared_error: 0.2692 - val_loss: 0.2338 - val_mean_squared_error: 0.2338
Epoch 15/300
72/72 [==============================] - 0s - loss: 0.2605 - mean_squared_error: 0.2605 - val_loss: 0.2557 - val_mean_squared_error: 0.2557
Epoch 16/300
72/72 [==============================] - 0s - loss: 0.2586 - mean_squared_error: 0.2586 - val_loss: 0.2461 - val_mean_squared_error: 0.2461
Epoch 17/300
72/72 [==============================] - 0s - loss: 0.2508 - mean_squared_error: 0.2508 - val_loss: 0.2407 - val_mean_squared_error: 0.2407
Epoch 18/300
72/72 [==============================] - 0s - loss: 0.2496 - mean_squared_error: 0.2496 - val_loss: 0.2806 - val_mean_squared_error: 0.2806
Epoch 19/300
72/72 [==============================] - 0s - loss: 0.2535 - mean_squared_error: 0.2535 - val_loss: 0.2430 - val_mean_squared_error: 0.2430
Out[12]:
<keras.callbacks.History at 0x7fd3e0748cc0>

In [ ]: