A viable alternative is to create two models:
- High vs. Low & Other
- Low vs. High & Other
You'll get probabilities $\text{P(High|Data)}$ and $\text{P(Low|Data)}$. If neither probability is higher than a threshold (say $50\%$) you can label the instance as $\text{Unknown}$ instead.
Example in R
An example in R using kernlab
's ksvm
(any probabilistic classifier would work).
library(kernlab)
#our data
x = as.matrix(iris[,-c(2,4,5)])
y = iris$Species
#our new classes
ysetosa = (y == "setosa") + 0
yversic = (y == "versicolor") + 0
#our two models
fitsetosa = ksvm(y = ysetosa, x = x, type = "C-bsvc", prob.model = TRUE)
fitversic = ksvm(y = yversic, x = x, type = "C-bsvc", prob.model = TRUE)
#the class predictions
predsetosa = predict(fitsetosa, x, type = "probabilities")
predversic = predict(fitversic, x, type = "probabilities")
#the unknown probability is 1 minus the other probabilities
pred = cbind(setosa = predsetosa[,2L], versicolor = predversic[,2L], unknown = 1 - predsetosa[,2L] - predversic[,2L])
tail(pred)
#> tail(pred)
# setosa versicolor unknown
#[145,] 0.009275878 0.005356246 0.9853679
#[146,] 0.009058278 0.141930931 0.8490108
#[147,] 0.009945749 0.101307355 0.8887469
#[148,] 0.009903443 0.034164283 0.9559323
#[149,] 0.009027848 0.002268708 0.9887034
#[150,] 0.009679991 0.028774113 0.9615459
We know the last 50 examples in iris
are neither setosa nor versicolor, and this is reflected in the respective probabilities.
Issues
The difference can generate negative probabilities. Better methods for probability coupling exist and should be used instead. I'm fairly sure you can edit kernlab
ones (mostly based on binary probabilities) to not sum to 1, which in practice would result in the example I created.