Doubt in Resolving Overfitting and Underfitting
Tags: machinelearning, deeplearning, classification, neuralnetwor
Published: 2024-02-28 10:12:46

Hey guys so recently, I have been developing an artificial neural network for a binary classification problem. This problem classifies as to whether a particular employee will get promoted or not. This dataset has 54808 rows. I have been using the 80:20 train-test ratio and I have created a model with a drop function to do the same. However, I am getting some really weird results.
The code goes like follows
import torch
import torch.nn as nn

class ANN(nn.Module):
    def __init__(self, input_features=5, h1=60, h2=60,h3=45,h4=45, output_features=1,dropout_prob=0.4):
        super().__init__()
        self.fc1 = nn.Linear(input_features, h1)
        self.relu1 = nn.LeakyReLU()
        self.dropout1 = nn.Dropout(p=dropout_prob,inplace=False)
        
        self.fc2 = nn.Linear(h1, h2)
        self.relu2 = nn.LeakyReLU()
        self.dropout2 = nn.Dropout(p=dropout_prob,inplace=False)
        
        self.fc3 =nn.Linear(h2,h3)
        self.relu3 = nn.LeakyReLU()
        self.dropout3 = nn.Dropout(p=dropout_prob,inplace=False)
        
        self.fc4 =nn.Linear(h3,h4)
        self.relu4 = nn.LeakyReLU()
        self.dropout4 = nn.Dropout(p=dropout_prob,inplace=False)
        
        self.output = nn.Linear(h4, output_features)
        self.output_activation_function = nn.Sigmoid()

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu1(x)
        x = self.dropout1(x)
        
        x = self.fc2(x)
        x = self.relu2(x)
        x = self.dropout2(x)
        
        x = self.fc3(x)
        x = self.relu3(x)
        x = self.dropout3(x)
        
        x = self.fc4(x)
        x = self.relu4(x)
        x = self.dropout4(x)
        
        x = self.output(x)
        x = self.output_activation_function(x)
        return x

    def flatten_parameters(self):
        flattened_parameters = []
        for param in self.parameters():
            flattened_parameters.append(param.flatten())
        return torch.cat(flattened_parameters)
model=ANN()
flattened_params = model.flatten_parameters()
print(f"Flattened Parameters:{flattened_params}")
print(f"Shape:{flattened_params.shape}")
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X_resampled[['awards_won','avg_training_score','previous_year_rating','education','region']],Y_resampled,test_size=0.2,random_state=42)
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_train_scaled=scaler.fit_transform(X_train)
X_test_scaled=scaler.transform(X_test)
print("Successfully Scaled")
from torch import tensor as tn
X_train_scaled_tensor=tn(X_train_scaled,dtype=torch.float32)
X_test_scaled_tensor=tn(X_test_scaled,dtype=torch.float32)
Y_train_tensor=tn(Y_train,dtype=torch.int64)
Y_test_tensor=tn(Y_test,dtype=torch.int64)
Y_train_tensor = Y_train_tensor.unsqueeze(1)
Y_test_tensor = Y_test_tensor.unsqueeze(1)

print("Tensors created")
import torch.optim as optim
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.00001, betas=(0.95, 0.999), eps=1e-7, weight_decay=0.0001, amsgrad=False)
num_epochs = 100
batch_size = 32
print(Y_train_tensor.dtype)
for epoch in range(num_epochs):
    model.train()#Set to training mode
    for i in range(0, len(X_train_scaled_tensor), batch_size): 
        outputs = model(X_train_scaled_tensor[i:i + batch_size])
        loss = criterion(outputs, Y_train_tensor[i:i + batch_size].float())  
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    model.eval()#Set to evaluation mode
    with torch.no_grad():
        outputs = model(X_test_scaled_tensor)
        predictions = torch.round(outputs)  
        accuracy = (predictions == Y_test_tensor).sum().item() / len(Y_test_tensor)
        print(f"Epoch {epoch + 1}, Loss: {loss.item():.4f}, Test Accuracy: {accuracy:.4f}")

THe last part is giving weird results as follows:
torch.int64
Epoch 1, Loss: 0.6607, Test Accuracy: 0.5084
Epoch 2, Loss: 0.6602, Test Accuracy: 0.5084
Epoch 3, Loss: 0.6509, Test Accuracy: 0.5084
Epoch 4, Loss: 0.6422, Test Accuracy: 0.5347
Epoch 5, Loss: 0.6585, Test Accuracy: 0.6086
Epoch 6, Loss: 0.6395, Test Accuracy: 0.6358
Epoch 7, Loss: 0.6488, Test Accuracy: 0.6451
Epoch 8, Loss: 0.6417, Test Accuracy: 0.6504
Epoch 9, Loss: 0.6505, Test Accuracy: 0.6533
Epoch 10, Loss: 0.6433, Test Accuracy: 0.6570
Epoch 11, Loss: 0.6376, Test Accuracy: 0.6598
Epoch 12, Loss: 0.6424, Test Accuracy: 0.6600
Epoch 13, Loss: 0.6412, Test Accuracy: 0.6609
Epoch 14, Loss: 0.6360, Test Accuracy: 0.6622
Epoch 15, Loss: 0.6475, Test Accuracy: 0.6631
Epoch 16, Loss: 0.6541, Test Accuracy: 0.6643
Epoch 17, Loss: 0.6539, Test Accuracy: 0.6653
Epoch 18, Loss: 0.6331, Test Accuracy: 0.6656
Epoch 19, Loss: 0.6458, Test Accuracy: 0.6657
Epoch 20, Loss: 0.6363, Test Accuracy: 0.6661
Epoch 21, Loss: 0.6193, Test Accuracy: 0.6659
Epoch 22, Loss: 0.6422, Test Accuracy: 0.6660
Epoch 23, Loss: 0.6311, Test Accuracy: 0.6673
Epoch 24, Loss: 0.6477, Test Accuracy: 0.6682
Epoch 25, Loss: 0.6207, Test Accuracy: 0.6687
Epoch 26, Loss: 0.6352, Test Accuracy: 0.6710
Epoch 27, Loss: 0.6402, Test Accuracy: 0.6721
Epoch 28, Loss: 0.6323, Test Accuracy: 0.6716
Epoch 29, Loss: 0.6454, Test Accuracy: 0.6732
Epoch 30, Loss: 0.6303, Test Accuracy: 0.6735
Epoch 31, Loss: 0.6361, Test Accuracy: 0.6734
Epoch 32, Loss: 0.6385, Test Accuracy: 0.6745
Epoch 33, Loss: 0.6333, Test Accuracy: 0.6754
Epoch 34, Loss: 0.6469, Test Accuracy: 0.6768
Epoch 35, Loss: 0.6028, Test Accuracy: 0.6780
Epoch 36, Loss: 0.6260, Test Accuracy: 0.6771
Epoch 37, Loss: 0.6230, Test Accuracy: 0.6801
Epoch 38, Loss: 0.6486, Test Accuracy: 0.6790
Epoch 39, Loss: 0.6383, Test Accuracy: 0.6808
Epoch 40, Loss: 0.6248, Test Accuracy: 0.6810
Epoch 41, Loss: 0.6400, Test Accuracy: 0.6811
Epoch 42, Loss: 0.6406, Test Accuracy: 0.6818
Epoch 43, Loss: 0.6053, Test Accuracy: 0.6822
Epoch 44, Loss: 0.6365, Test Accuracy: 0.6824
Epoch 45, Loss: 0.6580, Test Accuracy: 0.6831
Epoch 46, Loss: 0.6454, Test Accuracy: 0.6843
Epoch 47, Loss: 0.6489, Test Accuracy: 0.6845
Epoch 48, Loss: 0.6146, Test Accuracy: 0.6858
Epoch 49, Loss: 0.6071, Test Accuracy: 0.6869
Epoch 50, Loss: 0.6227, Test Accuracy: 0.6866
Epoch 51, Loss: 0.6185, Test Accuracy: 0.6871
Epoch 52, Loss: 0.6240, Test Accuracy: 0.6887
Epoch 53, Loss: 0.6312, Test Accuracy: 0.6887
Epoch 54, Loss: 0.6216, Test Accuracy: 0.6885
Epoch 55, Loss: 0.6287, Test Accuracy: 0.6881
Epoch 56, Loss: 0.6261, Test Accuracy: 0.6892
Epoch 57, Loss: 0.6083, Test Accuracy: 0.6897
Epoch 58, Loss: 0.6348, Test Accuracy: 0.6898
Epoch 59, Loss: 0.6443, Test Accuracy: 0.6901
Epoch 60, Loss: 0.6102, Test Accuracy: 0.6924
Epoch 61, Loss: 0.6331, Test Accuracy: 0.6901
Epoch 62, Loss: 0.6264, Test Accuracy: 0.6910
Epoch 63, Loss: 0.6017, Test Accuracy: 0.6911
Epoch 64, Loss: 0.6241, Test Accuracy: 0.6915
Epoch 65, Loss: 0.6350, Test Accuracy: 0.6927
Epoch 66, Loss: 0.6080, Test Accuracy: 0.6933
Epoch 67, Loss: 0.6064, Test Accuracy: 0.6928
Epoch 68, Loss: 0.6013, Test Accuracy: 0.6930
Epoch 69, Loss: 0.6134, Test Accuracy: 0.6947
Epoch 70, Loss: 0.6079, Test Accuracy: 0.6932
Epoch 71, Loss: 0.6371, Test Accuracy: 0.6936
Epoch 72, Loss: 0.6320, Test Accuracy: 0.6951
Epoch 73, Loss: 0.6258, Test Accuracy: 0.6943
Epoch 74, Loss: 0.6089, Test Accuracy: 0.6949
Epoch 75, Loss: 0.6142, Test Accuracy: 0.6949
Epoch 76, Loss: 0.6109, Test Accuracy: 0.6965
Epoch 77, Loss: 0.6138, Test Accuracy: 0.6972
Epoch 78, Loss: 0.6077, Test Accuracy: 0.6964
Epoch 79, Loss: 0.6300, Test Accuracy: 0.6964
Epoch 80, Loss: 0.6348, Test Accuracy: 0.6976
Epoch 81, Loss: 0.6145, Test Accuracy: 0.6982
Epoch 82, Loss: 0.6276, Test Accuracy: 0.6991
Epoch 83, Loss: 0.6181, Test Accuracy: 0.7001
Epoch 84, Loss: 0.6333, Test Accuracy: 0.6989
Epoch 85, Loss: 0.6119, Test Accuracy: 0.6994
Epoch 86, Loss: 0.5859, Test Accuracy: 0.6993
Epoch 87, Loss: 0.6312, Test Accuracy: 0.7005
Epoch 88, Loss: 0.6394, Test Accuracy: 0.7007
Epoch 89, Loss: 0.6410, Test Accuracy: 0.7014
Epoch 90, Loss: 0.6238, Test Accuracy: 0.7024
Epoch 91, Loss: 0.6405, Test Accuracy: 0.7026
Epoch 92, Loss: 0.6310, Test Accuracy: 0.7029
Epoch 93, Loss: 0.6087, Test Accuracy: 0.7042
Epoch 94, Loss: 0.6277, Test Accuracy: 0.7035
Epoch 95, Loss: 0.6142, Test Accuracy: 0.7045
Epoch 96, Loss: 0.6347, Test Accuracy: 0.7045
Epoch 97, Loss: 0.5915, Test Accuracy: 0.7058
Epoch 98, Loss: 0.6408, Test Accuracy: 0.7059
Epoch 99, Loss: 0.6111, Test Accuracy: 0.7053
Epoch 100, Loss: 0.6109, Test Accuracy: 0.7073

Is this by any chance an indicator of overfitting/underfitting. If it is then how do I resolve it.

I have attached the dataset as well with this case. THe features have been chosen with respect to positive correlation values.
[]https://drive.google.com/file/d/1UMUpuBvJJP1069EI1ZA4mTSA0vq1yi3u/view?usp=sharing

Thanks in Advance guys!!!