我正在使用 GridSearchCV 训练一个 Ann 机器学习模型,但在 gridSearchCV 中遇到了 IndexError

Posted

技术标签:

【中文标题】我正在使用 GridSearchCV 训练一个 Ann 机器学习模型,但在 gridSearchCV 中遇到了 IndexError【英文标题】:I was training an Ann machine learning model using GridSearchCV and got stuck with an IndexError in gridSearchCV 【发布时间】:2020-01-27 14:50:59 【问题描述】:

我的模型开始训练并在执行一段时间时出现错误:- IndexError:索引 37 超出轴 0 的范围,大小为 37

它可以为我的模型正确执行,而无需使用带有固定参数的 gridsearchCV

这是我的代码

    from keras.wrappers.scikit_learn import KerasClassifier
    from sklearn.model_selection import GridSearchCV
    from keras.models import Sequential
    from keras.layers import Dense
    def build_classifier(optimizer, nb_layers,unit):
        classifier = Sequential()
        classifier.add(Dense(units = unit, kernel_initializer = 'uniform', activation = 'relu', input_dim = 14))
        i = 1
        while i <= nb_layers:
            classifier.add(Dense(activation="relu", units=unit, kernel_initializer="uniform"))
            i += 1
        classifier.add(Dense(units = 38, kernel_initializer = 'uniform', activation = 'softmax'))
        classifier.compile(optimizer = optimizer, loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])
        return classifier
    classifier = KerasClassifier(build_fn = build_classifier)
    parameters = 'batch_size': [10,25],
                  'epochs': [100,200],
                  'optimizer': ['adam'],
                  'nb_layers': [5,6,7],
                  'unit':[48,57,76]
                 
    grid_search = GridSearchCV(estimator = classifier,
                               param_grid = parameters,
                               scoring = 'accuracy',
                              cv=5,n_jobs=-1)
    grid_search = grid_search.fit(X_train, y_train)
    best_parameters = grid_search.best_params_
    best_accuracy = grid_search.best_score_

【问题讨论】:

欢迎来到 SO;请将您的帖子中的错误消息复制并粘贴为 text - 看看为什么an image of your exception isn't helpful. 【参考方案1】:

看看你的 y_train 的形状。它必须是某种形状的热(,37)

【讨论】:

【参考方案2】:

这是一个具有大量类(38 个类)的多类分类器。 GridSearchCV 似乎没有通过分层抽样来拆分您的数据集,可能是因为您没有足够的数据和/或您的数据集不是类平衡的。

根据documentation:

对于整数/无输入,如果估计器是分类器并且 y 是 使用二元或多类,StratifiedKFold。在所有其他 情况下,使用 KFold。

通过使用categorical_crossentropy,KerasClassifier 将使用keras.utils.to_categorical 将目标(类向量(整数))转换为二进制类矩阵。由于有 38 个类,每个目标将被转换为 38 维的二进制向量(索引从 0 到 37)。

我猜在某些拆分中,验证集没有来自所有 38 个类的样本,因此目标被转换为维度

【讨论】:

【参考方案3】:

错误IndexError: index 37 is out of bounds for axis 0 with size 37 表示您的对象中没有索引为 37 的元素。

在python中,如果你有一个像数组或列表这样的对象,它的元素以数字索引,如果它有n元素,则索引将从0变为n-1(这是一般情况,使用数据帧中的重新索引除外)。

因此,如果您拥有 37 个元素,则只能检索 0-36 之间的元素。

【讨论】:

以上是关于我正在使用 GridSearchCV 训练一个 Ann 机器学习模型,但在 gridSearchCV 中遇到了 IndexError的主要内容,如果未能解决你的问题,请参考以下文章

GridsearchCV 上的预处理

如何使用不同的数据集进行 GridSearchCV 训练和测试?

在 GridSearchCV 中显式指定测试/训练集

GridSearchCV - 错误:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

GridSearchCV 的替代方法,用于查找 SVM 模型的参数

使用 Imblearn 管道和 GridSearchCV 进行交叉验证