【问题标题】:LightGBM: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()LightGBM:ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
【发布时间】:2018-12-01 14:19:40
【问题描述】:

我正在运行具有分类特征的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)

原来是错误:

如果 self.handle 不是 None 并且 feature_name 不是 None 并且 feature_name != 'auto':

ValueError:具有多个元素的数组的真值是 模糊的。使用 a.any() 或 a.all()

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

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

有人可以帮忙吗?提前致谢。

【问题讨论】:

标签: python lightgbm


【解决方案1】:

我还发现 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)

【讨论】:

  • 这是因为feature_name='auto' 是默认值
【解决方案2】:

我认为,您传递feature_name 的方式存在问题。构造函数需要一个列表,然后 oyu 将其传递给 pandas.core.indexes.base.Index。问题在于,在错误提到的 if 语句中的此类对象 feature_name != 'auto' 上,条件是元素方面的。因此or 尝试加入boolnumpy.ndarray

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

【讨论】:

    猜你喜欢
    • 2020-05-12
    • 2016-01-26
    • 2017-04-10
    • 2020-07-02
    • 2014-07-04
    相关资源
    最近更新 更多