类型错误:只有长度为 1 的数组可以转换为 Python 标量,同时使用 Kfold 交叉验证

Posted

技术标签:

【中文标题】类型错误:只有长度为 1 的数组可以转换为 Python 标量,同时使用 Kfold 交叉验证【英文标题】:TypeError: only length-1 arrays can be converted to Python scalars, while using Kfold cross Validation 【发布时间】:2017-02-16 10:02:28 【问题描述】:

我正在尝试为我的模型使用Kfold 交叉验证,但这样做时出现此错误。我知道KFold 只接受一维数组,但即使在将长度输入转换为数组之后,它也会给我这个问题。

from sklearn.ensemble import ExtraTreesClassifier, RandomForestClassifier
from sklearn.cross_validation import train_test_split
from sklearn.cross_validation import KFold

if __name__ == "__main__":
  np.random.seed(1335)

  verbose = True
  shuffle = False
  n_folds = 5

  y = np.array(y)

  if shuffle: 
    idx = np.random.permutation(y.size)
    X_train = X_train[idx]
    y = y[idx]

  skf = KFold(y, n_folds) 

  models = [RandomForestClassifier(n_estimators=100, n_jobs=-1, criterion='gini'),ExtraTreesClassifier(n_estimators=100, n_jobs=-1, criterion='entropy')]

  print("Stacking in progress")
  A = []
  for j, clf in enumerate(models):
     print(j, clf)

     for i, (itrain, itest) in enumerate(skf):
        print("Fold :", i)
        x_train = X_train[itrain]
        x_test = X_train[itest]
        y_train = y[itrain]
        y_test = y[itest]
        print(x_train.shape, x_test.shape)

        print(len(x_train), len(x_test))

        clf.fit(x_train, y_train)
        pred = clf.predict_proba(x_test)
        A.append(pred)

我收到“skf = KFold(y, n_folds)”行的错误。对此的任何帮助将不胜感激。

【问题讨论】:

y 是如何定义的?另外,你的例子应该是最小的:包含 4 个分类器真的有用吗? y 被定义为训练集的目标变量。不,不是我会编辑它。 所以不再需要模型和 j 循环了 :) 一个简单的例子更容易让我们理解并更快地发现错误。请参阅我对使用 KFold 的回答。 【参考方案1】:

从its doc,KFold() 不期望y 作为输入,而只是分割的数量(n_folds)。

一旦有了KFold 的实例,您就可以使用myKfold.split(x)x 是您的所有输入数据)来获得生成训练和测试索引的迭代器。从 sklearn doc 粘贴的示例副本:

>>> from sklearn.model_selection import KFold
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([1, 2, 3, 4])
>>> kf = KFold(n_splits=2)
>>> kf.get_n_splits(X)
2
>>> print(kf)  
KFold(n_splits=2, random_state=None, shuffle=False)
>>> for train_index, test_index in kf.split(X):
...    print("TRAIN:", train_index, "TEST:", test_index)
...    X_train, X_test = X[train_index], X[test_index]
...    y_train, y_test = y[train_index], y[test_index]
TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]

【讨论】:

以上是关于类型错误:只有长度为 1 的数组可以转换为 Python 标量,同时使用 Kfold 交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

处理.csv文件。错误:只有整数标量数组可以转换为标量索引。

转换为常量类型,初始化数组

在C#中怎么显示把double类型数组转换成string类型数组

TypeError:只有一个元素的整数数组可以转换为索引

TypeError:只有一个元素的整数数组可以转换为索引 3

怎么遍历只有id和pid 的数组排序