Parte 2 Regressión

2.1 Regresión Lineal Simple

2.1.1 Intuición de la Regresión Lineal Simple

Exercise 2.1 ¿Qué significanson exactamente los coeficientes \(b_0\) y \(b_1\) en la ecuación de regresión lineal simple?

\[\textrm{Sueldo} = b_0 + b_1 \times \textrm{Experiencia}\]

\(b_0\) es el sueldo que recibe sin experiencia alguna y \(b_1\) es el aumento de salario por año de experiencia adicional.

Exercise 2.2

¿Por qué tomamos las diferencias al cuadrado y simplemente no las diferencias en valor absoluto?

Porque las diferencias al cuadrado facilitan la deducción de la ecuación de una recta de regresión a través de sus derivadas. De hecho, para encontrar esa recta, necesitamos calcular la primera derivada de la función de error de pérdida, y es mucho más difícil calcular la derivada de valores absolutos que los valores al cuadrado.

2.1.2 Regresión Lineal Simple en Python

Exercise 2.3

¿Por qué no aplicamos el escalado de características en nuestro modelo de regresión lineal simple?

Es simplemente porque dado que la variable \(y\) es una combinación lineal de las variables independientes, los coeficientes pueden adaptar su escala para poner todo en la misma escala. Por ejemplo, si tenemos dos variables independientes \(x_1\) y \(x_2\) y si \(y\) toma valores entre 0 y 1, \(x_1\) toma valores entre 1 y 10 y \(x_2\) toma valores entre 10 y 100, entonces \(b_1\) se puede multiplicar por 0.1 y \(b_2\) se puede multiplicar por 0.01 para que \(y\), \(b_1x_1\) y \(b_2x_2\) estén todos en la misma escala.

Exercise 2.4

¿Qué hace exactamente la instrucción regressor.fit(X_train, y_train)?

El método fit tomará los valores de X_train y y_train y luego calculará los coeficientes \(b_0\) y \(b_1\) de la ecuación de regresión lineal simple (\(y = b_0 + b_1 x\)) como se ve en la clase de intuición sobre el método en el curso. Ese es todo el propósito de este método fit.

2.1.3 Regresión lineal simple en R

Exercise 2.5

¿Qué es el p-valor?

Para comprender el p-valor, debemos comenzar por comprender la hipótesis nula: la hipótesis nula es la suposición de que los parámetros asociados a nuestras variables independientes son iguales a cero. Por lo tanto, bajo esta hipótesis, nuestras observaciones son totalmente aleatorias y no siguen un patrón determinado. El p-valor es la probabilidad de que los parámetros asociados a nuestras variables independientes tengan ciertos valores distintos de cero, suponiedo que la hipótesis nula es verdadera. Lo más importante a tener en cuenta sobre el p-valor es que es una métrica estadística: cuanto menor es el p-valor, más significativa es estadísticamente una variable independiente, que quiere decir que será el mejor predictor.

Exercise 2.6

En la última clase de R vemos un área gris alrededor de la línea azul. ¿Qué significa y cómo podemos obtenerla?

El área gris alrededor de la recta de regreesión es el intervalo de confianza. Puede agregarse con la instrucción + geom_smooth(method ='lm') justo después de geom_line(...) para obtener estos límites de confianza.

Exercise 2.7

¿Cómo obtenemos los p-valores en Python como lo hacemos en R?

Aprenderemos cómo hacerlo en la siguiente sección sobre Regresión lineal múltiple.

2.2 Regresión lineal múltiple

2.2.1 Intuición de la regresión lineal múltiple

Exercise 2.8

¿Cuáles son las hipótsis que debe verificarse en la regresión lineal múltiple?

Como vemos en detalle en el curso de estadística descriptiva en Frogames Formación deben cumplirse:

  • Linealidad: debe existir una relación lineal entre la variable dependiente y las variables independientes. Los diagramas de dispersión pueden mostrar si existe una relación lineal o curvilínea.
  • Homoscedasticidad: esta suposición establece que la varianza de los términos de error es similar entre los valores de las variables independientes. Un gráfico de residuos estandarizados versus valores predichos puede mostrar si los puntos están distribuidos por igual en todos los valores de las variables independientes.
  • Normalidad multivariante: La regresión lineal múltiple asume que los residuos (las diferencias entre el valor observado de la variable dependiente \(y\) y el valor predicho \(\hat{y}\) se distribuyen normalmente.
  • Independencia de errores: la regresión lineal múltiple asume que los residuos (las diferencias entre el valor observado de la variable dependiente \(y\) y el valor predicho \(\hat{y}\) son independientes.
  • Falta de multicolinealidad: la regresión lineal múltiple asume que las variables independientes no están altamente correlacionadas entre sí. Esta suposición se prueba utilizando valores del factor de inflación de varianza (VIF).

Exercise 2.9

¿Cómo se relaciona el coeficiente \(b_0\) con la trampa de las variables ficticias?

Como \(D_2 = 1 - D_1\) entonces si calculamos tanto \(D_1\) como \(D_2\) obtenmos:

\[\begin{align*} y & = b_0 + b_1x_1 + b_2x_2 + b_3x_3 + b_4D_1 + b_5D_2 \\ & = b_0 + b_1x_1 + b_2x_2 + b_3x_3 + b_4D_1 + b_5(1 - D_1) \\ & = b_0 + b_5 + b_1x_1 + b_2x_2 + b_3x_3 + (b_4 - b_5)D_1 \\ & = b_0^* + b_1x_1 + b_2x_2 + b_3x_3 + b_4^* D_1 \end{align*}\]

con \(b_0^* = b_0 + b_5\) y \(b_4^* = b_4 - b_5\)

Por lo tanto, la información de la variable ficticia redundante \(D_2\) entra a formar parte de la constante \(b_0\).

2.2.2 Regresión lineal múltiple en Python

Exercise 2.10

Normalmente predecimos los resultados de un conjunto de observaciones (el conjunto de testing). ¿Cómo hacemos lo mismo cuando solamente tenemos una observación?

Digamos que esta observación tiene las siguientes características: Feature Value 1, Feature Value 2, … y Feature Value m (m variables independientes). Entonces, el código para obtener el resultado previsto sería el siguiente:

y_pred = regressor.predict(np.array([[Feature Value 1, ..., Feature Value m]]))

Exercise 2.11

¿Cómo implementar la eliminación automática hacia atrás en Python?

Se puede implementar utilizando el siguiente código:

import statsmodels.formula.api as sm
def backwardElimination(x, sl):
    numVars = len(x[0])
    for i in range(0, numVars):
        regressor_OLS = sm.OLS(y, x).fit()
        maxVar = max(regressor_OLS.pvalues).astype(float)
        if maxVar > sl:
            for j in range(0, numVars - i):
                if (regressor_OLS.pvalues[j].astype(float) == maxVar):
                    x = np.delete(x, j, 1)
    regressor_OLS.summary()
    return x
SL = 0.05
X_opt = X[:, [0, 1, 2, 3, 4, 5]]
X_Modeled = backwardElimination(X_opt, SL)

2.2.3 Regresión lineal múltiple en R

Exercise 2.12 Hemos predicho los resultados de un conjunto de observaciones (el conjunto de testing). ¿Cómo hacemos lo mismo cuando solo tenemos una observación?

Primero debemos crear una nueva variable single_observation con los valores de entrada y configurar esta variable como un data frame:

single_observation = data.frame(R.D.Spend = 10000,
                                Administration = 20000,
                                Marketing.Spend = 30000,
                                State = 1)

Luego, simplemente podemos predecir el resultado de esta única observación exactamente como lo hicimos con el conjunto de teesting, simplemente reemplazando test_set por single_observation:

y_pred = predict(regressor, newdata = single_observation)

Exercise 2.13

¿Cómo implementar la eliminación automática hacia atrás en R?

Se puede implementar usando el siguiente código:

backwardElimination <- function(x, sl) {
    numVars = length(x)
    for (i in c(1:numVars) ){
      regressor = lm(formula = Profit ~ ., data = x )
      maxVar = max(coef(summary(regressor))[c(2:numVars), "Pr(>|t|)"])
      if (maxVar > sl){
        j = which(coef(summary(regressor))[c(2:numVars),"Pr(>|t|)"]==maxVar)
        x = x[,-j]
      }
      numVars = numVars - 1
    }
    return(summary(regressor))
  }
  
  SL = 0.05
  dataset = dataset[,c(1,2,3,4,5)]
  backwardElimination(dataset, SL) 

2.3 Regresión Polinómica

2.3.1 Intuición sobre la Regresión Polinómica

Exercise 2.14

¿La regresión polinómica es un modelo lineal o no lineal?

Eso depende de a qué te refieras. La regresión polinomial es lineal en los coeficientes ya que no tenemos ninguna potencia de los coeficientes (todos los coeficientes se elevan a la potencia de 1: \(b_0\), \(b_1\),…, \(b_n\)). Sin embargo, la regresión polinomial es una función no lineal de la entrada \(x\), ya que tenemos las entradas elevadas a varias potencias: \(x\) (potencia 1), \(x^2\) (potencia 2),…, \(x^n\) (potencia n). Así es como también podemos ver la Regresión polinomial como un modelo no lineal. Además, de hecho, la regresión polinomial es apropiada cuando los datos no están distribuidos linealmente (lo que significa que no se puede ajustar una línea recta entre \(y\) y \(x\)).

2.3.2 Regresión Polinomial en Python

Exercise 2.15

¿Por qué no hemos aplicado escalado de características en nuestro modeleo de regresión polinomial?

Es simplemente porque, dado que \(y\) es una combinación lineal de \(x\) y \(x^2\), los coeficientes pueden adaptar su escala para poner todo en la misma escala. Por ejemplo, si \(y\) toma valores entre 0 y 1, \(x\) toma valores entre 1 y 10 y \(x^ 2\) toma valores entre 1 y 100, entonces \(b_1\) puede multiplicarse por 0.1 y \(b_2\) puede ser multiplicado por 0.01 para que \(y\), \(b_1 x_1\) y \(b_2 x_2\) estén todos en la misma escala.

Exercise 2.16

¿Cómo elegimos el mejor grado para la regresión?

La forma principal de encontrar un buen ajuste es representar gráficamente el modelo y ver cómo se ve visualmente. Simplemente prueba varios grados y verás cuál te da el mejor ajuste. La otra opción es encontrar la raíz del error cuadrático medio (RMSE) más bajo para tu modelo, pero en ese caso ten cuidado de no sobreajustar los datos.

Exercise 2.17 ¿Por qué hemos tenido que crear un segundo modelo de regresión lineal lin_reg_2? ¿No podríamos haber usado lin_reg directamente?

No, porque lin_reg ya está ajustado a \(X\) e \(y\) y ahora queremos ajustar un nuevo modelo lineal a \(X_{poly}\) e \(y\). Entonces tenemos que crear un nuevo objeto regresor. Es importante que el método de ajuste aquí encuentre el coeficiente entre las variables independientes y la variable dependiente. Por lo tanto, dado que lin_reg ya obtuvo los coeficientes de correlación entre \(X\) y \(y\), se debe crear lin_reg_2 para obtener algunos nuevos coeficientes de correlación entre \(X_{poly}\) e \(y\).

2.3.3 Regresión polinomial en R

Exercise 2.18 En R, ¿tengo que crear manualmente las diferentes columnas para cada característica polinomial? ¿Qué pasa si hay muchas características polinomiales?

Rara vez tendrás que crear más de 4 características polinomiales, de lo contrario se sobreajustará el modelo, lo cual debe evitarse absolutamente en Machine Learning. Entonces, incluso si tienes que crearlos manualmente, nunca tomará demasiado tiempo. Además puedes usar la plantilla que te damos en el curso.

Exercise 2.19 ¿Cómo encontramos el mejor grado de la regresión polinomial? (Haciendo esta pregunta nuevamente en caso de que algunos estudiantes solo hagan R)

La forma principal de encontrar un buen ajuste es representar gráficamente el modelo y ver cómo se ve visualmente. Simplemente prueba varios grados y verás cuál te da el mejor ajuste. La otra opción es encontrar la raíz del error cuadrático medio (RMSE) más bajo para tu modelo, pero en ese caso ten cuidado de no sobreajustar los datos.

2.4 Support Vector Regression

2.4.1 Intuición de SVR

Exercise 2.20

¿Cuando debemos usar SVR?

Debemos usar SVR si un modelo lineal como la regresión lineal no se ajusta muy bien a los datos. Esto significaría que estamos lidiando con un problema no lineal, donde sus datos no están distribuidos linealmente. Por lo tanto, en ese caso, SVR podría ser una solución mucho mejor.

Exercise 2.21

No he entendido la clase de intuición del algoritmo. ¿Es un problema para seguir el curso?

De ningún modo. SVR es un modelo bastante abstracto y, además, no es de uso común. Lo que tienes que comprender es el modelo SVM, que verás más adelante en la Parte 3 - Clasificación. Luego, una vez que comprendas el modelo SVM, obtendrás una mejor comprensión del modelo SVR, ya que SVR es simplemente el SVM para Regresión. Sin embargo, queríamos incluir SVR en este curso para brindarte una opción adicional en tu kit de herramientas de aprendizaje automático.

2.4.2 SVR en Python

Exercise 2.22

¿Para qué necesitamos hacer sc_Y.inverse_transform?

Necesitamos el método inverse_transform para volver a la escala original. De hecho, hemos aplicado el escalado de variables, por lo que obtenemos para cada variable, una escala de valores alrededor de 0 y si hacemos una predicción sin invertir la escala, obtendremos el salario previsto escalado. Y, por supuesto, queremos el salario real, no el escalado, por lo que tenemos que usar sc_Y.inverse_transform. También lo que es importante entender es que transform e inverse_transform son métodos que van emparejados de la mano.

2.4.3 SVR en R

Exercise 2.23

¿Por qué no aplicamos el escalado de características como lo hicimos explícitamente en Python?

Eso es porque en la función svm() de R, los valores se escalan automáticamente.

Exercise 2.24

¿Podemos seleccionar las variables más significativas gracias al p-valor como hicimos antes en R?

No se puede utilizar el p-valor porque SVR no es un modelo lineal y los p-valores se aplican solo a los modelos lineales. Por lo tanto, la selección de características está fuera de discusión. Pero puedes realizar la extracción de características, que verá en la Parte 9: Reducción de dimensionalidad. Eso se puede aplicar a los SVR y reducirá el número de características

2.5 Árboles de Decisión para la Regresión

2.5.1 Intuición sobre Árboles de Decisión para la Regresión

Exercise 2.25

¿Cómo divide el algoritmo los puntos de datos?

Utiliza la reducción de la desviación estándar de las predicciones. En otras palabras, la desviación estándar se reduce inmediatamente después de una división. Por lo tanto, la construcción de un árbol de decisión se trata de encontrar el atributo que devuelve la reducción de la desviación estándar más alta (es decir, las ramas más homogéneas).

Exercise 2.26

¿Qué es la ganancia de información y cómo funciona en los árboles de decisión?

La ganancia de información en la regresión del árbol de decisión es exactamente la reducción de la desviación estándar que buscamos alcanzar. Calculamos cuánto disminuye la desviación estándar después de cada división. Debido a que cuanto más se reduce la desviación estándar después de una división, más homogéneos serán los nodos secundarios.

Exercise 2.27

¿Qué es la entropía y cómo funciona en los árboles de decisión

La Entropía mide el desorden en un conjunto, aquí en una parte resultante de una división. Entonces, cuanto más homogéneos sean los datos en una parte, menor será la entropía. Cuantas más divisiones tengamos, más posibilidades tendremos de encontrar partes en las que los datos sean homogéneos y, por lo tanto, menor será la entropía (cercana a 0) en estas partes. Sin embargo, es posible que todavía econtremos algunos nodos donde los datos no sean homogéneos y, por lo tanto, la entropía no sería necesariamente tan pequeña.

2.5.2 Árboles de Decisión para Regresión en Python

Exercise 2.28

¿Tiene mucho sentido un árbol de decisiones en 1D?

En realidad no, como vimos en la parte práctica de esta sección. En 1D (es decir, una variable independiente), el árbol de decisiones tiende claramente a sobreajustarse a los datos. El árbol de decisiones sería mucho más relevante en una dimensión superior, pero hay que tener en cuenta que la implementación que hicimos aquí en 1D sería exactamente la misma en una dimensión superior. Por lo tanto, es posible que desees mantener este modelo en tu kit de herramientas en caso de que estés tratando con un espacio de mayor dimensión. Este será realmente el caso en la Parte 3 - Clasificación, donde usaremos el Árbol de decisión para la clasificación en 2D, que veremos que resulta ser más relevante.

2.5.3 Árboles de Decisión para Regresión en R

Exercise 2.29

¿Por qué obtenemos resultados diferentes entre Python y R?

Es probable que la diferencia se deba a la división aleatoria de datos. Si hiciéramos una validación cruzada (consulta la Parte 10) en todos los modelos en ambos lenguajes de programación, probablemente obtendríamos una precisión media similar. Dicho esto, recomendaríamos más el uso de Python para árboles de decisión, ya que el modelo está un poco mejor implementado en Python.

Exercise 2.30

¿Es apropiado el árbol de decisiones aquí?

Aquí, en este ejemplo, podemos ver claramente que la curva de ajuste es una escalera con grandes huecos en las discontinuidades. Por lo tanto, ese modelo de regresión de árbol de decisión no es el más apropiado, y eso se debe a que solo tenemos una variable independiente que toma valores discretos. Entonces, lo que sucedió es que la predicción se hizo en la parte inferior de la brecha en Python, y se hizo en la parte superior de la brecha en R. Y como la brecha es grande, eso hace una gran diferencia. Si tuviéramos muchas más observaciones, tomando valores con más continuidad (como con un paso de 0.1), las brechas serían menores y por lo tanto las predicciones en Python y R muy alejadas entre sí.

Exercise 2.31

¿Podemos seleccionar las variables más significativas gracias al valor p como hicimos antes en R?

No se puede utilizar el valor p porque el árbol de decisión no es un modelo lineal y los valores p se aplican solo a los modelos lineales. Por lo tanto, la selección de características está fuera de discusión. Pero puedes realizar la extracción de características, que verá en la Parte 9: Reducción de dimensionalidad. Eso se puede aplicar a los árboles de decisión y reducirá el número de características.

2.6 Regresión con Bosques Aleatorios

2.6.1 Intuición sobre la Regresión con Bosques Aleatorios

Exercise 2.32

¿Cuál es la ventaja y el inconveniente de los bosques aleatorios en comparación con los árboles de decisión?
  • Ventaja: los bosques aleatorios pueden brindarte un mayor poder de predicción que los árboles de decisión.
  • Inconveniente: el árbol de decisión te dará más interpretabilidad que los bosques aleatorios, porque puedes represetar el gráfico de un árbol de decisión para ver las diferentes divisiones que conducen a la predicción, como se ve en la clase de intuición. Esto es algo que no puedes hacer con Random Forest.

Exercise 2.33

¿Cuándo usar Random Forest y cuándo usar los otros modelos

La mejor respuesta a esta pregunta es: ¡pruébalos todos!

De hecho, gracias a las plantillas del curso, solo te llevará 10 minutos probar todos los modelos, lo que es muy poco en comparación con el tiempo dedicado a las otras partes de un proyecto de ciencia de datos (como el preprocesamiento de datos, por ejemplo). Así que no tengas miedo de probar todos los modelos de regresión y comparar los resultados (a través de la validación cruzada que veremos en la Parte 10). Esto quiere decir que te hemos dado el máximo número de modelos en este curso para que los tengas en tu kit de herramientas y aumentes tus posibilidades de obtener mejores resultados.

Sin embargo, si deseas algunos atajos, aquí hay algunas reglas generales que te ayudarán a decidir qué modelo usar:

  • Primero, debes averiguar si tu problema es lineal o no lineal. Aprenderá cómo hacerlo en la Parte 10: Selección de modelos. Entonces:
    • Si tu problema es lineal, debes optar por Regresión lineal simple si solo tienes una característica, y Regresión lineal múltiple si tienes varias características.
    • Si tu problema no es lineal, debes optar por Regresión polinomial, SVR, Árbol de decisión o Bosque aleatorio. Entonces, ¿cuál debemos elegir entre estos cuatro? Esto lo aprenderás en la Parte 10: Selección de modelos. El método consiste en utilizar una técnica muy relevante que evalúa el rendimiento de tus modelos, llamada k-Fold Cross Validation, y luego seleccionar el modelo que muestra los mejores resultados. Siéntete libre de saltar directamente a la Parte 10 si ya quieres aprender cómo hacerlo ahora mismo.

2.6.2 Regresión con Bosques Aleatorios en Python

Exercise 2.34

¿Cómo sé cuántos árboles debo usar?

Primero, recomendaría elegir el número de árboles experimentando. Por lo general, toma menos tiempo del que pensamos encontrar el mejor valor ajustando y ajustando el modelo manualmente. En realidad, eso es lo que hacemos en general cuando construimos un modelo de Machine Learning: lo hacemos en varias tomas, experimentando varios valores de hiperparámetros como el número de árboles. Sin embargo, también debes saber que en la Parte 10 cubriremos la Validación cruzada en k-Folds y la Búsqueda de cuadrícula, que son técnicas poderosas que puede usar para encontrar el valor óptimo de un hiperparámetro, como aquí el número de árboles.

2.6.3 Regresión con Bosques Aleatorios en R

Exercise 2.35

¿Cómo decidimos cuántos árboles serían suficientes para obtener un resultado relativamente preciso?

Al igual que en Python, puedes encontrar un número relevante de árboles a través de la experimentación y el ajuste manual. Debes usar suficientes árboles para obtener una buena precisión, pero no debes usar demasiados árboles porque eso podría causar un ajuste excesivo. Aprenderás a encontrar el número óptimo de árboles en la primera sección de la Parte 10: Selección del modelo. Se realiza con una técnica llamada Ajuste de parámetros (búsqueda por cuadrícula con validación cruzada de k-Fold).

Exercise 2.36

¿Por qué obtenemos resultados diferentes entre Python y R?

Es probable que la diferencia se deba a la división aleatoria de datos. Si hiciéramos una validación cruzada (consulta la Parte 10) en todos los modelos en ambos idiomas, probablemente obtendríamos una precisión media similar.

Exercise 2.37

¿Podemos seleccionar las variables más significativas gracias al p-valor como hicimos antes en R?

No se puede usar el p-valor porque los bosques aleatorios no son modelos lineales y los valores p se aplican solo a los modelos lineales. Por lo tanto, la selección de características está fuera de discusión. Pero puedes realizar la extracción de características, que verá en la Parte 9: Reducción de dimensionalidad. Eso se puede aplicar a Random Forests y reducirá el número de características.

2.7 Evaluar la eficacia de los modelos de regresión

Exercise 2.38

Entiendo que para evaluar múltiples modelos lineales puedo usar el R-cuadrado ajustado o la matriz de Pearson. Pero, ¿cómo puedo evaluar los modelos de regresión polinomial o los modelos de regresión con bosques aleatorios que no son lineales?

Se pueden evaluar modelos de regresión polinomial y modelos de regresión con bosques aleatorios, calculando el Error cuadrático medio (la media de los errores al cuadrado). Se puede calcular esta métrica fácilmente con una función de suma o usando un bucle for, calculando la suma de las diferencias al cuadrado entre los resultados predichos y los resultados reales, sobre todas las observaciones del conjunto de prueba.

Realmente no se podría aplicar la eliminación hacia atrás a los modelos de regresión polinomial y regresión aleatoria de bosque porque estos modelos no tienen coeficientes combinados en una ecuación de regresión lineal y, por lo tanto, no tienen p-valores p.

Sin embargo, en la Parte 9 - Reducción de dimensionalidad, veremos algunas técnicas como Eliminación hacia atrás, para reducir el número de características, basadas en Selección de características y Extracción de características.

Exercise 2.39

¿Qué son los sesgos o varianzas bajos / altos en el aprendizaje automático?
  • Sesgo bajo es cuando las predicciones de tu modelo están muy cerca de los valores reales.
  • Sesgo alto es cuando las predicciones de tu modelo están lejos de los valores reales.
  • Varianza baja: cuando ejecutamos el modelo varias veces, las diferentes predicciones de los puntos de observación no varian mucho.
  • Varianza alta: cuando ejecutamos el modelo varias veces, las diferentes predicciones de los puntos de observación varian mucho.

Lo que deseamos obtener cuando creamos un modelo es: Bajo Sesgo y Baja Varianza.

Exercise 2.40

En Python, ¿cómo implementar la eliminación hacia atrás automatizada con R-Cuadrado ajustado?

Retomemos el problema de la regresión lineal múltiple, con 5 variables independientes. La eliminación automática hacia atrás, incluido el R cuadrado ajustado, se puede implementar de esta manera:

import statsmodels.formula.api as sm
def backwardElimination(x, SL):
    numVars = len(x[0])
    temp = np.zeros((50,6)).astype(int)
    for i in range(0, numVars):
        regressor_OLS = sm.OLS(y, x).fit()
        maxVar = max(regressor_OLS.pvalues).astype(float)
        adjR_before = regressor_OLS.rsquared_adj.astype(float)
        if maxVar > SL:
            for j in range(0, numVars - i):
                if (regressor_OLS.pvalues[j].astype(float) == maxVar):
                    temp[:,j] = x[:, j]
                    x = np.delete(x, j, 1)
                    tmp_regressor = sm.OLS(y, x).fit()
                    adjR_after = tmp_regressor.rsquared_adj.astype(float)
                    if (adjR_before >= adjR_after):
                        x_rollback = np.hstack((x, temp[:,[0,j]]))
                        x_rollback = np.delete(x_rollback, j, 1)
                        print (regressor_OLS.summary())
                        return x_rollback
                    else:
                        continue
    regressor_OLS.summary()
    return x
 
SL = 0.05
X_opt = X[:, [0, 1, 2, 3, 4, 5]]
X_Modeled = backwardElimination(X_opt, SL)

Exercise 2.41

¿Cómo obtener el R-cuadrado ajustado en R?

Denotemos la variable dependiente por \(DV\) y las variables independientes por \(IV_1\), \(IV_2\), etc. Entonces, el código R para obtener el R-Cuadrado ajustado es el siguiente:

summary(lm(DV ~ IV1 + IV2 + ..., dataset))$adj.r.squared