【发布时间】:2021-12-31 00:32:59
【问题描述】:
我正在对数据集进行交叉验证并获得
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
在 kFCVEvaluate 的 for 循环的第二次迭代开始时出错。我做错了什么?
我查看了有关此错误的其他帖子,它们是关于使用和/或运算符,但我不使用任何逻辑运算符。
from sklearn.tree import DecisionTreeRegressor
model = DecisionTreeRegressor(random_state = 42, max_depth=5)
def split_dataset(dataset):
numFolds=10
dataSplit = list()
dataCopy = list(dataset)
foldSize = int(len(dataset) / numFolds)
for _ in range(numFolds):
fold = list()
while len(fold) < foldSize:
index = randrange(len(dataCopy))
fold.append(dataCopy.pop(index))
dataSplit.append(fold)
return dataSplit
def kFCVEvaluate(dataset):
folds = split_dataset(data)
scores = list()
for fold in folds:
trainSet = list(folds)
trainSet.remove(fold)
trainSet = sum(trainSet, [])
testSet = list()
for row in fold:
rowCopy = list(row)
testSet.append(rowCopy)
trainLabels = [row[-1] for row in trainSet]
trainSet = [train[:-1] for train in trainSet]
model.fit(trainSet,trainLabels)
actual = [row[-1] for row in testSet]
testSet = [test[:-1] for test in testSet]
predicted = model.predict(testSet)
accuracy = actual-predicted
scores.append(accuracy)
print(scores)
kFCVEvaluate(data)
【问题讨论】:
-
我查看了有关此错误的其他帖子,它们是关于使用和/或运算符,但我不使用任何逻辑运算符。
-
回溯在哪里?
-
已经要求回溯,我可能不应该这样做。但如果我不得不猜测,
trainSet.remove(fold)就是问题所在。 Listremove按值选择要删除的项目(实际上是id优先)。因此,它遍历列表,直到找到==测试用例的项目。但如果列表包含数组,您将进行arr1==arr2测试,该测试将返回一个布尔数组。但是remove只能接受一个简单的真/假。 -
重复谈论熊猫系列,而您的错误是数组。在任何情况下,在需要标量布尔值的 python 上下文中使用多元素布尔值的问题。
if、and、or是常见的上下文。我在这里看不到任何一个(除了while)。any/all修复仅适用于部分案例。但首要任务是确定哪个操作有错误。实际修复会有所不同。
标签: python python-3.x numpy machine-learning scikit-learn