sklearn 具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all() 错误
Posted
技术标签:
【中文标题】sklearn 具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all() 错误【英文标题】:Sklearn the truth value of an array with more than one element is ambiguous. Use a.any() or a.all() error 【发布时间】:2019-10-08 18:34:40 【问题描述】:我正在尝试使用我在网上看到的训练数据集的代码,但似乎无法解决上述错误。
当我第一次运行代码时,我得到了上述错误:
ValueError Traceback (most recent call last)
----> 2 knn_cv.fit(X_train, y_train)
<ipython-input-21-fb975450c609> in fit(self, X, y)
214 X = normalize(X, norm='l1', copy=False)
215
--> 216 cv = check_cv(self.cv, X, y)
/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_split.py in
check_cv(cv, y, classifier)
1980
1981 if isinstance(cv, numbers.Integral):
-> 1982 if (classifier and (y is not None) and
1983 (type_of_target(y) in ('binary', 'multiclass'))):
1984 return StratifiedKFold(cv)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
错误似乎在函数 check_cv 中,看起来 y_train 正在抛出布尔值,但我不确定如何修改它。我知道原因是通常可以修改的“和”语句,但在这种情况下,错误存在于 check_cv 函数中,我不确定如何修改该语句。 我尝试了使用 a.any() 或 a.all() 的建议操作,但每次都会抛出一个新错误。
如果我使用 y_train.any() 它给了我一个错误:
269 if y.ndim > 2 or (y.dtype == object and len(y) and
270 not isinstance(y.flat[0], str)):
--> 271 return 'unknown' # [[[1, 2]]] or [obj_1] and not
["label_1"]
272
273 if y.ndim == 2 and y.shape[1] == 0:
TypeError: len() of unsized object
如果我使用 y_train.all(),它会说 TypeError: 'KFold' 对象不可迭代
另一个查询建议将数组更改为列表,但它给了我 np.array(y_train).tolist() 结果: TypeError: len() of unsized object
也更新了 sklearn,但似乎没有修复错误。希望有人能解释什么是错的或我如何修改代码(如果可能的话也解释一下。 这部分代码我还是有点陌生)
使用 GoogleNews-vectors-negative300.bin.gz 创建的训练样本
y_train = array([ 3, 17, 14, 14, 5, 13,... 0, 1, 17, 16, 2])
y_train.shape() = (100,)
X_train =
X = check_array(X_train, accept_sparse='csr', copy=True)
print(X)
(0, 679) 1.0
(0, 701) 1.0
(0, 1851) 2.0
(0, 1889) 1.0
(0, 2498) 1.0
(0, 2539) 1.0
(0, 2589) 1.0
(0, 2679) 1.0...
X.shape = (100, 5100)
我附上了代码的主要部分,如果您需要对整个内容的参考,我在下面提供了链接 http://vene.ro/blog/word-movers-distance-in-python.html
def fit(self, X, y):
if self.n_neighbors_try is None:
n_neighbors_try = range(1, 6)
else:
n_neighbors_try = self.n_neighbors_try
X = check_array(X, accept_sparse='csr', copy=True)
X = normalize(X, norm='l1', copy=False)
cv = check_cv(self.cv, X, y)
knn = KNeighborsClassifier(metric='precomputed', algorithm='brute')
scorer = check_scoring(knn, scoring=self.scoring)
scores = []
for train_ix, test_ix in cv:
dist = self._pairwise_wmd(X[test_ix], X[train_ix])
knn.fit(X[train_ix], y[train_ix])
scores.append([
scorer(knn.set_params(n_neighbors=k), dist, y[test_ix])
for k in n_neighbors_try
])
scores = np.array(scores)
self.cv_scores_ = scores
best_k_ix = np.argmax(np.mean(scores, axis=0))
best_k = n_neighbors_try[best_k_ix]
self.n_neighbors = self.n_neighbors_ = best_k
return super(WordMoversKNNCV, self).fit(X, y)
knn_cv = WordMoversKNNCV(cv=3,n_neighbors_try=range(1, 20),
W_embed=W_common, verbose=5, n_jobs=3)
knn_cv.fit(X_train, y_train.all())
根据作者的说法,我应该得到这个:
[Parallel(n_jobs=3)]: Done 12 tasks | elapsed: 30.8s
[Parallel(n_jobs=3)]: Done 34 out of 34 | elapsed: 2.0min finished
[Parallel(n_jobs=3)]: Done 12 tasks | elapsed: 25.7s
[Parallel(n_jobs=3)]: Done 33 out of 33 | elapsed: 2.9min finished
[Parallel(n_jobs=3)]: Done 12 tasks | elapsed: 53.3s
[Parallel(n_jobs=3)]: Done 33 out of 33 | elapsed: 2.0min finished
WordMoversKNNCV(W_embed=memmap([[ 0.04283, -0.01124, ..., -0.05679, -0.00763],
[ 0.02884, -0.05923, ..., -0.04744, 0.06698],
...,
[ 0.08428, -0.15534, ..., -0.01413, 0.04561],
[-0.02052, 0.08666, ..., 0.03659, 0.10445]]),
cv=3, n_jobs=3, n_neighbors_try=range(1, 20), scoring=None,
verbose=5)
【问题讨论】:
找出 if 语句中的哪个项正在生成一个布尔数组。不要猜测。测试。 @hpaulj 在我看来 y_train 导致了布尔值,这让我感到困惑,因为 y_train 只是一个一维数组触发布尔值的常见原因通常是应该是“和”语句通常通过用“&”替换“和”来解决,但对于这种情况,它似乎位于 check_cv 函数中,我不知道如何修复 您能否提供一个仍然会产生错误的更简单的示例?这样一来,问题和答案就会对遇到它的其他人有用。 这个问题可能会有所帮助:***.com/questions/10062954/… 显示y_train
的样本。它的形状是什么,里面有什么?
【参考方案1】:
您使用 check_cv
错误。根据the documentation:-
check_cv(cv=’warn’, y=None, classifier=False):
cv : int,
cross-validation generator or an iterable, optional
y : array-like, optional
The target variable for supervised learning problems.
classifier : boolean, optional, default False
Whether the task is a classification task,
in which case stratified KFold will be used
所以它需要y
和estimator
输入。但是您提供的 X
和 y
是错误的。更改以下行:
cv = check_cv(self.cv, X, y)
knn = KNeighborsClassifier(metric='precomputed', algorithm='brute')
到:
knn = KNeighborsClassifier(metric='precomputed', algorithm='brute')
cv = check_cv(self.cv, y, knn)
注意行的顺序。
【讨论】:
感谢您的成功!但我有点困惑,因为现在 check_cv 只包含 y 数据集,这是否意味着我需要连接 X_train 和 y_train 数据集?因为后面的代码需要 X[train_ix] 和 y[train_ix] @bonedinocheck_cv
仅用于检查交叉验证迭代器的类型,是否与y
兼容。它不会影响您的任何其他代码。以上是关于sklearn 具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all() 错误的主要内容,如果未能解决你的问题,请参考以下文章
scipy.optimize.curve_fit ValueError:具有多个元素的数组的真值不明确
NumPy 错误:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
GridSearchCV - 错误:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
SciPy PearsonR ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
Model.fit with ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()