LightGBM: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

LightGBM: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我 运行 lightgbm 具有分类特征:

X_train, X_test, y_train, y_test = train_test_split(train_X, train_y, test_size=0.3)

train_data = lgb.Dataset(X_train, label=y_train, feature_name=X_train.columns, 
                                  categorical_feature=cat_features)

test_data = lgb.Dataset(X_test, label=y_train, reference=train_data)

param = {'num_trees': 4000, 'objective':'binary', 'metric': 'auc'}
bst = lgb.train(param, train_data, valid_sets=[test_data], early_stopping_rounds=100)

结果是错误:

if self.handle is not None and feature_name is not None and feature_name != 'auto':

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我检查了 Whosebug 上的其他类似错误,主要与 numpy 相关,然后我检查了文档并尝试用 [0, 2, 5, ...] 之类的索引替换我的 categorical_feature(我原来的是专栏分类特征的名称),仍然是同样的错误。

我也试过用列索引替换label,还是报错。

有人能帮忙吗?提前致谢。

我认为,您通过 feature_name 的方式有问题。构造函数需要一个列表,然后将其传递 pandas.core.indexes.base.Index。问题是在这样的对象 feature_name != 'auto' 条件下,错误提到的 if 语句中的行为是按元素进行的。因此 or 尝试加入 boolnumpy.ndarray.

一个简单的解决方案是转换为列表 (feature_name=X_train.columns.tolist()) 或使用 feature_name='auto',这将从内部 pd.DataFrame 中提取名称

我也发现 drop feature_name 有效。

train_data = lgb.Dataset(X_train, label=y_train, categorical_feature=cat_features)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

param = {'num_trees': 4000, 'objective':'binary', 'metric': 'auc'}
bst = lgb.train(param, train_data, valid_sets=[test_data], early_stopping_rounds=100)