【问题标题】:Error in scikit.learn cross_val_scorescikit.learn cross_val_score 中的错误
【发布时间】:2014-12-17 16:51:18
【问题描述】:

请参考以下地址的笔记本

LogisticRegression

这部分代码,

scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
print scores
print scores.mean()

在window 7 64位机器中产生如下错误

---------------------------------------------------------------------------
 IndexError                                Traceback (most recent call last)
 <ipython-input-37-4a10affe67c7> in <module>()
 1 # evaluate the model using 10-fold cross-validation
 ----> 2 scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=10)
  3 print scores
  4 print scores.mean()

 C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in    cross_val_score(estimator, X, y, scoring, cv, n_jobs, verbose, fit_params, score_func, pre_dispatch)
  1140                         allow_nans=True, allow_nd=True)
  1141 
  -> 1142     cv = _check_cv(cv, X, y, classifier=is_classifier(estimator))
  1143     scorer = check_scoring(estimator, score_func=score_func, scoring=scoring)
  1144     # We clone the estimator to make sure that all the folds are

  C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in _check_cv(cv, X, y, classifier, warn_mask)
  1366         if classifier:
  1367             if type_of_target(y) in ['binary', 'multiclass']:
  -> 1368                 cv = StratifiedKFold(y, cv, indices=needs_indices)
  1369             else:
  1370                 cv = KFold(_num_samples(y), cv, indices=needs_indices)

  C:\Python27\lib\site-packages\sklearn\cross_validation.pyc in __init__(self, y, n_folds, indices, shuffle, random_state)
  428         for test_fold_idx, per_label_splits in enumerate(zip(*per_label_cvs)):
  429             for label, (_, test_split) in zip(unique_labels, per_label_splits):
--> 430                 label_test_folds = test_folds[y == label]
 431                 # the test split can be too big because we used
 432                 # KFold(max(c, self.n_folds), self.n_folds) instead of

IndexError: too many indices for array 

我正在使用 scikit.learn 0.15.2,建议 here 可能是 Windows 7、64 位机器的特定问题。

==============更新==============

我发现下面的代码确实有效

 from sklearn.cross_validation import KFold
 cv = KFold(X.shape[0], 10, shuffle=True, random_state=33)
 scores = cross_val_score(LogisticRegression(), X, y, scoring='accuracy', cv=cv)
 print scores

==============更新2=============

似乎由于某些软件包更新,我无法再在我的机器上重现此类错误。如果您在 Windows 7 64 位机器上遇到同样的问题,请告诉我。

【问题讨论】:

  • y的形状是什么?
  • 有效和无效之间的唯一区别是 cvX.shape[0] == 6366 还有吗?
  • @eickenberg cv=10 会尝试分层 10 倍简历,KFold 不会。
  • 如果其他条件相同,明确输入 cv=StratifiedKFold(y, 10) 将是我的下一个诊断步骤。
  • 这是您所做的唯一更改吗?因为如果可行,那么 cv=number 也应该(见@larsmans 评论)

标签: python scikit-learn cross-validation


【解决方案1】:

导入这个模块,它应该可以工作:

from sklearn.model_selection import cross_val_score

【讨论】:

  • 错误信息显示,这不是错误,因为它可以处理方法,但不能处理其中提供的数组。
【解决方案2】:

我知道答案已经晚了。
但是这个答案可能会帮助其他人在同样的错误中挣扎。 我对 python 3.6 有同样的问题 从 3.6 更改为 3.5 后,我就可以使用该功能了。
以下是我运行的示例:

accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 10, n_jobs = -1)

首先使用 3.5 版本创建 conda env。

conda create -n py35 python=3.5  
source activate py35  

希望这将有助于继续前进

【讨论】:

    【解决方案3】:

    当我发现这个问题时,我遇到了与您相同的错误并且正在寻找答案。

    我使用了相同的 sklearn.cross_validation.cross_val_score(不同的算法除外)和相同的机器 windows 7、64 位。

    我从上面尝试了您的解决方案,它“有效”,但它给了我以下警告:

    C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn\cross_validation.py:1531:DataConversionWarning:当需要一维数组时,传递了列向量 y。请将 y 的形状更改为 (n_samples, ),例如使用 ravel()。 estimator.fit(X_train, y_train, **fit_params)

    阅读警告后,我认为问题与“y”(我的标签列)的形状有关。从警告中尝试的关键字是“ravel()”。所以,我尝试了以下方法:

    y_arr = pd.DataFrame.as_matrix(label)
    print(y_arr)
    print(y_arr.shape())
    

    这给了我

      [[1]
       [0]
       [1]
       .., 
       [0]
       [0]
       [1]]
    
      (87939, 1)
    

    当我添加“ravel()”时:

    y_arr = pd.DataFrame.as_matrix(label).ravel()
    print(y_arr)
    print(y_arr.shape())
    

    它给了我:

    [1 0 1 ..., 0 0 1]
    
    (87939,)
    

    'y_arr' 的维度必须是 (87939,) 而不是 (87939,1) 的形式。 之后,我原来的 cross_val_score 没有添加 Kfold 代码就可以工作了。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-06-07
      • 2017-12-12
      • 2017-08-28
      • 2021-03-14
      • 2019-06-29
      • 2015-06-27
      • 2019-07-18
      • 2022-10-04
      • 2018-03-06
      相关资源
      最近更新 更多