Cómo elegir el número de estimadores para Gradient Boosting

En Data Science, hay muchos algoritmos disponibles para usar en estos días. Una técnica útil, por lo tanto, es combinarlos en un solo modelo para obtener lo mejor de cada uno, lo que da como resultado un modelo más preciso.

Usando Scikit-Learn, encontrará el algoritmo Random Forest, que es el tipo de modelo de conjunto de embolsado. Por otro lado, también encontrarás modelos Boosting, que entrenan los estimadores en secuencia, donde el resultado de un modelo se pasa al siguiente, que intentará mejorar las predicciones, hasta llegar a un resultado óptimo.

Al crear un estimador de Gradient Boosting, encontrará este hiperparámetro n_estimator=100 con un valor predeterminado de 100 árboles que se crearán para obtener un resultado. Muchas veces, simplemente establecemos esto en el valor predeterminado o tal vez aumentamos según sea necesario, incluso utilizando técnicas de búsqueda de cuadrícula.

En esta publicación, encontraremos una manera simple de llegar a un solo número para usar para entrenar nuestro modelo.

Gradient Boosting se puede cargar desde Scikit-Learn usando esta clase from sklearn.ensemble import GradientBoostingRegressor. El algoritmo Gradient Boosting se puede utilizar para clasificación o para modelos de regresión. Es un estimador basado en árbol, lo que significa que está compuesto por muchos árboles de decisión.

El resultado de la Árbol 1 generará errores. Esos errores se utilizarán y la entrada para el Árbol 2. Nuevamente se utilizarán los errores del último modelo y la entrada del siguiente, hasta llegar al n_estimators .

Cada modelo se ajustará a los errores del anterior. Imagen del autor.

Dado que cada estimador se ajustará al error del anterior, la expectativa es que la combinación de las predicciones sea mejor que cualquiera de los estimadores solos. Después de cada iteración, hacemos que el modelo sea más complejo, reduciendo el sesgo pero aumentando la varianza, por otro lado. Así que debemos saber cuándo parar.

Veamos cómo hacerlo ahora.

El código para este ejercicio es simple. Todo lo que debemos hacer es un bucle después de cada iteración y verificar en cuál tuvimos el error más bajo.

Comencemos eligiendo un conjunto de datos. Usaremos el accidentes automovilísticos conjunto de datos, nativo de la biblioteca seaborn (por lo tanto, datos abiertos bajo licencia BDS).

# conjunto de datos
df = sns.load_dataset('car_crashes')

He aquí un vistazo rápido a los datos. Intentaremos estimar la total cantidad usando las otras características como predictores. Dado que es una salida de número real, estamos hablando de un modelo de regresión.

Conjunto de datos de accidentes automovilísticos, de marino. Imagen del autor.

Mirando rápidamente las correlaciones.

# Correlaciones
df.corr().style.background_gradient(cmap='coolwarm')
Correlaciones en el conjunto de datos. Imagen del autor.

Ok, no hay gran multicolinealidad. Podemos ver eso ins_premium y ins_losses no se correlaciona muy bien con el total , por lo que no los consideraremos en el modelo.

Si comprobamos los datos que faltan, no hay ninguno

# Desaparecido
df.isnull (). sum ()
0

Bien, entonces dividamos los datos ahora.

# X y Y
X = df.drop(['ins_premium', 'ins_losses', 'abbrev', 'total'], eje=1)
y = df['total']
# Prueba de tren
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=22)

Podemos crear una canalización para escalar los datos y modelarlos (realmente no es muy necesario escalar estos datos, ya que ya están en la misma escala, en la base de las decenas). A continuación, ajustamos los datos al modelo y predecimos los resultados.

Estoy usando 500 estimadores con un learning_rate de 0.3.

La tasa de aprendizaje es el tamaño del paso que damos para llegar al mínimo error. Si usamos un valor que es demasiado alto, podemos pasar el mínimo. Si usamos un número que es demasiado pequeño, es posible que ni siquiera nos acerquemos a él. Entonces, una regla general que puede considerar es: si tiene una gran cantidad de estimadores, puede usar valores más bajos de tasa de aprendizaje. Si solo tiene unos pocos estimadores, prefiera usar valores más altos de tasa de aprendizaje.

pasos = [('escala', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# Canalización de instancias y ajuste
tubería = Tubería(pasos).fit(X_tren, y_tren)
# Predecir
preds = tubería.predict(X_test)

Ahora, evaluando.

# RMSE de las predicciones
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[SALIDA]: RMSE: 1.1# Media de los verdaderos valores de Y
print(f'Datos y media: {ronda( y.media(),1 )}')
[SALIDA]: Datos y media: 15.8

Bien. Nuestro RMSE es aproximadamente el 6.9% de la media. Así que nos equivocamos por mucho, en promedio.

Ahora veamos una forma de ajustar nuestro modelo eligiendo el número óptimo de estimadores para entrenar que nos dará la tasa de error más baja.

Como dije, realmente no tenemos que escalar estos datos porque ya están en la misma proporción. Así que ajustemos el modelo.

#Modelo
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

Ahora es lo bueno. Hay un método en Gradient Boosting que nos permite iterar sobre las predicciones de cada estimador entrenado, de 1 a 500. Entonces, crearemos un bucle que pase por los 500 estimadores en el gbr modelo, predice resultados usando el método staged_predict(), calcula el error cuadrático medio y almacena el resultado en la lista errors.

# Bucle para el mejor número
errores = [ mean_squared_error(y_test, preds) for preds in gbr.staged_predict(X_test)]
# Número óptimo de estimadores
número_estimadores_óptimos = np.argmin(errores) + 1

A continuación, podemos trazar el resultado.

#Gráfico
g=sns.lineplot(x=rango(500), y=errores)
g.set_title(f'Mejor número de estimadores en {mejores_n_estimadores}', tamaño=15);
Mejor número de estimadores. Imagen del autor.

Vemos que la tasa de error más baja es con 34 estimadores. Entonces, volvamos a entrenar nuestro modelo con 34 estimadores y comparemos con el resultado del modelo entrenado con la canalización.

# Volver a entrenar
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# predicciones
preds2 = gbr.predict(X_test)

Evaluando…

# RMSE de las predicciones
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[SALIDA]: RMSE: 1.0
# Datos Y media
print(f'Datos y media: {ronda( y.media(),1 )}')
[SALIDA]: Datos y media: 15.8

Bajamos del 6.9 % al 6.3 % de descuento ahora. Aprox. 9% mejor. Veamos algunas predicciones.

Predicciones de ambos modelos. Imagen del autor.

Resultados interesantes. Algunas de las predicciones del segundo modelo son mejores que las del primero.

Aprendimos cómo determinar el mejor número de estimadores para ajustar un GradientBoostingRegressor de Scikit-Learn. Este es un hiperparámetro que puede marcar la diferencia en este tipo de modelo de conjunto, que entrena estimadores en secuencia.

A veces, después de algunas iteraciones, el modelo puede comenzar a sobreajustarse, por lo que comenzará a aumentar demasiado la varianza, lo que afectará las predicciones.

Vimos que un bucle simple puede ayudarnos a encontrar la solución óptima en este caso. Pero, ciertamente, para grandes conjuntos de datos puede ser costoso calcularlo, por lo que una idea sería intentar una menor n_estimators al principio y vea si puede alcanzar el error mínimo lo suficientemente pronto.

Aquí está la código completo en GitHub.

Si te ha gustado este contenido, sigue mi blog.

Encuéntrame en Etiqueta LinkedIn.

Este ejercicio se basó en el excelente libro de texto de Aurélien Géron, en la referencia.

Cómo elegir el número de estimadores para Gradient Boosting republicado de la fuente https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 vía https://towardsdatascience.com/feed

<!–

->

Sello de tiempo:

Mas de Consultores Blockchain