Я обучал модель машинного обучения Энн с помощью GridSearchCV и застрял с IndexError в gridSearchCV - PullRequest
0 голосов
/ 27 сентября 2019

Моя модель начинает тренироваться и при выполнении в течение некоторого времени выдает ошибку: - 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_

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

Это многоклассовый классификатор с огромным количеством классов (38 классов).Кажется, что GridSearchCV не разделяет ваш набор данных с помощью стратифицированной выборки, возможно, потому, что у вас недостаточно данных и / или ваш набор данных не сбалансирован по классам.

В соответствии с документация :

Для входных данных типа integer / None, если оценщик является классификатором, а y является двоичным или мультиклассовым, используется StratifiedKFold.Во всех других случаях используется KFold.

Используя categoryorical_crossentropy , KerasClassifier преобразует цели (вектор класса (целые числа)) в матрицу двоичного классаиспользуя keras.utils.to_categorical .Поскольку существует 38 классов, каждая цель будет преобразована в двоичный вектор измерения 38 (индекс от 0 до 37).

Я полагаю, что в некоторых разделениях набор проверки не имеет выборок из всех38 классов, поэтому цели преобразуются в векторы измерения <38, но, поскольку GridSearchCV оснащен выборками из всех 38 классов, он ожидает векторы измерения = 38, что вызывает эту ошибку. </p>

0 голосов
/ 27 сентября 2019

Посмотрите на форму вашего y_train.Это должна быть какая-то горячая форма (, 37)

0 голосов
/ 27 сентября 2019

Ошибка IndexError: index 37 is out of bounds for axis 0 with size 37 означает, что в вашем объекте нет элемента с индексом 37.

В python, если у вас есть объект, такой как массив или список, в котором элементы численно проиндексированы, если он имеет n элементов, индексы перейдут от 0 до n-1 (это общий случай, за исключением переиндексации в фреймах данных).

Итак, если у вас есть 37 элементов, вы можете извлечь только элементы из0-36.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...