I have a dataset that is fairly small (15,000 rows), with 10 features for a model to learn from. It is not possible to increase the size of this dataset. I am using machine learning for binary classification on this dataset; it is severely imbalanced, with around 2% for the positive class and 98% for the negative class. As stated in the title, this is the basic tabular dataset (with numerical/continuous features, categorical features, and binary features); there are around 30% missing values for one column and 2% missing values for the other. I am trying to improve the performance of the machine learning models that I have tried, as they have done fairly poor (please see below).
In terms of preprocessing, I am doing one-hot encoding for the categorical features and StandardScaler for the numerical features. I am imputing the missing values for the 2% NA column with multiple imputation; for the 30% NA column, I am just imputing with a string "none". To deal with the class imbalance (as that may be a problem since the data is extremely imbalanced and is small; please see Are unbalanced datasets problematic, and (how) does oversampling (purport to) help?), I am trying various resampling techniques: random undersampling, random oversampling, SMOTE, SMOTE-ENN, and SMOTE-Tomek Links. To avoid any data leaks, everything is in a pipeline.
I start off with K-Fold cross validation (specifically 10 folds) as a baseline. Then, I do RandomizedSearchCV (with a good amount of iterations) to tune the hyperparameters of the models. The models that I have tried Random Forest, XGBoost, LightGBM, SVM (with RBF and linear kernels), CatBoost, and TabNet. The performance of these models basically are:
- RandomizedSearchCV: In terms of accuracy, there is no overfitting (around 1% difference between train and test). However, as this is an imbalanced dataset and as accuracy is an improper scoring rule, the accuracy doesn't really matter (it is around 60%-70% for the various models). As this is a medical dataset, recall seems to matter the most, so hyperparameter tuning was done to optimize recall. Recall is around 70% for the various models. Somewhat because we are optimizing recall, F1 and precision are very low, around 40% and 50%, respectively. For the ROC-AUC score, it is the high 70% to low 70% for the various models, which seems to be better, but still not very good. The area under the Precision-Recall Curve (AUPRC) score is terrible; it is around 0.05, where a model by just chance would be 0.02 in my case.
- K-Fold Cross Validation as a baseline: both train and test accuracy are in the 70s (still doesn't really matter, though). Recall is sometimes around 60-70% or around 40-50% depending on the specific data resampling technique (I can see that the hyperparameter tuning does improve recall). AUC is fair, but not good, also.
Basically, my questions are:
- What are some techniques that I should try to improve the performance of my model? Should I try dimensionality reduction (e.g. PCA)? Should I remove the column with the 30% NA values from the dataset? Should I not resample my dataset? Should I try a different imputation technique (e.g. MiceForest)?
- Are there any models I should try to improve performance? Should I try more complex neural networks (e.g. convolutional NN's, deep fully-connected NN's, fully-connected NN's with residual blocks, LSTM's...)?
- Should I do hyperparameter tuning to optimize recall? It is an improper scoring rule; should I instead do hyperparameter tuning to optimize AUC, for example, which is a semi-proper scoring rule, or should I optimize the Brier score (once I implement it), which is a proper scoring rule?
- Instead of doing 10-Fold cross validation, should I do 5-Fold cross validation since this is a small dataset?
Also, training/preprocessing time doesn't really matter to me.
Thank you very much for any suggestion or help!