En este artículo veremos un ejemplo de bagging con BaggingRegressor. Lo que haremos será entrenar un algoritmo de bagging y devolver las prestaciones para el conjunto de test.
Recordemos que el bagging es un método que consiste en reducir la varianza de los árboles de decisión, que, en función de la división de los resultados, pueden ser muy distintos.
Ejemplo de bagging
Observemos el siguiente código:
#Ejemplo de bagging
from sklearn.ensemble import BaggingRegressor
maxDepth = range (1, 10)
#param_grid = {'max_depth': maxDepth} --> esto falla
param_grid = {'base_estimator__max_depth' : maxDepth}
grid = GridSearchCV (BaggingRegressor (base_estimator = DecisionTreeRegressor (), n_estimators = 200, random_state = 0), param_grid = param_brid, cv = 3, verbose = 2)
grid.fit (X_train, y_train)
print ("best mean cross - validation score: {: . 3f}".format (grid.best_score))
print ("best parameters: { }".format (grid.best_params))
#Ejemplo de bagging
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
Lo que vemos es que la subida de la curva va siendo cada vez menor, así que podríamos cortar más o menos en 6.
En el param_grid se tiene que pasar una cadena de texto con el nombre del parámetro. Pero esto va a fallar, porque el BaggingRegressor no tiene max_depth; entonces, para acceder a los parámetros de lo que dentro de BaggingRegressor se denomina base_estimator, que internamente son métodos privados, hay que hacerlo de este modo: param_grid = {‘base_estimator__max_depth’ : maxDepth}.
Esto va a funcionar porque nuestro base estimator es un árbol de decisión, por lo que sabemos que, en este caso, tenemos max_depth. La forma de llamarlo únicamente dentro de bagging es la que ya hemos mencionado.
#Ejemplo de bagging
maxDepthOptimo = 6
br = Bagging]Regressor (max_depth = maxDepthOptimo).fit (X_train, y_train)
print ("Train: ", rf.score (X_train, y_train))
print ("Test: ", rf.score (X_test, y_test))
#Ejemplo de bagging
importances = np.mean ([tree.feature_importances_ for tree in br.estimators_], axis = 0)
importances = importances / np.max (importances)
indices = np.argsort (importances) [ : : - 1]
plt.figure (figsize = (10, 10))
plt.barh (range (X_train.shape [1]), importances [indices])
plt.yticks (range (X_train.shape [1]), feature_names [indices])
plt.show ()
Como el BaggingRegressor no necesariamente funciona con árboles, sino que funciona con cualquier modelo que nosotros queramos, este no tiene implementado un método que calcule las feature importances. No lo tiene implementado porque no va a usarlo necesariamente, ya que no tenemos por qué disponer de un modelo dentro que permita usar feature importances. Entonces, como esto no está claro, no existe esta opción.
No obstante, en el caso de que nuestro modelo interno permita usar feature importances, lo que nos permite es acceder a cada una de las cosas que hay dentro del bagging. Es por eso que, en este caso, estimators_ se usa para ver la lista de estimators.
Si quieres seguir aprendiendo más sobre Big Data, una de las disciplinas más importantes en la actualidad, te invitamos a seguir el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de 8 meses de duración en la que adquirirás todas las herramientas teóricas y prácticas para seguir cumpliendo tus objetivos de ser un exitoso data scientist. Además, tendrás a los mejores profesionales acompañándote en todo momento y guiando tu camino hacia tus metas. ¡No le des más vueltas y solicita más información ahora!