No estoy muy seguro de cómo funciona xgboost en teoría. Pero dado que xgboost es un clasificador basado en árbol, ¿está bien suponer que no es necesaria la normalización de características?
no, no tienes que normalizar las características
Creo que entiendo que, en principio, no hay necesidad de normalización al impulsar árboles.
Sin embargo, se puede ver bastante impacto al escalar el objetivo y, especialmente con ' reg: gamma ', pero también (en menor medida) para ' reg: linear ' (el valor predeterminado). ¿Cuál es la razón para esto?
Ejemplo para el conjunto de datos de Boston Housing:
import numpy as np
import xgboost as xgb
from sklearn.metrics import mean_squared_error
from sklearn.datasets import load_boston
boston = load_boston()
y = boston['target']
X = boston['data']
for scale in np.logspace(-6, 6, 7):
xgb_model = xgb.XGBRegressor().fit(X, y / scale)
predictions = xgb_model.predict(X) * scale
print('{} (scale={})'.format(mean_squared_error(y, predictions), scale))
2.3432734454908335 (escala = 1e-06)
2.343273977065266 (escala = 0.0001)
2.3432793874455315 (escala = 0.01)
2.290595204136888 (escala = 1.0)
2.528513393507719 (escala = 100.0)
7.228978353091473 (escala = 10000.0)
272.29640759874474 (escala = 1000000.0)
El impacto de escalar y es realmente grande cuando se usa ' reg: gamma ':
for scale in np.logspace(-6, 6, 7):
xgb_model = xgb.XGBRegressor(objective='reg:gamma').fit(X, y / scale)
predictions = xgb_model.predict(X) * scale
print('{} (scale={})'.format(mean_squared_error(y, predictions), scale))
591.6509503519147 (escala = 1e-06)
545.8298971540023 (escala = 0.0001)
37.68688286293508 (escala = 0.01)
4.039819858716935 (escala = 1.0)
2.505477263590776 (escala = 100.0)
198.94093800190453 (escala = 10000.0)
592.1469169959003 (escala = 1000000.0)
@tqchen Al leer su excelente Introducción a Boosted Trees , no me queda claro por qué el escalado de características no es necesario en términos matemáticos.
Comentario más útil
no, no tienes que normalizar las características