import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler, LabelEncoder
import tensorflow as tf
from sklearn.model_selection import train_test_split
from tensorflow.keras import layers, models
# Load the dataset from the CSV file
dataset = pd.read_csv('dataset.csv')
# Drop the 'totacc', 'mov', and 'prob' columns from the dataset
dataset = dataset.drop(['totacc', 'mov', 'prob'], axis=1)
# Create a new DataFrame with the remaining columns
df = pd.DataFrame(dataset)
# Print the first five rows of the new DataFrame
df.head()
| timestamp | ax | ay | az | gx | gy | gz | pitch | roll | BAR | status | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1682240261550 | -8.699 | -2.994 | 2.891 | 5.60 | 1.68 | 0.70 | 18.087 | -71.617 | -0.000977 | 0 |
| 1 | 1682240261653 | -8.840 | -2.824 | 2.905 | 1.19 | 0.14 | 0.21 | 16.881 | -71.808 | 0.013672 | 0 |
| 2 | 1682240261764 | -8.708 | -3.011 | 2.826 | -1.33 | 0.42 | 0.98 | 18.202 | -72.020 | 0.039062 | 0 |
| 3 | 1682240261871 | -8.704 | -3.097 | 2.867 | -0.49 | 0.77 | 0.77 | 18.672 | -71.769 | 0.047607 | 0 |
| 4 | 1682240261977 | -8.704 | -2.955 | 2.776 | -1.12 | 0.91 | 0.14 | 17.927 | -72.311 | 0.039307 | 0 |
## SCALING ##
# Select all columns except the last one
cols_to_scale = df.columns[:-1]
# Apply the StandardScaler to the selected columns
scaler = StandardScaler()
df_scaled = pd.DataFrame(scaler.fit_transform(df[cols_to_scale]), columns=cols_to_scale)
# Concatenate the scaled columns with the last column (not scaled)
df_scaled = pd.concat([df_scaled, df.iloc[:, -1]], axis=1)
df_scaled.describe()
| timestamp | ax | ay | az | gx | gy | gz | pitch | roll | BAR | status | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 4.135000e+03 | 4.135000e+03 | 4.135000e+03 | 4.135000e+03 | 4135.000000 | 4.135000e+03 | 4.135000e+03 | 4.135000e+03 | 4.135000e+03 | 4.135000e+03 | 4135.000000 |
| mean | -3.040735e-10 | 2.062035e-17 | -8.248138e-17 | 5.155086e-17 | 0.000000 | 1.202853e-17 | 3.436724e-18 | -5.842431e-17 | 5.155086e-18 | -5.498759e-17 | 0.370496 |
| std | 1.000121e+00 | 1.000121e+00 | 1.000121e+00 | 1.000121e+00 | 1.000121 | 1.000121e+00 | 1.000121e+00 | 1.000121e+00 | 1.000121e+00 | 1.000121e+00 | 0.482996 |
| min | -1.526363e+00 | -4.454933e+00 | -7.033260e+00 | -5.987140e+00 | -8.548294 | -7.122183e+00 | -5.043594e+00 | -4.739893e+00 | -1.679684e+00 | -2.667533e+00 | 0.000000 |
| 25% | -1.010856e+00 | -7.243092e-01 | -6.221750e-01 | -7.175532e-01 | -0.350618 | -3.261153e-01 | -3.186833e-01 | -5.714003e-01 | -5.687728e-01 | -8.326364e-01 | 0.000000 |
| 50% | 1.562652e-01 | -5.991483e-01 | 2.702349e-01 | 3.344676e-01 | 0.026605 | -1.417784e-01 | -3.815743e-02 | -2.507572e-01 | -5.170300e-01 | 2.830542e-01 | 0.000000 |
| 75% | 9.857442e-01 | 8.403447e-01 | 5.681325e-01 | 5.234009e-01 | 0.300465 | 3.534011e-01 | 2.003396e-01 | 6.178480e-01 | 1.138222e+00 | 6.570001e-01 | 1.000000 |
| max | 1.505914e+00 | 2.671502e+00 | 7.528570e+00 | 1.018915e+01 | 9.351156 | 9.417536e+00 | 8.505708e+00 | 2.970806e+00 | 2.202550e+00 | 7.020228e+00 | 1.000000 |
#df_scaled = df
# Separate the features from the target variable
X = df_scaled.drop(['status'], axis=1).values
y = df_scaled['status'].values
# Convert the target variable to binary values
encoder = LabelEncoder()
y = encoder.fit_transform(y)
# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Reshape the data for use in a CNN
input_shape = (X_train.shape[1], 1)
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
# Build the CNN model
model = models.Sequential()
model.add(layers.Conv1D(32, 3, activation='relu', input_shape=input_shape))
model.add(layers.MaxPooling1D(pool_size=2))
model.add(layers.Flatten())
model.add(layers.Dense(1, activation='sigmoid'))
# Compile the model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Train the model
history = model.fit(X_train, y_train, epochs=10, batch_size=16, validation_data=(X_test, y_test))
# Evaluate the model
test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test accuracy:', test_acc)
Epoch 1/10 207/207 [==============================] - 3s 9ms/step - loss: 0.5007 - accuracy: 0.7896 - val_loss: 0.4071 - val_accuracy: 0.8235 Epoch 2/10 207/207 [==============================] - 1s 4ms/step - loss: 0.3895 - accuracy: 0.8383 - val_loss: 0.3753 - val_accuracy: 0.8259 Epoch 3/10 207/207 [==============================] - 1s 4ms/step - loss: 0.3670 - accuracy: 0.8467 - val_loss: 0.3576 - val_accuracy: 0.8464 Epoch 4/10 207/207 [==============================] - 2s 8ms/step - loss: 0.3515 - accuracy: 0.8531 - val_loss: 0.3464 - val_accuracy: 0.8501 Epoch 5/10 207/207 [==============================] - 1s 4ms/step - loss: 0.3387 - accuracy: 0.8594 - val_loss: 0.3390 - val_accuracy: 0.8549 Epoch 6/10 207/207 [==============================] - 1s 4ms/step - loss: 0.3302 - accuracy: 0.8628 - val_loss: 0.3290 - val_accuracy: 0.8646 Epoch 7/10 207/207 [==============================] - 1s 5ms/step - loss: 0.3219 - accuracy: 0.8688 - val_loss: 0.3257 - val_accuracy: 0.8694 Epoch 8/10 207/207 [==============================] - 2s 8ms/step - loss: 0.3139 - accuracy: 0.8721 - val_loss: 0.3183 - val_accuracy: 0.8779 Epoch 9/10 207/207 [==============================] - 1s 3ms/step - loss: 0.3067 - accuracy: 0.8767 - val_loss: 0.3114 - val_accuracy: 0.8839 Epoch 10/10 207/207 [==============================] - 1s 3ms/step - loss: 0.3011 - accuracy: 0.8827 - val_loss: 0.3041 - val_accuracy: 0.8791 26/26 [==============================] - 0s 2ms/step - loss: 0.3041 - accuracy: 0.8791 Test accuracy: 0.8790810108184814
# plot the accuracy curves
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.show()
# plot the loss curves
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.show()
from sklearn.metrics import confusion_matrix
import seaborn as sns
# Evaluate the model
y_pred = model.predict(X_test)
y_pred = (y_pred > 0.5)
cm = confusion_matrix(y_test, y_pred)
# Plot the confusion matrix as a heatmap
sns.heatmap(cm, annot=True, fmt='g', cmap='Blues')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
26/26 [==============================] - 0s 2ms/step
from tensorflow.keras.callbacks import LearningRateScheduler
def lr_schedule(epoch):
lr = 0.01
if epoch > 5:
lr = 0.001
if epoch > 10:
lr = 0.0001
return lr
lr_scheduler = LearningRateScheduler(lr_schedule)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=20, batch_size=16, validation_data=(X_test, y_test), callbacks=[lr_scheduler])
Epoch 1/20 207/207 [==============================] - 2s 5ms/step - loss: 0.2978 - accuracy: 0.8827 - val_loss: 0.2844 - val_accuracy: 0.8912 - lr: 0.0100 Epoch 2/20 207/207 [==============================] - 1s 3ms/step - loss: 0.2703 - accuracy: 0.8927 - val_loss: 0.2588 - val_accuracy: 0.9008 - lr: 0.0100 Epoch 3/20 207/207 [==============================] - 1s 3ms/step - loss: 0.2506 - accuracy: 0.9033 - val_loss: 0.2584 - val_accuracy: 0.8972 - lr: 0.0100 Epoch 4/20 207/207 [==============================] - 1s 5ms/step - loss: 0.2442 - accuracy: 0.9069 - val_loss: 0.2393 - val_accuracy: 0.9021 - lr: 0.0100 Epoch 5/20 207/207 [==============================] - 1s 4ms/step - loss: 0.2328 - accuracy: 0.9105 - val_loss: 0.2777 - val_accuracy: 0.9033 - lr: 0.0100 Epoch 6/20 207/207 [==============================] - 1s 4ms/step - loss: 0.2356 - accuracy: 0.9111 - val_loss: 0.2874 - val_accuracy: 0.8888 - lr: 0.0100 Epoch 7/20 207/207 [==============================] - 1s 3ms/step - loss: 0.2111 - accuracy: 0.9229 - val_loss: 0.2369 - val_accuracy: 0.9117 - lr: 0.0010 Epoch 8/20 207/207 [==============================] - 1s 6ms/step - loss: 0.2030 - accuracy: 0.9308 - val_loss: 0.2312 - val_accuracy: 0.9045 - lr: 0.0010 Epoch 9/20 207/207 [==============================] - 1s 6ms/step - loss: 0.2016 - accuracy: 0.9296 - val_loss: 0.2333 - val_accuracy: 0.8984 - lr: 0.0010 Epoch 10/20 207/207 [==============================] - 1s 5ms/step - loss: 0.2018 - accuracy: 0.9268 - val_loss: 0.2323 - val_accuracy: 0.9105 - lr: 0.0010 Epoch 11/20 207/207 [==============================] - 1s 4ms/step - loss: 0.2008 - accuracy: 0.9265 - val_loss: 0.2311 - val_accuracy: 0.9069 - lr: 0.0010 Epoch 12/20 207/207 [==============================] - 1s 6ms/step - loss: 0.1975 - accuracy: 0.9320 - val_loss: 0.2305 - val_accuracy: 0.9081 - lr: 1.0000e-04 Epoch 13/20 207/207 [==============================] - 1s 5ms/step - loss: 0.1973 - accuracy: 0.9314 - val_loss: 0.2305 - val_accuracy: 0.9069 - lr: 1.0000e-04 Epoch 14/20 207/207 [==============================] - 1s 4ms/step - loss: 0.1972 - accuracy: 0.9314 - val_loss: 0.2302 - val_accuracy: 0.9069 - lr: 1.0000e-04 Epoch 15/20 207/207 [==============================] - 1s 4ms/step - loss: 0.1970 - accuracy: 0.9323 - val_loss: 0.2297 - val_accuracy: 0.9045 - lr: 1.0000e-04 Epoch 16/20 207/207 [==============================] - 1s 4ms/step - loss: 0.1968 - accuracy: 0.9323 - val_loss: 0.2300 - val_accuracy: 0.9069 - lr: 1.0000e-04 Epoch 17/20 207/207 [==============================] - 1s 7ms/step - loss: 0.1968 - accuracy: 0.9329 - val_loss: 0.2296 - val_accuracy: 0.9057 - lr: 1.0000e-04 Epoch 18/20 207/207 [==============================] - 2s 8ms/step - loss: 0.1968 - accuracy: 0.9326 - val_loss: 0.2294 - val_accuracy: 0.9057 - lr: 1.0000e-04 Epoch 19/20 207/207 [==============================] - 1s 7ms/step - loss: 0.1966 - accuracy: 0.9317 - val_loss: 0.2290 - val_accuracy: 0.9033 - lr: 1.0000e-04 Epoch 20/20 207/207 [==============================] - 1s 7ms/step - loss: 0.1966 - accuracy: 0.9335 - val_loss: 0.2293 - val_accuracy: 0.9045 - lr: 1.0000e-04
# Plot the accuracy curves
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.show()
# Plot the loss curves
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.show()