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

所以它需要yestimator 输入。但是您提供的 Xy 是错误的。更改以下行:

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] @bonedino check_cv 仅用于检查交叉验证迭代器的类型,是否与y 兼容。它不会影响您的任何其他代码。

以上是关于sklearn 具有多个元素的数组的真值是模棱两可的。使用 a.any() 或 a.all() 错误的主要内容,如果未能解决你的问题,请参考以下文章

石榴 HMM 标签:具有多个元素的数组的真值是不明确的。

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()