filename = "creditcard.csv"; tbl = readtable(filename,'TextType','String'); fraudRows = tbl(tbl.Class == 1, :); % Determine the amount of oversampling needed numFraud = height(fraudRows); numNonFraud = height(tbl) - numFraud; numReplications = numNonFraud - numFraud; % Adjust this as needed % Randomly replicate fraudRows replicatedRows = fraudRows(randi(numFraud, numReplications, 1), :); % Combine the original data with the replicated rows tblAugmented = [tbl; replicatedRows]; % Shuffle the combined dataset tblAugmented = tblAugmented(randperm(height(tblAugmented)), :); tbl = tblAugmented; labelName = "Class"; tbl = convertvars(tbl,labelName,'categorical'); classNames = categories(tbl{:,labelName}); numObservations = size(tbl,1); numObservationsTrain = floor(0.7*numObservations); numObservationsValidation = floor(0.15*numObservations); numObservationsTest = numObservations - numObservationsTrain - numObservationsValidation; idx = randperm(numObservations); idxTrain = idx(1:numObservationsTrain); idxValidation = idx(numObservationsTrain+1:numObservationsTrain+numObservationsValidation); idxTest = idx(numObservationsTrain+numObservationsValidation+1:end); tblTrain = tbl(idxTrain,:); tblValidation = tbl(idxValidation,:); tblTest = tbl(idxTest,:); numFeatures = size(tbl,2) - 1; numClasses = numel(classNames); % More complex architecture layers = [ featureInputLayer(30)% 148 input features fullyConnectedLayer(500) batchNormalizationLayer reluLayer dropoutLayer(0.5) fullyConnectedLayer(100) batchNormalizationLayer reluLayer dropoutLayer(0.5) fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]; % Rest of your code for training % Update training options options = trainingOptions('adam', ... 'InitialLearnRate',0.00001, ... 'LearnRateSchedule', 'piecewise', ... 'LearnRateDropFactor', 0.2, ... 'LearnRateDropPeriod', 50, ... 'MaxEpochs',300, ... 'MiniBatchSize', 128, ... 'ValidationData',tblValidation, ... 'ValidationFrequency',30, ... 'Verbose',false, ... 'Plots','training-progress'); miniBatchSize = 15; net = trainNetwork(tblTrain,labelName,layers,options); YPred = classify(net,tblTest(:,1:end-1),'MiniBatchSize',miniBatchSize); YTest = tblTest{:,labelName}; accuracy = sum(YPred == YTest)/numel(YTest); figure confusionchart(YTest,YPred); nnnn = grp2idx(YTest); mmmm = grp2idx(YPred); [c_matrixp,Result2]= confusion.getMatrix(nnnn,mmmm); figure plotConfMat(c_matrixp,{'Non-Fraud','Fraud'});