Python的Xgoost:ValueError(' feature_names可能不包含[,]或<')

时间:2018-02-06 14:56:35

标签: python pandas numpy scikit-learn xgboost

Python将XGBC分类器does not accept的字符[, ] or <'实现为功能名称。

如果发生这种情况,会引发以下情况:

  

ValueError(&#39; feature_names可能不包含[,]或&lt;&#39;)

似乎显而易见的解决方案是传递等效的numpy数组,并完全删除列名,但如果他们没有完成它,那必定是有原因的。

XGBoost对功能名称有什么用处,简单地传递Numpy Arrays而不是Pandas DataFrames的缺点是什么?

2 个答案:

答案 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]