Introducción a árboles de decisión

1

¿Qué son los árboles de decisión?

2

Tu primer árbol de decisión con scikit-learn

3

Análisis de datos para tu primer árbol de decisión

4

Entrenamiento y evaluación de árbol de decisión con scikit-learn

5

¿Cómo funcionan los árboles de decisión?

6

¿Cuándo usar árboles de decisión?

Quiz: Introducción a árboles de decisión

Proyecto práctico: árboles de decisión

7

Conociendo problema a resolver y dataset de clasificación

8

Análisis exploratorio de datos para árbol de decisión

9

Procesamiento de datos para el entrenamiento de árbol de decisión

10

Entrenamiento de modelo de clasificación con árbol de decisión

11

¿Cómo evaluar un modelo de árbol de decisión?

12

Evaluación de resultados del modelo de árbol de decisión

Quiz: Proyecto práctico: árboles de decisión

Introducción a random forest

13

¿Qué son los random forest o bosques aleatorios?

14

Tu primer random forest con scikit-learn

15

Análisis de datos para tu primer random forest

16

Entrenamiento de tu primer modelo de random forest con scikit-learn

17

Evaluación de tu primer modelo de random forest con scikit-learn

18

¿Cómo funcionan los random forest?

19

¿Cuándo utilizar random forest?

Quiz: Introducción a random forest

Proyecto práctico: random forest

20

Entrenamiento de modelo de clasificación de carros con random forest

21

Evaluación de resultados del modelo de clasificación con random forest

Quiz: Proyecto práctico: random forest

Conclusión

22

Proyecto final y cierre

23

Comparte tu proyecto de Random Forest y obtén tu certificado

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Entrenamiento y evaluación de árbol de decisión con scikit-learn

4/23
Recursos

Aportes 13

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para los que les lance este error

TypeError: barplot() takes from 0 to1 positional arguments but 2 positional arguments

Es porque están trabajando con una versión más reciente de seaborn, que la que se emplea en el curso.

Para resolver este error toca que crear un nuevo DataFrame con los importances y columns

importances = tree.feature_importances_
columns = X.columns
data = pd.DataFrame([importances], columns=columns)

sns.barplot(
    data, palette='bright', saturation=2.0, edgecolor='black', linewidth=2
)
plt.title('Importancia de cada Feature')
plt.show()

Así, de esta forma, ya podemos obtener nuestra gráfica sin ningún error

Optimización de parametros , construccióm y evaluación del modelo

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris

# Definir el clasificador y los valores de los hiperparámetros a probar
clf = DecisionTreeClassifier()
param_grid = {'criterion': ['gini', 'entropy'], 'max_depth': [2, 3, 4, 5]}

# Realizar la búsqueda de hiperparámetros utilizando GridSearchCV
grid_search = GridSearchCV(clf, param_grid=param_grid, cv=10)
grid_search.fit(X_train, y_train)

# Imprimir los resultados
print("Mejores hiperparámetros encontrados:")
print(grid_search.best_params_)
print("Mejor puntuación de validación cruzada:")
print(grid_search.best_score_)

# Modelo con parametros optimizados
best_clf = grid_search.best_estimator_

# Predecimos Y
y_train_pred = best_clf.predict(X_train)
y_test_pred = best_clf.predict(X_test)

# Importamos matriz de confusion
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test,y_pred)
# Graficamos matriz de confusion
from sklearn.metrics import confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
cm = confusion_matrix(y_test,y_test_pred,labels=best_clf.classes_)
ConfusionMatrixDisplay(cm, display_labels=best_clf.classes_).plot()
# Calculo de las predicciones en Train y test
y_train_pred = best_clf.predict(X_train)
y_test_pred = best_clf.predict(X_test)
from sklearn.metrics import accuracy_score
print('El accuracy en train es:',accuracy_score(y_train,y_train_pred))
print('El accuracy en test es:', accuracy_score(y_test,y_test_pred))
# Verificamos el feature importances
importances = grid_search.best_estimator_.feature_importances_
importances = np.sort(importances)[::-1]
columns = X.columns

sns.barplot(x=columns, y=importances);
plt.title('Factores principales que influyen en la supervivencia del pasajero');

Sí les sale el error solo asignen la variable x=columns y la variable y=importances; de esta manera:

import seaborn as sns

importances = tree.feature_importances_
columns = X.columns
sns.barplot(x= columns,y= importances, palette = 'bright', saturation = 2.0, edgecolor = 'black', linewidth = 2)
plt.title('Importancia de cada Feature')
plt.show()

En lo personal me gustaria saber como funciona sklearn en su interior para hacer las predicciones.

Que el acc en train no este tan alejado que el acc en test nos indica una buena performance.
Si el acc en train hubiese sido 95% vs el acc en test 76% diríamos que el modelo estaría con overfiting y tendríamos que cambiar sus parámetros

***USO DE LA SEMILLA (random\_state)*** El parámetro `random_state` en diversas funciones de bibliotecas como scikit-learn se utiliza para controlar la reproducibilidad de los resultados aleatorios. Puede tomar varios valores, y cada valor producirá un resultado diferente. Aquí hay algunos detalles sobre cómo puedes elegir y utilizar el `random_state`: 1. **Número Entero Fijo:** Puedes proporcionar un número entero fijo como semilla. Esto garantiza que, si vuelves a ejecutar tu código con la misma semilla, obtendrás los mismos resultados aleatorios.pythonCopy code`random_state = 42 # Puedes elegir cualquier número entero` 2. **None (o Sin Especificar):** Si no proporcionas un valor para `random_state` o lo estableces en `None`, el resultado será diferente en cada ejecución. Esto es útil si deseas resultados aleatorios diferentes cada vez.pythonCopy code`random_state = None # O simplemente no establecer random_state` 3. **Número Aleatorio:** También puedes usar cualquier número aleatorio como semilla. En este caso, el resultado variará en cada ejecución.pythonCopy code`import` random `random_state = random.randint(1, 1000) # Un número aleatorio` 4. **Seed Fijo y Variable Aleatoria:** Puedes combinar un número fijo con una parte aleatoria para obtener reproducibilidad y variabilidad.pythonCopy code`import` random `random_state = 42 + random.randint(1, 1000) # Semilla fija + parte aleatoria` En resumen, la elección del `random_state` depende de tus necesidades. Si deseas resultados reproducibles, establece un número fijo. Si buscas variabilidad en cada ejecución, déjalo como `None` o no lo especifiques.
Solo un pequeño comentario: Al analizar la importancia de cada caracteristica para inferir cuales son las variables necesarias para construir un modelo mas simple/eficaz estamos "tomando decisiones sobre el modelo" Esto tipicamente debería hacerse en una fase conocida como **validación**, en donde básicamente optimizamos a un nivel alto las configuraciones de nuestro modelo. En este caso pienso que es mejor llamar a `X_test `y a `y_test `como `X_val `y `y_val `(Haciendo referencia a que son datos que el modelo va usar para ser mejorado) Y que sirven para tomar decisiones. El conjunto de **testeo** solo debería ser usado para reportar resultados, ya que es pensado exclusivamente para estimar el bias del modelo.
si tienes un DataFrame, solo necesitas pasar los nombres de las columnas directamente a Seaborn, y si no tienes un DataFrame, puedes especificar los datos usando los parámetros `x` e `y`. `sns.barplot(x=columns, y=importances, palette='bright', saturation=2, edgecolor='black', linewidth=2)`

Me gusta esta demostracion en la cual se debe analizar el funcionamiento de este y como lo podemos implementar por medio de una grafica de seaborn. En la universidad nunca enseñaron esa parte. Solo era el codigo y ver la metrica si coincidia el resultado.

Una mejor forma de hacer el barplot con matplotlib sería:

importances = np.sort(dt.feature_importances_)
columns = X.columns[np.argsort(importances)]

ax = plt.figure().gca()
ax.bar(x=columns, height=importances, edgecolor='k')
ax.invert_xaxis()
ax.set(title='Importancia de cada feature')
plt.show()

De esta manera se muestran las barras en orden descendente (primero se ordenan ascendentemente y se invierte el orden del eje x).

me parece curioso el uso de 00000 para el random_state, la documentación dice.

Integer values must be in the range [0, 2**32 - 1].

supongo que viene siendo simplemente un solo 0

https://scikit-learn.org/stable/glossary.html#term-random_state

A mi me funcionó este código para deslegar el gráfico: import seaborn as sns import matplotlib.pyplot as plt importances = tree.feature\_importances\_ columns = X.columns \# Crear un DataFrame con las columnas y sus importancias importance\_df = pd.DataFrame({'Feature': columns, 'Importance': importances}) \# Ordenar el DataFrame por importancia en orden descendente importance\_df = importance\_df.sort\_values(by='Importance', ascending=False) \# Crear el gráfico de barras horizontal plt.figure(figsize=(10, 6)) sns.barplot(x='Importance', y='Feature', data=importance\_df, palette='bright', saturation=2.0) plt.title('Importancia de cada feature') plt.xlabel('Importancia') plt.ylabel('Feature') plt.show()
Si tienen problemas en la parte de verificamos el feature, esto se debe a que nose le esta asignando los valores a x o y, pueden usar este código si desean \# Verificamos el feature importancesimport seaborn as snsimport matplotlib.pyplot as plt importances = tree.feature\_importances\_columns = X.columns \# Usamos palabras clave para x e y en barplotsns.barplot(x=columns, y=importances, palette='bright', saturation=2.0, edgecolor='black', linewidth=2) plt.title('Importancia de cada Feature')plt.xticks(rotation=90)  # Rotamos las etiquetas en el eje x si son muchas columnasplt.show()