Parte 3 Clasificación

3.1 Regresión Logística

3.1.1 Intuición de la Regresión Logística

Exercise 3.1 ¿Es la regresión logística un modelo lineal o no lineal?

Es un modelo lineal. Visualizarás esto al final de la sección al ver que el separador del clasificador es una línea recta.

Exercise 3.2

¿Cuales son las hipótesis del modelo de regresión logística ?

Primero, la regresión logística binaria requiere que la variable dependiente sea binaria y la regresión logística ordinal requiere que la variable dependiente sea ordinal.

En segundo lugar, la regresión logística requiere que las observaciones sean independientes entre sí. En otras palabras, las observaciones no deben provenir de medidas repetidas o datos coincidentes.

En tercer lugar, la regresión logística requiere que haya poca o ninguna multicolinealidad entre las variables independientes. Esto significa que las variables independientes no deben estar muy correlacionadas entre sí.

Cuarto, la regresión logística asume la linealidad de las variables independientes y las probabilidades logarítmicas. aunque este análisis no requiere que las variables dependientes e independientes estén relacionadas linealmente, requiere que las variables independientes estén relacionadas linealmente con las probabilidades logarítmicas.

Exercise 3.3

¿Se puede utilizar también la regresión logística para muchas variables independientes?

Sí, la regresión logística se puede utilizar para tantas variables independientes como se desee. Sin embargo, hay que tener en cuenta que no podrás visualizar los resultados en más de 3 dimensiones.

3.1.2 Regresión Logística en Python

Exercise 3.4

¿Qué hace el método fit?

El método fit básicamente entrena el modelo de regresión logística utilizando los datos de entrenamiento. Por lo tanto, calculará y obtendrá los pesos (coeficientes) del modelo de regresión logística (ver la lección de intuición) para ese conjunto particular de datos de entrenamiento compuesto por X_train y y_train. Luego, justo después de recopilar los pesos / coeficientes, tendremos un modelo de regresión logística completamente entrenado en los datos de entrenamiento y listo para predecir nuevos resultados gracias al método de predicción.

Exercise 3.5

Hemos predicho los resultados de un conjunto de observaciones (el conjunto de prueba). ¿Cómo hacemos lo mismo para una sola observación, para predecir un solo resultado?

Digamos que esta observación tiene las siguientes características: Edad = 30, Salario estimado = 50000. Entonces, el código para obtener el resultado predicho sería el siguiente (observemos cómo no debemos olvidar escalar esa única observación primero):

y_pred = classifier.predict(sc_X.transform(np.array([[20, 50000]])))

Exercise 3.6

¿Es la Matriz de confusión la forma óptima de evaluar el desempeño del modelo?

No, solo nos da una idea de qué tan bien puede funcionar nuestro modelo. Si obtenemos una buena matriz de confusión con pocos errores de predicción en el conjunto de prueba, existe la posibilidad de que el modelo tenga un buen poder predictivo. Sin embargo, la forma más relevante de evaluar el modelo es a través de la Validación cruzada de K-Fold, que veremos en la Parte 10. Consiste en evaluar nuestro modelo en varios conjuntos de prueba (llamados conjuntos de validación), para que podamos asegurarnos de que no tengamos suerte en un solo conjunto de prueba. Hoy en día, la mayoría de los científicos de datos o desarrolladores de inteligencia artificial evalúan su modelo a través de la validación cruzada de K-Fold. Sin embargo, la técnica es un tema diferente, así que hemos preferido dejarlo para la Parte 10 después de que cubramos todos los diferentes modelos.

Exercise 3.7

¿Cómo volver a transformar la edad y el salario a su escala original?

Podemos volver a transformar Edad y Salario utilizando el método inverse_transform(). Para ello, tomamos nuestro objeto escalador sc y aplicamos el método inverse_transform() de esta manera:

X_train = sc.inverse_transform(X_train)
X_test = sc.inverse_transform(X_test)

Exercise 3.8

¿Cómo hacer la misma clasificación cuando las variables dependientes tienen más de dos categorías?

Expliquemos cómo hacerlo con tres clases.

Primero, sigue siendo el mismo código para hacer las predicciones. Además, aunque se basa en el método Uno contra Todos, ni siquiera necesitamos crear variables ficticias de nuestra variable dependiente.

En cuanto a las variables independientes, solo necesitamos aplicar LabelEncoder seguido de OneHotEncoder. Crearemos nuestras variables ficticias (dummies), independientemente del número de categorías que tengan nuestras variables categóricas.

Y eventualmente, simplemente necesitaremos agregar un color de esta manera:

# Visualización de los resultados del conjunto de entrenamiento
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1,
                               stop = X_set[:, 0].max() + 1,
                               step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1,
                               stop = X_set[:, 1].max() + 1,
                               step = 0.01))
plt.contourf(X1,
             X2,
             classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).
             reshape(X1.shape),
             alpha = 0.75,
             cmap = ListedColormap(('red', 'green', 'blue')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0],
                X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green', 'blue'))(i), label = j)
plt.title('Regresión Logística (Conjunto de Entrenamiento)')
plt.xlabel('Edad')
plt.ylabel('Salario Estimado')
plt.legend()
plt.show()

Como puedes ver en este código, solamente hemos agregado el color ‘azul’, lo cual lo tuvimos que hacer porque como ahora tenemos tres clases, entonces np.unique(y_set) se convierte en 3.

Exercise 3.9

¿Puedes explicar el método meshgrid() con más detalles y algunos de sus usos?

En el método meshgrid(), tenemos dos argumentos:

  • El primer argumento son los valores de rango de las coordenadas \(x\) en nuestra cuadrícula.
  • En segundo lugar, están los valores de rango de las coordenadas \(y\) en nuestra cuadrícula.

Entonces, digamos que estos argumentos primero y segundo son respectivamente \([-1, +1]\) y \([0,10]\), entonces obtendremos una cuadrícula donde los valores irán desde \([-1, +1]\) en el eje \(x\) y \([0,10]\) en el eje \(y\).

Exercise 3.10

¿Puede explicar el método contourf() con más detalles y algunos de sus usos?

Antes de usar el método contourf (contorno), se necesita construir una cuadrícula. Eso es lo que hacemos en la línea de arriba cuando construimos X1 y X2.

Entonces, el método contourf() toma varios argumentos:

  1. Los valores de rango de las coordenadas \(x\) de la cuadrícula,
  2. Los valores de rango de las coordenadas \(y\) de la cuadrícula,
  3. Una línea de ajuste (o curva) que se trazará en esta cuadrícula (trazamos esta línea de ajuste usando la función de predicción porque esta línea son las predicciones continuas de nuestro modelo),
  4. Luego, el resto son argumentos opcionales como los colores para trazar regiones de diferentes colores.

Las regiones estarán separadas por esta línea de ajuste, que es de hecho la línea de contorno.

3.1.3 Regresión Logística en R

Exercise 3.11 Hemos predicho los resultados de un conjunto de observaciones (el conjunto de prueba). ¿Cómo hacemos lo mismo para una sola observación?

Primero hay que crear una nueva variable single_observation con los valores de entrada (por ejemplo, Edad = 30 y Salario estimado = 50000) y establecer esta variable como un data frame:

single_observation = data.frame(Age = 30, EstimatedSalary = 50000)

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

prob_pred = predict(classifier, type = 'response', newdata = single_observation)
y_pred = ifelse(prob_pred > 0.5, 1, 0)

Exercise 3.12

¿Cómo hacemos el escalado inverso en R?

Puedes hacerlo con el siguiente código:

training_set[-3] * attr(training_set[-3], 'scaled:scale')
+ attr(training_set[-3], 'scaled:center')
test_set[-3] * attr(test_set[-3], 'scaled:scale')
+ attr(training_set[-3], 'scaled:center')
¿Cómo visualizar la misma clasificación cuando las variables dependientes tienen más de dos clases?

Supongamos que tenemos, por ejemplo, tres categorías (o clases). Entonces el código para la visualización sería el siguiente:

# Visualización de los resultados del conjunto de entrenamiento
library(ElemStatLearn)
set = training_set
X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01)
X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01)
grid_set = expand.grid(X1, X2)
colnames(grid_set) = c('PC1', 'PC2')
y_grid = predict(classifier, newdata = grid_set)
plot(set[, -3],
     main = 'SVM (Training set)',
     xlab = 'PC1', ylab = 'PC2',
     xlim = range(X1), ylim = range(X2))
contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE)
points(grid_set,
       pch = '.',
       col = ifelse(y_grid == 2,'deepskyblue', 
                    ifelse(y_grid == 1, 'springgreen3', 'tomato')))
points(set,
       pch = 21,
       bg = ifelse(set[, 3] == 2,
       'blue3', ifelse(set[, 3] == 1,
       'green4',
       'red3')))

3.2 K-Nearest Neighbors (K-NN)

3.2.1 Idea de K-NN

Exercise 3.13 ¿Es K-NN un modelo lineal?

No, K-NN es un modelo no lineal, como verás en las secciones prácticas de este curso.

Exercise 3.14

¿Qué pasa si encontramos el mismo número de vecinos? Por ejemplo, si elegimos K = 6 y si encontramos 3 puntos de datos en cada categoría, ¿dónde deberíamos colocar el nuevo punto de datos?

En ese caso, el punto se asigna aleatoriamente a uno de los dos.

Exercise 3.15

¿Qué tipo de problemas comerciales requiere el uso de K-NN?

K-NN puede ser una buena solución para el procesamiento del lenguaje natural. Veremos esto en la Parte 7. Además, K-NN funciona bien para problemas no lineales (cuando los datos no son separables linealmente), como veremos en esta sección (Python o R).

3.2.2 K-NN en Python

Exercise 3.16

¿Cuál es el significado de \(n = 5\) al construir el modelo K-NN?

n = 5 significa que se entrenará el modelo K-NN con 5 vecinos. Cuando vemos la clase de intuición para K-NN, n = 5 es el número de vecinos que Juan Gabriel menciona en los videos.

¿Qué número de vecinos debemos elegir?

Cuantos más vecinos tengamos, más posibilidades tendrá el grupo de vecinos de encontrar predicciones correctas y, por lo tanto, más posibilidades tendremos de aumentar la precisión del modelo. Sin embargo, hay que tener cuidado, si tenemos demasiados vecinos, eso provocará un ajuste excesivo en el conjunto de entrenamiento y las predicciones serán malas en las nuevas observaciones en el conjunto de prueba.

Exercise 3.17

¿Cómo puedo invertir la escala para obtener la escala original de las características?

Podemos volver a transformar Edad y Salario utilizando el método inverse_transform (). Se debe tomar el objeto escalador sc y aplicar el método inverse_transform() de esta manera:

X_train = sc.inverse_transform(X_train)
X_test = sc.inverse_transform(X_test)

3.2.3 K-NN en R

Exercise 3.18

¿Cómo visualizar la salida en forma de gráfico si el número de predictores es más de 2?

No podríamos porque un predictor corresponde a una dimensión. Entonces, si tenemos más de 2 predictores, sería difícil representar la salida visualmente. Si tenemos tres predictores, aún podríamos hacerlo usando algunos paquetes avanzados y, en ese caso, las regiones de predicción se convertirían en algunos volúmenes de predicción (se tratan de los espacios de región en 3 dimensiones), y el límite de predicción ya no sería una curva de ajuste, pero se convertiría en un plano curvo que separa los volúmenes de predicción. Sería un poco más difícil ver eso visualmente, pero aún es posible. Pero luego en 4+ dimensiones, eso sería ya muy difícil.

Exercise 3.19

¿Qué número de vecinos debemos elegir?

Cuantos más vecinos tengamos, más posibilidades tendrá el grupo de vecinos de encontrar predicciones correctas y, por lo tanto, más posibilidades tendremos de aumentar la precisión de su modelo. Sin embargo, hay que tener cuidado, si tenemos demasiados vecinos, eso provocará un ajuste excesivo en el conjunto de entrenamiento y las predicciones serán malas en las nuevas observaciones en el conjunto de prueba.

3.3 Support Vector Machine (SVM)

3.3.1 Idea de las SVM

Exercise 3.20

¿Son las SVM un modelo lineal?

Sí, SVM es un modelo lineal. Lo veremos fácilmente en las secciones prácticas de este curso, al visualizar los resultados en el gráfico (notarás que el límite de predicción es una línea recta). Sin embargo, podemos hacer del SVM sea un modelo no lineal, agregando un kernel, que veremos en la siguiente sección.

Exercise 3.21

¿Por qué vemos los vectores de soporte como vectores y no como puntos?

Los vectores son puntos en el espacio 2-D (como en este ejemplo), pero en problemas del mundo real tenemos conjuntos de datos de dimensiones más altas. En un espacio de \(n\) dimensiones, los vectores tienen más sentido y es más fácil hacer aritmética vectorial y manipulaciones matriciales en lugar de considerarlos como puntos. Por eso generalizamos los puntos de datos a vectores. Esto también nos permite pensar en ellos en un espacio de \(N\) dimensiones.

3.3.2 SVM en Python

Exercise 3.22

¿Qué hace aquí el método fit?

Simplemente entrenamos el modelo SVM en X_train e y_train. Más precisamente, el método fit recopilará los datos en X_train e y_train, y a partir de eso calculará los vectores de soporte. Una vez que se calculan los vectores de soporte, el modelo de clasificador está completamente listo para hacer nuevas predicciones con el método de predicción (porque solo requiere los vectores de soporte para clasificar nuevos datos).

3.3.3 SVM en R

Exercise 3.23

Si mi conjunto de datos tiene más de 2 variables independientes, ¿cómo represento la visualización?

En ese caso, no se puede representar la visualización, porque una variable independiente corresponde a una dimensión. Entonces, si tuvieramos, por ejemplo, 8 variables independientes, necesitaríamos crear una gráfica en 8 dimensiones. Eso sería imposible. Sin embargo, pueden utilizarse técnicas de reducción de dimensionalidad para reducir el número de variables independientes extrayendo las más significativas desde el punto de vista estadístico. Entonces, si logramos reducir sus 8 variables originales a dos, puede representarse la visualización en 2D.

Exercise 3.24

¿Por qué obtengo resultados diferentes en Python y R?

La diferencia puede provenir de una variedad de factores:

  • los factores aleatorios en el modelo y el hecho de que usamos diferentes semillas,
  • los diferentes valores predeterminados de los hiperparámetros (los parámetros que no se aprenden) pero lo más normal es elegir los mismos,
  • ligeras diferencias en los algoritmos entre Python y R.

3.4 Kernel SVM

3.4.1 Idea del Kernel SVM

Exercise 3.25

¿Por qué exactamente convertimos el espacio de alta dimensión en 3D de nuevo a 2D?

Eso es porque necesitamos volver a nuestro espacio original que contiene nuestras variables independientes. Si nos quedaramos en el espacio 3d perderíamos la información de las variables independientes porque en este espacio 3d no están nuestras variables independientes originales sino las proyecciones de las mismas. Entonces, deseamos volver al espacio 2d original proyectando los puntos hacia atrás.

Exercise 3.26 Cuando aplicamos la transformación \(f = x-5\), los puntos simplemente se mueven hacia la izquierda en el mismo eje 1D. Pero cuando aplicamos la transformación \(f = (x-5)^2\), ¿por qué los puntos se mueven a una curva en forma de U en 2D? ¿No deberían los puntos permanecer en el mismo eje en 1D?

Aquí están involucrados dos tipos diferentes de transformación, la primera es una transformación en una dimensión para la coordenada \(x\), y debe verse de esta manera:

\[x' = x - 5\]

Con esta transformación (llamada traslación), los puntos se mueven 5 unidades hacia la izquierda. Luego, ocurre la transformación de mapeo, que es la transformación de mapeo involucrada en Kernel SVM. Pero este debería verse de esta manera:

\[y = (x'-5)^2\]

donde \(y\) es la nueva coordenada que creamos con este mapeo en una dimensión superior.

Exercise 3.27

¿Qué kernel debemos elegir?

Una buena forma de decidir qué kernel es el más apropiado es hacer varios modelos con diferentes kernels, luego evaluar cada uno de sus rendimientos y finalmente comparar los resultados. Luego, elegimos el kernel con mejores resultados. Hay que tener cuidado de evaluar el rendimiento del modelo en nuevas observaciones (preferiblemente con K-Fold Cross Validation que veremos en la Parte 10) y de considerar diferentes métricas (Accuracy, F1-Score, etc.).

3.4.2 Kernel SVM en Python

¿Qué hace aquí el método fit?

Simplemente entrena el modelo SVM en X_train e y_train con un Kernel no lineal. Más precisamente, el método de ajuste recopilará los datos en X_train e y_train, y a partir de ahí hará todas las operaciones sucesivas que vimos en la lección de intuición: primero, un mapeo en un espacio dimensional superior donde los datos están linealmente separable, luego calculará los vectores de soporte en este espacio dimensional superior y, finalmente, una proyección de nuevo en 2D.

¿Cómo predecir el resultado de una única observación nueva?

Deben ingresarse los datos de la observación única en una matriz, escalarla con nuestro objeto escalador sc (necesitamos escalar aquí porque nuestro modelo fue entrenado con datos escalados) y usar el método de predicción como este:

single_prediction = classifier.predict(sc.transform(np.array([[30, 80000]])))

3.4.3 Kernel SVM en R

Exercise 3.28

¿Cómo saber fácilmente con R si el conjunto de datos no es separable linealmente?

Si es un problema de regresión, hacemos un modelo de regresión lineal múltiple con todas las variables independientes incluidas, y si es un problema de clasificación, hacemos un modelo de regresión logística con todas las variables independientes incluidas. Luego usamos la función de resumen de estadísticas summary() en R para ver los niveles de significancia estadística de sus variables independientes. Si algunos de ellos tienen significación estadística (p-valores pequeños), es probable que nuestro conjunto de datos sea linealmente separable. De lo contrario, es posible que el conjunto de datos no se pueda separar linealmente.

Exercise 3.29

Predijimos los resultados de un conjunto de observaciones (el conjunto de prueba). ¿Cómo hacemos lo mismo para una sola observación?

Primero debe crear una nueva variable single_observación con los valores de entrada (por ejemplo, Edad = 30 y Salario estimado = 50000) y establecer esta variable como un data frame:

single_observation = data.frame(Age = 30, EstimatedSalary = 50000)

Luego, simplemente puede predecirse el resultado de esta única observación exactamente como lo hicimos con el conjunto de prueba, simplemente reemplazando test_set por single_observation:

y_pred = predict(classifier, newdata = single_observation)

Exercise 3.30

¿Cómo hacer el cambio inverso de escala en R?

Puede hacerse con el siguiente código:

training_set[-3] * attr(training_set[-3], 'scaled:scale')
+ attr(training_set[-3], 'scaled:center')
test_set[-3] * attr(test_set[-3], 'scaled:scale')
+ attr(training_set[-3], 'scaled:center')

3.5 Naive Bayes

3.5.1 Idea de Naive Bayes Intuition

Exercise 3.31

¿Naive Bayes es un modelo lineal o no lineal?

Naive Bayes es un modelo no lineal. Lo veremos muy claramente en Python o R al representar el límite de predicción, que será una curva muy suave (derivable) que separará bien las observaciones distribuidas no linealmente.

Exercise 3.32

¿Puede ser \(P(x)\) cero?

Sí, \(P(X)\) puede ser cero. Eso puede suceder cuando el nuevo punto de datos es un valor atípico y, por lo tanto, no hay otros puntos de datos dentro del radio del círculo. Sin embargo, la fórmula del teorema de Naive Bayes solo es cierta cuando \(P(X)\) es diferente de cero. Cuando \(P(X)\) es igual a cero, entonces \(P(Walks) | X)\) simplemente se define como cero.

Exercise 3.33

¿Cómo decide el algoritmo el círculo?

En la lección de Intuición, vemos que se dibuja un círculo para crear una colección de puntos de datos similar al nuevo punto de datos. El nuevo punto de datos estaba aproximadamente en el centro del círculo y, por lo tanto, vimos que el número de puntos verdes era menor que el número de puntos rojos y, por lo tanto, el nuevo punto pasó a la categoría roja. Pero si hubiéramos dibujado el círculo de manera un poco diferente alrededor del nuevo punto de datos, entonces el número de puntos verdes podría haber sido más que rojo. Entonces, ¿cómo se elige ese círculo? Hay un parámetro en el modelo que decide el radio del círculo, al igual que hay un parámetro que elige el número de vecinos en K-NN.

Exercise 3.34

Naive Bayes vs K-NN

La mejor manera de responder a esa pregunta es probar ambos. Gracias a las plantillas que ofrecemos en nuestro curso, solo lleva unos minutos comparar los resultados. Basta entender que la principal diferencia entre los dos es que Naive Bayes se basa en un enfoque probabilístico, a diferencia del clásico de K-NN.

3.5.2 Naive Bayes en Python

Exercise 3.35

¿Qué hace aquí el método fit?

Simplemente entrena el modelo Naive Bayes en X_train e y_train. Más precisamente, el método de ajuste recopilará los datos en X_train e y_train, y a partir de ahí hará todas las operaciones sucesivas que vimos en la clase de intuición: primero obtendrá la probabilidad previa, la probabilidad marginal, la probabilidad y la probabilidad posterior, y luego, usando los círculos alrededor de las observaciones, aprenderá cómo clasificar estas observaciones y predecir resultados futuros.

Exercise 3.36

¿Cómo obtener las probabilidades como salida?

Esta es la forma de hacerlo:

y_proba = classifier.predict_proba(X_test)

Esto nos dará una matriz con 2 columnas, una para 0 y otra para 1.

3.5.3 Naive Bayes en R

Exercise 3.37

¿Por qué necesitamos convertir la variable dependiente como factor?

Hacemos esto para especificar que la variable dependiente es una variable categórica y que 0 y 1 debe tratarse como categorías (factores).

Exercise 3.38

¿En la función naiveBayes() se puede utilizar el argumento formula = Purchased $\sim$ . similar a especificar la x y la y como vimos en el curso?

Sí, sería lo mismo, pero necesitaríamos especificar el argumento data. Básicamente, se debe especificar cuál es la variable dependiente, la variable independiente y el conjunto de entrenamiento. Esa es información suficiente para que la función sepa cómo entrenar el modelo.

3.6 Clasificación con Árboles de Decisión

3.6.1 Idea de la Clasificación con Árboles de Decisión

Exercise 3.39

¿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 decisiones se trata de encontrar el atributo que devuelve la reducción de desviación estándar más alta (es decir, las ramas más homogéneas).

Exercise 3.40

¿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 se reduce la desviación estándar después de una división, más homogéneos resultan ser los nodos secundarios.

Exercise 3.41

¿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 aún encontremos algunos nodos donde los datos no sean homogéneos y, por lo tanto, la entropía no será tan pequeña.

3.6.2 Clasificación con Árboles de Decisión en Python

Exercise 3.42

¿Qué hace aquí el método fit?

Simplemente entrenará el modelo de árbol de decisión en X_train e y_train. Más precisamente, el método fit recogerá los datos en X_train e y_train, y a partir de ahí hará todas las operaciones sucesivas que vimos en la lección de intuición: primero seleccionará el criterio (que elegimos que sea la entropía en nuestro código), y luego dividirá los datos en diferentes nodos sucesivos en la dirección de reducción de entropía, hacia nodos más homogéneos. Finalmente, cuando se realicen todas las divisiones, estará completamente entrenado y listo para predecir los resultados de nuevas observaciones gracias al método predict ().

Exercise 3.43

¿Cómo representar la gráfica de un árbol en Python?

Así es como puede representarse un árbol de decisiones en Python (solo hay que agregar el siguiente código al final del nuestro que vemos en el curso):

# Representar el árbol
# En el terminal escribimos: pip install pydot2

from sklearn import tree
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydot
dot_data = StringIO()
tree.export_graphviz(classifier,
                     out_file = dot_data,
                     feature_names = ['Age', 'Estimated Salary'],
                     class_names = ['Yes', 'No'],
                     filled = True,
                     rounded = True,
                     special_characters = True)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())

3.6.3 Clasificación con Árboles de Decisión en R

Exercise 3.44

¿Cómo se hicieron las divisiones en R?

Se hacen estas divisiones con salarios agrupados en tres niveles, basados en la entropía y la ganancia de información. Las divisiones se realizan de manera que las partes resultantes de las divisiones sean lo más homogéneas posible.

Exercise 3.45

¿Por qué y_pred es una matriz en este modelo mientras que en todos los demás modelos es un vector?

Es una especificidad del modelo de árbol de decisión: las predicciones se devuelven en una matriz de dos columnas con las probabilidades \(prob (y = 0)\) y \(prob (y = 1)\).

3.7 Clasificación con Random Forest

3.7.1 Idea de la Clasificación con Random Forest

Exercise 3.46

¿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 darnos un mayor poder de predicción que los árboles de decisión. Inconveniente: el árbol de decisiones nos dará más interpretabilidad que los bosques aleatorios, porque puede dibujarse el gráfico de un árbol de decisiones para ver las diferentes divisiones que conducen a la predicción, como se ve en la clase de intuición. Eso es algo que no puedes hacer con Random Forest.

Exercise 3.47

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

La mejor respuesta a esa pregunta es: ¡debemos probarlos todos!

De hecho, gracias a las plantillas, solo te llevará 10 minutos probar todos los modelos, 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 clasificación y comparar los resultados (a través de la validación cruzada que veremos en la Parte 10). Eso es, te brindamos los mejores modelos en este curso para que los tengas en su 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ás cómo hacerlo en la Parte 10: Selección de modelos. Luego:

  • Si tu problema es lineal, debes optar por un modelo de regresión logística o un modelo SVM, porque ambos son modelos lineales.
  • Si tu problema no es lineal, debes optar por K-NN, Kernel SVM, Naive Bayes, Árboles de Decisión o Random Forest. Entonces, ¿cuál deberías elegir entre estos cinco? Eso 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 los modelos, llamada k-Fold Cross Validation, y luego seleccionar el modelo que muestra los mejores resultados. Siéntete libre de pasar directamente a la Parte 10 si ya deseas aprender cómo hacerlo.

3.7.2 Clasificación con Random Forest en Python

Exercise 3.48

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

Primero, te recomendaría elegir el número de árboles experimentando. Por lo general, lleva 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 aprendizaje automático: lo hacemos en varias tomas, experimentando varios valores de hiperparámetros como el número de árboles. Sin embargo, también te recuerdo que en la Parte 10 cubriremos la Validación cruzada de k-Fold y la Búsqueda de cuadrícula, que son técnicas poderosas que pueden usarse para encontrar el valor óptimo de un hiperparámetro, como aquí el número de árboles.

3.7.3 Clasificación con Random Forest en R

Exercise 3.49

¿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 modelos. Se realiza con una técnica llamada Ajuste de parámetros (búsqueda de cuadrícula con validación cruzada de k-Fold).

Exercise 3.50

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

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

Exercise 3.51

¿Cómo se puede reducir el sobreajuste de los bosques aleatorios?

Puedes hacerlo jugando con los parámetros de penalización y regularización si hay algunos en la clase utilizados para construir el modelo. Sin embargo, la forma mejor y más eficiente de reducir el sobreajuste, especialmente para los bosques aleatorios, es aplicar la validación cruzada de k-fold y optimizar un parámetro de ajuste con remuestreo de los datos. No te preocupes, veremos todo esto en profundidad en la Parte 10: Selección de modelos y Ensemble Learning.

3.8 Evaluación del rendimiento de los modelos de clasificación

Exercise 3.52

¿Cuánto debemos fiarnos de la matriz de confusión?

Podemos usar la matriz de confusión para tener una idea de cuán potencialmente bien puede funcionar nuestro modelo. Sin embargo, no debemos limitar nuestra evaluación del rendimiento a la precisión en una división de prueba de tren, como es el caso en la matriz de confusión. Primero, está el problema de la varianza, por lo que debemos aplicar la validación cruzada de k-Fold para obtener una medida más relevante de la precisión. Aprenderás cómo hacerlo en la primera sección de la Parte 10: Selección de modelo. Entonces, no solo está la accuracy como medida única que debe considerarse. También deben considerarse otras métricas como Precision, Recall y F1 Score. Lo veremos en detalle en la Parte 7.

Exercise 3.53

¿Es la curva de ganancia acumulada lo mismo que la curva CAP?

Sí, es lo mismo, la Curva de Ganancia (Gain Curve) es el nombre de la curva CAP en un contexto de marketing.

Exercise 3.54

Si contactamos a 20000 clientes y 4000 responden, ¿por qué esto no tiene un efecto multiplicador? Entonces, si me dirijo a 100000 clientes, ¿debería obtener una respuesta de 50000?

La idea aquí es que podemos maximizar las ganancias seleccionando a los clientes que pueden comprar más, de modo que si la \(P(cliente \ compre)\) es mayor que algún umbral, entonces deberíamos enviar un correo electrónico.

La idea es que nunca obtendrás una respuesta de 50.000 ya que, pase lo que pase, solo 10.000 clientes comprarán en cada oferta.

Entonces, lo que nos gustaría hacer es que de nuestra base de clientes de 100,000, deben seleccionarse esos 10,000 clientes exactamente que comprarán para la oferta actual. Si tenemos un modelo tan bueno, que puede identificar con precisión a todos los que van a comprar, entonces podemos simplemente enviar un correo electrónico a esa cantidad de personas.

Aquí no hay efecto multiplicativo. Incluso si enviamos correos electrónicos a todos los clientes (100k), solo se comprarán 10k. (El 90 % de los clientes no suele estar interesado en cada oferta). Nuestro objetivo aquí es minimizar los correos electrónicos que enviamos enviando correos electrónicos a los 10k que comprarán nuestra oferta. Por lo tanto, podemos usar modelos probabilísticos para predecir si un cliente comprará o no. Si la probabilidad de que el cliente compre es superior a algún umbral, podemos enviarle un correo electrónico. Esto aumentará las posibilidades de que cada cliente compre la oferta, manteniendo al mínimo el número de correos electrónicos que deben enviarse.

Exercise 3.55

¿Deberíamos representar la curva CAP en Python o R?

Se recomienda más la plantilla de Excel proporcionada en el curso. Primero, exporta tus valores en Python:

classifier = SVC(kernel = 'rbf', probability = 1, random_state = 0)
Y_pred_proba = classifier.predict_proba(X_test)
Y_cap = np.c_[Y_test, Y_pred_proba[:, 1:]]
dataframe = pd.DataFrame(data = Y_cap)
dataframe.to_csv('CAP.csv', sep=';')

Luego, utiliza esta plantilla de curva CAP que te dará directamente la curva CAP una vez que pegues los valores exportados dentro de esta plantilla. En cuanto a R, hay un par de paquetes de R que puedes usar para calcular una curva CAP: ROCR y MASS.

Exercise 3.56

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

Lo que deseamos obtener cuando construimos un modelo es: un sesgo y una varianza bajas en ambos casos.