La implementación de Python de XGBClassifier no acepta los caracteres [, ] or <' como nombres de funciones.
Si eso ocurre, plantea lo siguiente:
ValueError('feature_names may not include [, ] or <')
Parecería que la solución obvia sería pasar las matrices numpy equivalentes y deshacerse de los nombres de las columnas por completo, pero si no lo han hecho, debe ser por una razón.
¿Qué uso tiene XGBoost para los nombres de funciones y cuál es la desventaja de simplemente pasar Numpy Arrays en lugar de Pandas DataFrames?
Sé que es tarde, pero escribo esta respuesta aquí para otras personas que puedan enfrentar esto. Esto es lo que encontré después de enfrentar este problema: este error generalmente ocurre si los nombres de sus columnas tienen los símbolos [ or ] or < . Aquí hay un ejemplo:
import pandas as pd import numpy as np from xgboost.sklearn import XGBRegressor # test input data with string, int, and symbol-included columns df = pd.DataFrame({'0': np.random.randint(0, 2, size=100), '[test1]': np.random.uniform(0, 1, size=100), 'test2': np.random.uniform(0, 1, size=100), 3: np.random.uniform(0, 1, size=100)}) target = df.iloc[:, 0] predictors = df.iloc[:, 1:] # basic xgb model xgb0 = XGBRegressor(objective= 'reg:linear') xgb0.fit(predictors, target)El código anterior arrojará un error:
ValueError: feature_names may not contain [, ] or < Pero si elimina esos corchetes de '[test1]' , entonces funciona bien. A continuación se muestra una forma genérica de eliminar [, ] or < de los nombres de sus columnas:
import re import pandas as pd import numpy as np from xgboost.sklearn import XGBRegressor regex = re.compile(r"\[|\]|<", re.IGNORECASE) # test input data with string, int, and symbol-included columns df = pd.DataFrame({'0': np.random.randint(0, 2, size=100), '[test1]': np.random.uniform(0, 1, size=100), 'test2': np.random.uniform(0, 1, size=100), 3: np.random.uniform(0, 1, size=100)}) df.columns = [regex.sub("_", col) if any(x in str(col) for x in set(('[', ']', '<'))) else col for col in df.columns.values] target = df.iloc[:, 0] predictors = df.iloc[:, 1:] # basic xgb model xgb0 = XGBRegressor(objective= 'reg:linear') xgb0.fit(predictors, target)Para obtener más información, lea esta línea de código de xgboost core.py: xgboost/core.py . Esa es la comprobación en su defecto que arroja el error.
import re regex = re.compile(r"\[|\]|<", re.IGNORECASE) X_train.columns = [regex.sub("_", col) if any(x in str(col) for x in set(('[', ']', '<'))) else col for col in X_train.columns.values]Otra solución más:
X.columns = X.columns.str.translate("".maketrans({"[":"{", "]":"}","<":"^"}))
Si te interesa ver cuales son los culpables:
X.columns[X.columns.str.contains("[\[\]<]")]