22 votos

¿Hay alguna razón para resolver un problema de regresión como un problema de clasificación?

¿Habría alguna razón para plantear un problema de previsión por regresión como un problema de clasificación utilizando, por ejemplo, clases para describir si las ventas en un año son el 10%,50%,90% o >100% de los niveles actuales. Esas cosas podrían deducirse naturalmente de los resultados de una regresión, y sin embargo he visto a gente haciendo clasificaciones de ese tipo que en realidad parecen más problemas de regresión.

Soy novato en el foro y en ML en general así que espero haberlo hecho todo bien al plantear la pregunta :)

18voto

Kimmy634 Puntos 21

En línea con la respuesta de @delaney: No he visto y no soy capaz de imaginar una razón para hacerlo.

Tomando prestado del debate en https://github.com/scikit-learn/scikit-learn/issues/15850#issuecomment-896285461 :

  • Se pierde información al segmentar la respuesta. Para empezar, ¿por qué querría uno hacer eso (salvo por la compresión de datos)?
  • Los objetivos continuos tienen un orden (<). Las clases de clasificación (estándar) no (excepto la regresión/clasificación categórica ordinal).
  • Los objetivos continuos suelen tener algún tipo de suavidad: La proximidad en el espacio de características (para características continuas) significa proximidad en el espacio objetivo.
  • Toda esta pérdida de información va acompañada posiblemente de más parámetros en el modelo, por ejemplo, la regresión logística tiene un número de coeficientes proporcional al número de clases.
  • El binning ofusca si uno está tratando de predecir la expectativa/media o un cuantil.
  • Se puede acabar con un modelo de regresión mal calibrado (condicionalmente), es decir, sesgado. (Esto también puede ocurrir con las técnicas de regresión estándar).

En V. Fedorov, F. Mannino, Rongmei Zhang "Consecuencias de la dicotomización" (2009) doi: 10.1002/pst.331

Aunque el análisis de los resultados dicotomizados puede resultar más sencillo, este enfoque no presenta ventajas cuando se pueden observar los verdaderos resultados y el modelo "de trabajo" es lo suficientemente flexible como para describir la describir la población en cuestión. Por lo tanto, la dicotomización debe evitarse en la mayoría de los casos.

17voto

Santo Puntos 41

En general, no hay ninguna buena razón. Agrupar los datos como describes significa que se está desechando parte de la información, y eso no puede ser bueno.

La razón por la que la gente hace esto es probablemente la conveniencia práctica. Las bibliotecas de clasificación pueden ser más comunes y fácilmente accesibles, y también proporcionan automáticamente respuestas que se encuentran en el rango correcto (mientras que la regresión, por ejemplo, puede arrojar valores negativos, etc.).

Una motivación ligeramente mejor que se me ocurre es que los resultados típicos de los algoritmos de clasificación pueden interpretarse como probabilidades de clase, lo que puede proporcionar una medida de incertidumbre sobre el resultado (por ejemplo, se puede leer que un resultado da un 40% de probabilidad para el rango 10-20, un 50% para el rango 20-30, etc.). Por supuesto, los modelos de regresión también pueden, en general, proporcionar estimaciones de incertidumbre, pero es una característica de la que carecen muchas herramientas estándar y no es "automática" como en el caso de la clasificación.

10voto

kjetil b halvorsen Puntos 7012

Además de las buenas respuestas de los usuarios J. Delaney y Soeren Soerensen: Una motivación para hacer esto podría ser que piensan que la respuesta no funcionará bien con un modelo lineal, que su expectativa está mal modelada como una función lineal de los predictores. Pero entonces hay alternativas mejores, como las transfromaciones de respuesta (véase ¿Cómo elegir la mejor transformación para lograr la linealidad? y ¿Cuándo (y por qué) se debe tomar el logaritmo de una distribución (de números)? ).

Pero otra idea, más reciente, es utilizar regresión ordinal . El usuario Frank Harrell ha escrito mucho sobre esto aquí, buscar. Algunos puntos de partida: ¿Qué modelo debo utilizar para ajustar mis datos? ordinales y no ordinales, no normales y no homocedásticos , modelo de regresión logística ordinal de probabilidades proporcionales (PO) como ANOVA no paramétrico que controla las covariables , Análisis de resultados categóricos ordinales

1voto

Neal Fultz Puntos 171

Un contraejemplo que veo a menudo:

Los resultados que son proporciones (p. ej., 10% = 2/20, 20%= 1/5, etc.) no deben volcarse mediante MCO, en su lugar utilice una regresión logística con el denominador especificado. Esto ponderará los casos correctamente aunque tengan varianzas diferentes.

Por otra parte, la regresión logística es un modelo de regresión propiamente dicho, a pesar de que en su mayoría es enseñó como clasificador. Así que tal vez esto no cuenta.

1voto

Björn Puntos 457

Me ha parecido una pregunta muy interesante y me he esforzado por pensar en situaciones en las que el agrupamiento de una variable de respuesta permitiría mejorar las predicciones.

Lo mejor que se me ha ocurrido es un escenario como este (todo el código se adjunta al final), donde la clase roja corresponde a $y \leq 1$ y la clase azul a $y>1$ y tenemos un predictor (o por supuesto más) que dentro de la clase no está correlacionado con $y$ pero separa perfectamente las clases. enter image description here

Aquí, una regresión logística penalizada por Firth

       Predicted
Truth  red   blue
  red  5000    0
 blue     2 4998

bate un modelo lineal simple (seguido de una clasificación basada en si las predicciones son >1):

       Predicted
Truth  red   blue
  red  4970   30
  blue     0 5000

Sin embargo, seamos sinceros, parte del problema es que una regresión lineal no es un modelo tan bueno para este problema. Sustituir la regresión lineal y la regresión logística por una regresión y un bosque aleatorio de clasificación, respectivamente, resuelve esto perfectamente. Ambos producen este resultado (véase más abajo):

       Predicted
Truth  red   blue
  red  5000     0
  blue     0 5000

Sin embargo, supongo que al menos es un ejemplo en el que parece que se obtienen resultados un poco mejores dentro de la clase de modelos con una ecuación de regresión lineal (por supuesto, esto sigue ignorando totalmente la posibilidad de utilizar splines, etc.).

library(tidyverse)
library(ranger)
library(ggrepel)
library(logistf)

# Set defaults for ggplot2 ----
theme_set( theme_bw(base_size=18) +
             theme(legend.position = "none"))

scale_colour_discrete <- function(...) {
  # Alternative: ggsci::scale_color_nejm(...)
  scale_colour_brewer(..., palette="Set1")
}
scale_fill_discrete <- function(...) {
  # Alternative: ggsci::scale_fill_nejm(...)
  scale_fill_brewer(..., palette="Set1")
}
scale_colour_continuous <- function(...) {
  scale_colour_viridis_c(..., option="turbo")
}
update_geom_defaults("point", list(size=2))
update_geom_defaults("line", list(size=1.5))
# To allow adding label to points e.g. as geom_text_repel(data=. %>% filter(1:n()==n()))
update_geom_defaults("text_repel", list(label.size = NA, fill = rgb(0,0,0,0),
                                         segment.color = "transparent", size=6))

# Start program ----

set.seed(1234)
records = 5000

# Create the example data including a train-test split
example = tibble(y = c(runif(n=records*2, min = 0, max=1),
                       runif(n=records*2, min = 1, max=2)),
                 class = rep(c(0L,1L), each=records*2),
                 test = factor(rep(c(0,1,0,1), each=records),
                               levels=0:1, labels=c("Train", "Test")),
                 predictor = c(runif(n=records*2, min = 0, max=1),
                               runif(n=records*2, min = 1, max=2))) 

# Plot the dataset
example %>%
  ggplot(aes(x=predictor, y=y, col=factor(class))) +
  geom_point(alpha=0.3) +
  facet_wrap(~test)

# Linear regression
lm1 =  lm(data=example %>% filter(test=="Train"),
          y ~ predictor)
# Performance of linear regression prediction followed by classifying by prediction>1
table(example %>% filter(test=="Test") %>% pull(class),
      predict(lm1, 
              example %>% filter(test=="Test")) > 1)

# Firth penalized logistic regression
glm1 = logistf(data=example %>% filter(test=="Train"),
          class ~ predictor,
          pl=F)
# Performance of classifying by predicted log-odds from Firth LR being >0
table(example %>% filter(test=="Test") %>% pull(class),
      predict(glm1, 
              example %>% filter(test=="Test"))>0)

# Now, let's try this with RF instead:
# First, binary classification  RF
rf1 = ranger(formula = class ~ predictor, 
             data=example %>% filter(test=="Train"), 
             classification = T)
table(example %>% filter(test=="Test") %>% pull(class),
      predict(rf1, example %>% filter(test=="Test"))$predictions)

# Now regression RF
rf2 = ranger(formula = y ~ predictor, 
             data=example %>% filter(test=="Train"), 
             classification = F)
table(example %>% filter(test=="Test") %>% pull(class),
      predict(rf2, example %>% filter(test=="Test"))$predictions>1)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X