There is nothing particularly strange about this, it may well be that the model is giving the optimal answer to the question it has been posed. If the density of patterns belonging to the minority class (weighted by its prior probability) is less everywhere than the weighted density of the majority class, then no pattern is ever more likely to belong to the minority class than the majority class. In that case, the optimal accuracy is obtained by assigning all patterns to the majority class.
Here is a simple two-class example, with Gaussian class conditional densities:

If this is not a satisfactory answer, it usually means that the misclassification costs are not equal (in your case classifying a class 1 pattern as a class 0 or class 2 is a worse error than the other way round). The solution is to work out what the matrix of misclassification costs should be and use "minimum risk classification". If you have a probabilistic classifier, that can be done after training. If you use a discrete classifier, like the SVM, then the misclassification costs must be built in at training time (for the SVM having different values of C, the regularisation parameter, for each class).
Most classification methods are set up by default to assume that misclassification costs are equal, but that is not that often the case in real world classification tasks. Cost-sensitive learning is something that practitioners need to have in their toolbox.
predict_probainstead ofpredict? $//$ Is there a reason to believe that your variables should be able to distinguish between the categories? – Dave Feb 23 '24 at 20:21