web-dev-qa-db-ja.com

Python Xgboost:ValueError( 'feature_namesには[、]または<'を含めることはできません)

PythonによるXGBClassifierの実装 受け入れません 文字[, ] or <'機能名として。

それが発生した場合、それは以下を発生させます:

ValueError( 'feature_namesには[、]または<'を含めることはできません)

明らかな解決策は、同等のnumpy配列を渡し、列名を完全に削除することであるように思われますが、それが行われていない場合は、それが理由である必要があります。

XGBoostは機能名にどのような用途があり、Pandas DataFrames)の代わりにNumpy Arraysを渡すだけの欠点は何ですか?

7
sapo_cosmico

私はそれが遅いことを知っていますが、これに直面するかもしれない他の人々のためにここにこの答えを書きます。この問題に直面した後に私が見つけたものは次のとおりです。このエラーは通常、列名に記号[ 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 。これがチェックの失敗であり、エラーがスローされます。

15
Abhimanu Kumar

これは別の正規表現ソリューションです。

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]
0
Yaqi Li