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
data = pd.read_csv('banknotes.csv')
data.head()
| 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 |
X = data.iloc[:, 1:]
y = data.iloc[:, 0]
X
| 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
y
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
(X_train, X_test, y_train, y_test) = train_test_split(X, y, test_size=0.2)
X_train.shape
(140, 6)
X_test.shape
(60, 6)
mlp = MLPClassifier(hidden_layer_sizes=(3,5), activation='relu', alpha=0.001, batch_size=1, max_iter=200)
mlp.fit(X, y)
MLPClassifier(alpha=0.001, batch_size=1, hidden_layer_sizes=(3, 5))
mlp.n_iter_
87
mlp.score(X_train, y_train)
1.0
mlp.score(X_test, y_test)
1.0
y_test_pred = mlp.predict(X_test)
print(confusion_matrix(y_test, y_test_pred))
[[31 0] [ 0 29]]
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')
X_train_k
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]])
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'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
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 _________________________________________________________________
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
<tensorflow.python.keras.callbacks.History at 0x143deab20>
model.evaluate(X_test_k, y_test_k)
2/2 [==============================] - 0s 890us/step - loss: 0.0621 - accuracy: 1.0000
[0.06208157539367676, 1.0]