Árbol de decisión de un conjunto de test

| Última modificación: 1 de julio de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este post veremos cómo realizar el árbol de decisión de un conjunto de test. Probaremos con un árbol de decisión sencillo, en primera instancia, para ver cómo se comporta el modelo predictivo y sea más fácil de entender.

Árbol de decisión de un conjunto de test

Vamos a hacer un árbol de decisión individual.

#Árbol de decisión de un conjunto de test
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree

maxDepth = range (1, 9)
param grid = ('max_depth: maxDepth }
grid = GridSearchCV (DecisionTreeClassifier (random_state = 0), param_grid = param_grid, cv = 5)
grid.fit (X_train, y_train)
print ("best mean cross-validation score: (: . 3f}".format (grid.best_score_))
print ("best parameters: ".format (grid.best_params_))

#Árbol de decisión de un conjunto de test
scores = np.array (grid.cv_results ['mean_test_score"])
plt.plot (maxDepth, scores, '-o')
plt.xlabel ('max_depth, fontsize = 16)
plt.ylabel ('10 - Fold MSE)
#plt.ylim ((-1, 0))
plt.show ()

best mean cross-validation score: 0.736

best parameters: {‘max_depth’ :4}

Árbol de decisión de un conjunto de test

Vemos, pues, que el mejor parámetro es 4.

Ahora observemos cómo salen las cosas en test.

#Árbol de decisión de un conjunto de test
maxDepthOptimo = grid.best_params_ ['max_depth"] - 2
treeModel = DecisionTreeClassifier (max_depth -maxDepthOptimo) fit (x_train, y_train)

print ("Train: ", treeModel.score (X_train, y_train))
print("Test: " , treeModel.score (X test, y test))

Train: 0.7638436432084691

Test: 0.8051948051948052

Este es un valor de test. Aunque no es bueno, sí es bastante aceptable al menos.

Ahora pintemos el árbol que hemos entrenado por medio de graphviz:

#Árbol de decisión de un conjunto de test
from sklearn.tree import export_graphviz
import graphviz

dot_data = tree.export graphviz (treeModel, out_file = None, feature names = features, class names = 'No', 'Yes,' filled = True, rounded = True, special characters = True)
graph = graphviz.Source (dot_data)
graph

Parece un problema complicado de clasificar, porque la profundidad óptima del árbol es 2. El algoritmo está bien entrenado porque la diferencia entre train y test es pequeña. Si queremos mejorar prestaciones tendremos que acudir a un modelo más complejo.

Recurrentemente lo que estamos haciendo es escoger el parámetro que mejor se adapta en entrenamiento y, después, lo estamos probando en test. Teniendo esto en cuenta, ¿no tendría sentido en cada interacción lanzar el predict en test para ir viendo los resultados de la elección del parámetro en función de los datos de los resultados en test?

La opinión general es que, si vamos a buscar la pureza, no deberíamos hacer eso, porque el conjunto de test lo usamos únicamente para evaluar un modelo escogido al final. ¿Por qué se hace esto? Porque, en caso contrario, lo que se estaría haciendo es una prueba para preguntar en test, luego otra prueba para preguntar en test, y así sucesivamente cuantas veces sea necesario, hasta que al final nos quedaremos con el resultado que mejor dé en test. De este modo, estamos usando el conjunto de test para seleccionar el modelo, que es precisamente lo que no se debe hacer.

Ahora, la realidad es que eso puede pasar. Para evitarlo, una cosa que se hace es coger nuestros datos, hacer nuestro estudio y nuestras pruebas; podemos evaluar en test y luego volvemos atrás y decimos que tal cosa es overfitting, por ejemplo. Cuando has acabado todo el análisis, lo que haces es coger tus datos inicial, los vuelves a aleatorizar y haces otro conjunto de entrenamiento y otro conjunto de test y vuelves a evaluar en test.

Lo que sucede es que, tradicionalmente, lo que solemos hacer es entrenar toda la parte de entrenamiento y probar los resultados en test. No obstante, esto es entrar en un círculo vicioso porque, al final, eliges el parámetro en train y lo pruebas en test, pero puede suceder que el que obtiene el mejor resultado en test realmente no es el que nos da mejor ajuste en train. Por eso, ha de suponerse que en unas ocasiones sirve esta técnica y en otras no.

El gran inconveniente con esto es que, si lo que hacemos es coger subconjuntos de test y probarlos, vamos a escoger el modelo que más se adapte solo teniendo en cuenta una parte del conjunto de datos, no el dataset completo.

Y así es como podemos resolver nuestro árbol de decisión de un conjunto de test.

Si te ha gustado este post sobre el árbol de decisión de un conjunto de test y quieres seguir aprendiendo, no olvides unirte a nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva en la que tendrás la oportunidad de adquirir todos los conocimientos necesarios para convertirte en un gran data scientist. ¡No esperes más y solicita información ahora!

Sandra Navarro

Business Intelligence & Big Data Advisor & Coordinadora del Bootcamp en Data Science, Big Data & Machine Learning.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado