Python将XGBC分类器does not accept的字符[, ] or <'
实现为功能名称。
如果发生这种情况,会引发以下情况:
ValueError(&#39; feature_names可能不包含[,]或&lt;&#39;)
似乎显而易见的解决方案是传递等效的numpy数组,并完全删除列名,但如果他们没有完成它,那必定是有原因的。
XGBoost对功能名称有什么用处,简单地传递Numpy Arrays而不是Pandas DataFrames的缺点是什么?
答案 0 :(得分:6)
我知道现在已经很晚了,但是对于其他可能面临这种情况的人来说,这个答案就是这样。这是我在面对这个问题后发现的:
如果您的列名称包含符号[ or ] or <
,则通常会发生此错误。
这是一个例子:
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)
上面的代码会抛出错误:
ValueError: feature_names may not contain [, ] or <
但是如果从'[test1]'
中删除那些方括号,那么它可以正常工作。以下是从列名中删除[, ] or <
的一般方法:
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)
有关更多信息,请参阅此代码行xgboost core.py: xgboost/core.py。这是错误被抛出的检查失败。
答案 1 :(得分:0)
重新导入
regex = re.compile(r“ [|] | <”,re.IGNORECASE)
X_train.columns = [regex.sub(“ _”,col)如果有(对于set(('[',']','<')))中x的str(col)中的x X_train.columns.values中的col]