In [84]:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import confusion_matrix

from tensorflow import keras
In [2]:
data = pd.read_csv('banknotes.csv')
In [3]:
data.head()
Out[3]:
conterfeit Length Left Right Bottom Top Diagonal
0 0 214.8 131.0 131.1 9.0 9.7 141.0
1 0 214.6 129.7 129.7 8.1 9.5 141.7
2 0 214.8 129.7 129.7 8.7 9.6 142.2
3 0 214.8 129.7 129.6 7.5 10.4 142.0
4 0 215.0 129.6 129.7 10.4 7.7 141.8
In [4]:
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
In [5]:
X
Out[5]:
Length Left Right Bottom Top Diagonal
0 214.8 131.0 131.1 9.0 9.7 141.0
1 214.6 129.7 129.7 8.1 9.5 141.7
2 214.8 129.7 129.7 8.7 9.6 142.2
3 214.8 129.7 129.6 7.5 10.4 142.0
4 215.0 129.6 129.7 10.4 7.7 141.8
... ... ... ... ... ... ...
195 215.0 130.4 130.3 9.9 12.1 139.6
196 215.1 130.3 129.9 10.3 11.5 139.7
197 214.8 130.3 130.4 10.6 11.1 140.0
198 214.7 130.7 130.8 11.2 11.2 139.4
199 214.3 129.9 129.9 10.2 11.5 139.6

200 rows × 6 columns

In [6]:
y
Out[6]:
0      0
1      0
2      0
3      0
4      0
      ..
195    1
196    1
197    1
198    1
199    1
Name: conterfeit, Length: 200, dtype: int64
In [200]:
(X_train, X_test, y_train, y_test) = train_test_split(X, y, test_size=0.2)
In [9]:
X_train.shape
Out[9]:
(140, 6)
In [10]:
X_test.shape
Out[10]:
(60, 6)
In [91]:
mlp = MLPClassifier(hidden_layer_sizes=(3,5), activation='relu', alpha=0.001, batch_size=1, max_iter=200)
In [92]:
mlp.fit(X, y)
Out[92]:
MLPClassifier(alpha=0.001, batch_size=1, hidden_layer_sizes=(3, 5))
In [93]:
mlp.n_iter_
Out[93]:
87
In [94]:
mlp.score(X_train, y_train)
Out[94]:
1.0
In [95]:
mlp.score(X_test, y_test)
Out[95]:
1.0
In [96]:
y_test_pred = mlp.predict(X_test)
print(confusion_matrix(y_test, y_test_pred))
[[31  0]
 [ 0 29]]
In [212]:
X_train_k = X_train.values.astype('float')
y_train_k = y_train.values.astype('uint')

X_test_k = X_test.values.astype('float')
y_test_k = y_test.values.astype('uint')
In [123]:
X_train_k
Out[123]:
array([[215.3, 130.3, 130.1,   9.3,  12.1, 140.2],
       [214.9, 130.5, 130.2,  10.6,  11.5, 139.9],
       [214.8, 130. , 129.7,  11.4,  10.6, 139.2],
       [214.6, 130.5, 130.4,  10.1,  11.4, 139.3],
       [214.5, 130.1, 130.1,  12.1,  10.3, 139.4],
       [214.8, 130.1, 129.6,   8.8,   9.9, 140.9],
       [214.6, 130.6, 130.1,   8.1,  12.1, 137.9],
       [215.5, 129.5, 129.7,   7.9,   9.6, 141.6],
       [215.3, 129.7, 129.4,   7.5,  10.5, 141.5],
       [215. , 129.9, 129.7,   9. ,   9. , 141.9],
       [215. , 130.4, 130.3,   9.1,  10.2, 141.1],
       [215.1, 130.2, 130.2,  10.1,  11.3, 140.3],
       [214.6, 129.8, 130.2,  10.7,  11.1, 139.4],
       [215. , 130.5, 130.4,  10.6,  11.1, 139.9],
       [214.9, 129.6, 129.4,   9.3,   9. , 141.7],
       [214.6, 129.5, 129.2,   7.7,  10.3, 141.3],
       [214.2, 129.7, 129.6,  10.3,  11.4, 139.5],
       [214.8, 129.4, 129.1,   8.2,  10.2, 141. ],
       [215. , 129.9, 129.7,   8. ,  10.5, 142. ],
       [215.1, 130.7, 130.4,  10.5,  11.2, 139.7],
       [214.7, 130.2, 130.1,  10.7,  11.1, 139.5],
       [215. , 130.4, 130.6,   9.9,  10.9, 140.3],
       [215.3, 130.6, 130. ,   8.4,  10.8, 141.5],
       [214.7, 129.7, 129.3,   8.6,   9.6, 141.6],
       [215.2, 129.6, 129.6,   7.4,  11.5, 141.5],
       [215. , 130.5, 130.4,  11.4,  10.7, 139.9],
       [214.8, 129.9, 130.2,   9.6,  11.9, 139.4],
       [213.8, 129.8, 129.5,   8.4,  11.1, 140.9],
       [214.5, 129.5, 129.3,   7.4,  10.7, 141.5],
       [215.7, 130. , 129.4,   9.2,  10.4, 141.2],
       [215.1, 129.7, 129.9,   7.4,  10.8, 141.1],
       [214.8, 129.7, 129.7,   8.6,   9.1, 142.3],
       [214.5, 130.1, 130. ,   7.8,  10.9, 140.9],
       [214.8, 129.7, 129.3,   9.1,   9.5, 141.5],
       [215.2, 130.8, 129.6,   7.9,  10.8, 141.4],
       [215.2, 130.1, 129.9,   7.9,  10.8, 141.3],
       [214.5, 130.4, 130. ,   8. ,  12.2, 138.5],
       [215.1, 129.6, 129.8,   8.6,   9.8, 141.8],
       [214.5, 129.8, 129.8,  11.4,  10. , 139.3],
       [214.8, 130.1, 130. ,  11.4,  10.5, 139.6],
       [215. , 130.5, 130.3,   9.6,  11. , 138.5],
       [214.6, 130.2, 130.4,  11.2,  10.7, 139.9],
       [214.6, 129.9, 129.7,  11.9,  10.1, 139. ],
       [215.2, 130.6, 130.8,  10.4,  11.2, 140.3],
       [214.8, 130.1, 130.1,  11.9,  11.1, 139.5],
       [215.5, 130.2, 130.1,   8.9,   9.8, 142.4],
       [214.5, 130.2, 130.4,   8.2,  11.8, 137.8],
       [214.8, 130.1, 130.4,   9.8,  11.5, 139.9],
       [215. , 130.4, 130.1,  11.4,  10.7, 139.1],
       [214.5, 129.4, 129.5,   7.9,  10. , 141.4],
       [214.6, 130.2, 130.4,  10.5,  11.8, 139.7],
       [215.1, 130.5, 130.3,  10.6,  11.5, 140.1],
       [215.4, 130.2, 130.2,   7.6,  10.9, 141.6],
       [214.4, 130.1, 130.3,   9.7,  11.7, 139.8],
       [215.1, 130. , 129.8,   9.1,  10.2, 141.5],
       [214.8, 130.5, 130.2,  11. ,  11. , 140. ],
       [214.6, 129.7, 129.8,   7.9,  10.3, 141.1],
       [215.2, 130.4, 130.3,   9.2,  10. , 140.7],
       [214.7, 130.2, 130.3,  11.8,  10.9, 139.7],
       [214.3, 129.5, 129.4,   8.3,  10.2, 141.8],
       [214.9, 130.4, 129.7,   9. ,   9.8, 140.9],
       [215.3, 130.6, 130.3,   9.3,  11.3, 138.1],
       [215. , 130. , 129.6,   7.7,  10.5, 140.7],
       [214.9, 129.9, 130. ,   9.9,  12.3, 139.4],
       [215.3, 130.4, 130.3,   7.9,  11.7, 141.8],
       [214.7, 130. , 129.4,   7.8,  10. , 141.2],
       [214.6, 129.9, 130.1,   8.2,   9.8, 141.7],
       [215.2, 130.4, 130.3,   8. ,  11.5, 139.2],
       [215.3, 130.4, 130.4,   8. ,  11. , 142.3],
       [215.6, 130.1, 129.7,   7.4,  12.2, 138.4],
       [214.5, 130.3, 130. ,  11. ,  11.5, 139.5],
       [214.5, 130.2, 129.8,  12.3,  11.2, 139.2],
       [215.6, 129.9, 129.9,   9. ,   9.5, 141.7],
       [215.2, 130.5, 129.8,   7.9,  10.9, 140.9],
       [215.3, 130.8, 131.1,  11.6,  10.6, 140.2],
       [214.7, 130.3, 130.2,  10.8,  11.1, 139.2],
       [215.1, 130.1, 129.9,   7.9,  11. , 141.3],
       [214.5, 130.2, 130.6,   9.8,  12.1, 139.9],
       [216.3, 130.7, 130.4,  10. ,  10.1, 138.8],
       [214.8, 129.7, 129.7,   8.7,   9.6, 142.2],
       [213.9, 130.3, 129. ,   8.1,   9.7, 141.3],
       [213.9, 130.7, 130.5,   8.7,  11.5, 137.8],
       [214.8, 129.9, 129.7,   8.3,  10.2, 141.5],
       [214.1, 129.6, 129.3,   7.6,  10.7, 141.7],
       [214.4, 130.2, 129.9,  10.1,  12. , 139.2],
       [215.1, 129.9, 129.7,   7.7,  10.8, 141.8],
       [214.3, 130.2, 130. ,  10.7,  10.5, 139.8],
       [214.9, 130.5, 130.1,   9.9,  10.2, 138.1],
       [214.9, 130.3, 130.1,   8.7,  11.7, 140.2],
       [214.6, 130.3, 130.2,  12.7,   9.1, 139.2],
       [214.4, 129.9, 129.6,   7.5,  10.5, 141.8],
       [215.1, 130. , 129.8,   8.2,  10.3, 141.4],
       [214.2, 130.6, 130.4,  12. ,  10.2, 139.6],
       [214.8, 131. , 131.1,   9. ,   9.7, 141. ],
       [214.9, 129.8, 129.6,   7.5,  10.3, 141. ],
       [215. , 129.6, 129.4,   8.8,   9. , 141.1],
       [214.7, 130. , 129.4,  10.2,  11. , 139.2],
       [214.8, 130.2, 130.3,  10. ,  11.9, 139.3],
       [214.6, 129.8, 129.4,   7.2,  10. , 141.3],
       [215.3, 130.3, 130.1,   8.5,   9.3, 142.1],
       [214.8, 130.5, 130.3,  11.8,  10.5, 139.4],
       [215.2, 129.9, 129.7,   7.2,  10.6, 142.1],
       [214.3, 130.1, 130.1,  11.6,  10.5, 139.7],
       [215. , 129.6, 129.7,  10.4,   7.7, 141.8],
       [214.8, 130.3, 130.4,  10.6,  11.1, 140. ],
       [214.8, 130.4, 130.6,  12.5,  10. , 139.3],
       [215.1, 130.6, 130.3,  12.3,  10.2, 139.6],
       [214.7, 130.2, 130.1,  10.7,  11. , 139.4],
       [214.5, 130. , 129.5,   8. ,  10.8, 141.4],
       [214.9, 129.4, 129.5,   8.2,   9.9, 141.5],
       [214.6, 130.2, 130.2,   9.4,   9.7, 141.8],
       [214.6, 130.1, 130. ,  11.5,  10.6, 139.5],
       [214.7, 129.6, 129.5,   8.3,  10. , 142. ],
       [215.1, 129.5, 129.6,   7.7,  10.5, 142.2],
       [214.4, 129.8, 129.2,   8.9,   9.4, 142.3],
       [214.5, 129.8, 129.8,   9.3,   8.5, 141.6],
       [215.2, 129.7, 129.1,   9. ,   9.7, 141.9],
       [214.7, 130.5, 130.5,   9.9,  10.3, 140.1],
       [214.3, 129.9, 129.9,  10.2,  11.5, 139.6],
       [214.8, 129.6, 130. ,  10.4,  11.6, 139.2],
       [214.8, 129.7, 129.3,   8.3,   9. , 142. ],
       [215. , 130.2, 130.2,  10.6,  10.7, 139.9],
       [214.7, 130.1, 130.2,  11.6,  10.9, 139.1],
       [214.9, 130.7, 130.3,   9.3,  11.2, 138.3],
       [214.9, 130.5, 130.2,  11. ,  11.5, 139.5],
       [215.2, 130.6, 130. ,   8.8,  10.6, 140.8],
       [214.5, 130.5, 130.2,  11.8,  10.2, 139.6],
       [215.1, 129.7, 129.7,   8.6,  10.3, 140.6],
       [214.9, 130.2, 130.2,   8. ,  11.2, 139.6],
       [215.1, 129.9, 129.6,   8.9,  10.2, 141.5],
       [214.7, 130.7, 130.8,  11.2,  11.2, 139.4],
       [215.2, 129.7, 129.4,   9.2,   9.4, 142. ],
       [215. , 130.2, 129.9,  10. ,  11.9, 139.4],
       [215.1, 130.3, 129.9,  10.3,  11.5, 139.7],
       [214.9, 130.3, 129.9,   7.4,  11.2, 141.5],
       [214.9, 130.4, 129.9,  11.4,  11. , 139.9],
       [215.1, 130. , 130. ,   7.4,  10.5, 141.8],
       [214.2, 130. , 130.2,  11. ,  11.2, 139.5],
       [214.6, 130.4, 130.4,  11.3,  10.8, 139.8],
       [215.2, 129.9, 129.5,   8.2,  10.3, 141.4]])
In [228]:
model = keras.Sequential()

model.add(keras.layers.Dense(20, activation='relu', name='Prvi_skriveni', input_dim=X_train_k.shape[1], activity_regularizer=keras.regularizers.l1(0.0001)))
model.add(keras.layers.Dense(20, activation='relu', name='Drugi_skriveni', activity_regularizer=keras.regularizers.l1(0.0001)))

model.add(keras.layers.Dense(1, activation='sigmoid', name='Izlazni'))
In [229]:
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
In [230]:
model.summary()
Model: "sequential_23"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
Prvi_skriveni (Dense)        (None, 20)                140       
_________________________________________________________________
Drugi_skriveni (Dense)       (None, 20)                420       
_________________________________________________________________
Izlazni (Dense)              (None, 1)                 21        
=================================================================
Total params: 581
Trainable params: 581
Non-trainable params: 0
_________________________________________________________________
In [233]:
model.fit(X_train_k, y_train_k, epochs=50, batch_size=1)
Epoch 1/50
160/160 [==============================] - 0s 997us/step - loss: 0.1409 - accuracy: 0.9750
Epoch 2/50
160/160 [==============================] - 0s 897us/step - loss: 0.2373 - accuracy: 0.9438
Epoch 3/50
160/160 [==============================] - 0s 847us/step - loss: 0.2049 - accuracy: 0.9125
Epoch 4/50
160/160 [==============================] - 0s 845us/step - loss: 0.1961 - accuracy: 0.9438
Epoch 5/50
160/160 [==============================] - 0s 861us/step - loss: 0.1666 - accuracy: 0.9438
Epoch 6/50
160/160 [==============================] - 0s 903us/step - loss: 0.1474 - accuracy: 0.9250
Epoch 7/50
160/160 [==============================] - 0s 936us/step - loss: 0.1947 - accuracy: 0.9375
Epoch 8/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1341 - accuracy: 0.9563
Epoch 9/50
160/160 [==============================] - 0s 957us/step - loss: 0.1685 - accuracy: 0.9438
Epoch 10/50
160/160 [==============================] - 0s 914us/step - loss: 0.1168 - accuracy: 0.9563
Epoch 11/50
160/160 [==============================] - 0s 958us/step - loss: 0.1167 - accuracy: 0.9750
Epoch 12/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1966 - accuracy: 0.9250
Epoch 13/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1495 - accuracy: 0.9625
Epoch 14/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1601 - accuracy: 0.9312
Epoch 15/50
160/160 [==============================] - 0s 1ms/step - loss: 0.2373 - accuracy: 0.9438
Epoch 16/50
160/160 [==============================] - 0s 942us/step - loss: 0.1431 - accuracy: 0.9500
Epoch 17/50
160/160 [==============================] - 0s 934us/step - loss: 0.1484 - accuracy: 0.9500
Epoch 18/50
160/160 [==============================] - 0s 947us/step - loss: 0.1699 - accuracy: 0.9312
Epoch 19/50
160/160 [==============================] - 0s 976us/step - loss: 0.1967 - accuracy: 0.9312
Epoch 20/50
160/160 [==============================] - 0s 938us/step - loss: 0.2015 - accuracy: 0.9375
Epoch 21/50
160/160 [==============================] - 0s 919us/step - loss: 0.1160 - accuracy: 0.9500
Epoch 22/50
160/160 [==============================] - 0s 916us/step - loss: 0.1346 - accuracy: 0.9500
Epoch 23/50
160/160 [==============================] - 0s 1ms/step - loss: 0.2322 - accuracy: 0.9250
Epoch 24/50
160/160 [==============================] - 0s 993us/step - loss: 0.1532 - accuracy: 0.9438
Epoch 25/50
160/160 [==============================] - 0s 899us/step - loss: 0.1828 - accuracy: 0.9250
Epoch 26/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1618 - accuracy: 0.9375
Epoch 27/50
160/160 [==============================] - 0s 988us/step - loss: 0.0876 - accuracy: 0.9750
Epoch 28/50
160/160 [==============================] - 0s 976us/step - loss: 0.1291 - accuracy: 0.9500
Epoch 29/50
160/160 [==============================] - 0s 1ms/step - loss: 0.0960 - accuracy: 0.9750
Epoch 30/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1165 - accuracy: 0.9625
Epoch 31/50
160/160 [==============================] - 0s 898us/step - loss: 0.2979 - accuracy: 0.9062
Epoch 32/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1177 - accuracy: 0.9688
Epoch 33/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1223 - accuracy: 0.9688
Epoch 34/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1427 - accuracy: 0.9500
Epoch 35/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1476 - accuracy: 0.9500
Epoch 36/50
160/160 [==============================] - 0s 931us/step - loss: 0.1294 - accuracy: 0.9563
Epoch 37/50
160/160 [==============================] - 0s 860us/step - loss: 0.1288 - accuracy: 0.9625
Epoch 38/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1406 - accuracy: 0.9625
Epoch 39/50
160/160 [==============================] - 0s 932us/step - loss: 0.1171 - accuracy: 0.9563
Epoch 40/50
160/160 [==============================] - 0s 957us/step - loss: 0.2229 - accuracy: 0.9312
Epoch 41/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1025 - accuracy: 0.9750
Epoch 42/50
160/160 [==============================] - 0s 920us/step - loss: 0.0981 - accuracy: 0.9688
Epoch 43/50
160/160 [==============================] - 0s 924us/step - loss: 0.0838 - accuracy: 0.9812
Epoch 44/50
160/160 [==============================] - 0s 901us/step - loss: 0.1872 - accuracy: 0.9312
Epoch 45/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1078 - accuracy: 0.9688
Epoch 46/50
160/160 [==============================] - 0s 999us/step - loss: 0.1215 - accuracy: 0.9500
Epoch 47/50
160/160 [==============================] - 0s 925us/step - loss: 0.1113 - accuracy: 0.9688
Epoch 48/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1393 - accuracy: 0.9438
Epoch 49/50
160/160 [==============================] - 0s 952us/step - loss: 0.1448 - accuracy: 0.9500
Epoch 50/50
160/160 [==============================] - 0s 1ms/step - loss: 0.1278 - accuracy: 0.9500
Out[233]:
<tensorflow.python.keras.callbacks.History at 0x143deab20>
In [234]:
model.evaluate(X_test_k, y_test_k)
2/2 [==============================] - 0s 890us/step - loss: 0.0621 - accuracy: 1.0000
Out[234]:
[0.06208157539367676, 1.0]