Python Xgboost: ValueError('feature_names may not contain [, ] or <')

Posted

技术标签:

【中文标题】Python Xgboost: ValueError(\'feature_names may not contain [, ] or <\')【英文标题】:Python's Xgoost: ValueError('feature_names may not contain [, ] or <')Python Xgboost: ValueError('feature_names may not contain [, ] or <') 【发布时间】:2018-07-16 16:23:42 【问题描述】:

XGBClassifier 的 Python 实现 does not accept 字符 [, ] or &lt;' 作为特征名称。

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

ValueError('feature_names may not contain [, ] or

似乎显而易见的解决方案是传递等效的 numpy 数组,并完全摆脱列名,但如果他们没有这样做,那一定是有原因的。

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

【问题讨论】:

您是如何解决这个问题的? :] 我看到的唯一评论是:# prohibit to use symbols may affect to parse. e.g. []&lt;。你也可以从你的 pandas DF 中删除标题 我通过在 fit、predict、predict_proba 等中使用 .values 解决了这个问题。事实上,我创建了一个包装器,这样我就可以保留接口并随意传递 Pandas DataFrames。但是我想知道不使用熊猫我错过了什么。他们想用列名来做某事,对吧? 如果你指的是xgboost,我不这么认为。当我将模型转储到 .txt 文件时,他们将“所谓的标题”重命名为数字。所以树中的分裂就像:如果 f[1] 【参考方案1】:

我知道已经很晚了,但是在这里为可能面临此问题的其他人写下这个答案。这是我在遇到这个问题后发现的: 如果您的列名包含符号 [ or ] or &lt;,则通常会发生此错误。 这是一个例子:

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 &lt; 的通用方法:

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。这就是检查失败并引发错误。

【讨论】:

列表理解中的错字:df.columns,而不是 df.columns.values【参考方案2】:

这是另一种正则表达式解决方案。

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]

【讨论】:

【参考方案3】:

另一个解决方案:

X.columns = X.columns.str.translate("".maketrans("[":"", "]":"","&lt;":"^"))

如果您有兴趣了解哪些是罪魁祸首:

X.columns[X.columns.str.contains("[\[\]&lt;]")]

【讨论】:

以上是关于Python Xgboost: ValueError('feature_names may not contain [, ] or <')的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中为 xgboost 编写自定义评估指标?

xgboost python windows编译问题

WIN7-64 python xgboost 安装

如何调用xgboost python

从python中的xgboost中提取决策规则

windows下xgboost安装到python