точность обучения 100 процентов и точность проверки не меняется - PullRequest
0 голосов
/ 03 августа 2020

У меня есть модель классификации, которая явно переоснащается, и точность проверки не меняется. Я пробовал использовать методы выбора и извлечения функций, но они не помогли.

метод выбора функций:

fs = SelectKBest(f_classif, k=10)
    fs.fit(x, y)
    feature_index = fs.get_support(True)
    feature_index = feature_index.tolist()

    best_features = []

    # makes list of best features
    for index in feature_index:
        best_features.append(x[:, index])
    x = (np.array(best_features, dtype=np.float)).T

модель:

def model_and_print(x, y, Epochs, Batch_Size, loss, opt, class_weight, callback):
    # fix random seed for reproducibility
    seed = 7
    np.random.seed(seed)

    # define 10-fold cross validation test harness
    kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)

    # K-fold Cross Validation model evaluation
    fold_no = 1
    for train, test in kfold.split(x, y):
        # create model
        model = Sequential()
        model.add(Dropout(0.2, input_shape=(len(x[0]),)))
        model.add(Dense(6, activation='relu', kernel_constraint=maxnorm(3)))
        model.add(Dropout(0.2))
        model.add(Dense(8, activation='relu', kernel_constraint=maxnorm(3)))
        model.add(Dropout(0.4))
        model.add(Dense(1, activation=tf.nn.sigmoid))

        # compile model
        model.compile(optimizer=opt,
                      loss=loss, metrics=['accuracy']
                      )
        history = model.fit(x[train], y[train], validation_data=(x[test], y[test]), epochs=Epochs,
                            batch_size=Batch_Size, verbose=1)

def main():
    data = ["data.pkl", "data_list.pkl", "data_mean.pkl"]
    df = pd.read_pickle(data[2])

    x, y = data_frame_to_feature_and_target_arrays(df)

    # hyper meters
    Epochs = 200
    Batch_Size = 1
    learning_rate = 0.003
    optimizer = optimizers.Adam(learning_rate=learning_rate)
    loss = "binary_crossentropy"

    model_and_print(x, y, Epochs, Batch_Size, loss, optimizer, class_weight, es_callback)


if __name__ == "__main__":
    main()

вывод для часть одного сгиба:

  1/73 [..............................] - ETA: 0s - loss: 0.6470 - accuracy: 1.0000
62/73 [========================>.....] - ETA: 0s - loss: 0.5665 - accuracy: 0.7097
73/73 [==============================] - 0s 883us/step - loss: 0.5404 - accuracy: 0.7534 - val_loss: 0.5576 - val_accuracy: 0.5000
Epoch 100/200

 1/73 [..............................] - ETA: 0s - loss: 0.4743 - accuracy: 1.0000
69/73 [===========================>..] - ETA: 0s - loss: 0.6388 - accuracy: 0.6522
73/73 [==============================] - 0s 806us/step - loss: 0.6316 - accuracy: 0.6575 - val_loss: 0.5592 - val_accuracy: 0.5000
Epoch 101/200

 1/73 [..............................] - ETA: 0s - loss: 0.6005 - accuracy: 1.0000
69/73 [===========================>..] - ETA: 0s - loss: 0.5656 - accuracy: 0.7101
73/73 [==============================] - 0s 806us/step - loss: 0.5641 - accuracy: 0.7123 - val_loss: 0.5629 - val_accuracy: 0.5000
Epoch 102/200

 1/73 [..............................] - ETA: 0s - loss: 0.2126 - accuracy: 1.0000
65/73 [=========================>....] - ETA: 0s - loss: 0.5042 - accuracy: 0.8000
73/73 [==============================] - 0s 847us/step - loss: 0.5340 - accuracy: 0.7671 - val_loss: 0.5608 - val_accuracy: 0.5000
Epoch 103/200

 1/73 [..............................] - ETA: 0s - loss: 0.8801 - accuracy: 0.0000e+00
68/73 [==========================>...] - ETA: 0s - loss: 0.5754 - accuracy: 0.6471    
73/73 [==============================] - 0s 819us/step - loss: 0.5780 - accuracy: 0.6575 - val_loss: 0.5639 - val_accuracy: 0.5000
Epoch 104/200

 1/73 [..............................] - ETA: 0s - loss: 0.0484 - accuracy: 1.0000
70/73 [===========================>..] - ETA: 0s - loss: 0.5711 - accuracy: 0.7571
73/73 [==============================] - 0s 806us/step - loss: 0.5689 - accuracy: 0.7534 - val_loss: 0.5608 - val_accuracy: 0.5000
Epoch 105/200

 1/73 [..............................] - ETA: 0s - loss: 0.1237 - accuracy: 1.0000
69/73 [===========================>..] - ETA: 0s - loss: 0.5953 - accuracy: 0.7101
73/73 [==============================] - 0s 820us/step - loss: 0.5922 - accuracy: 0.7260 - val_loss: 0.5672 - val_accuracy: 0.5000
Epoch 106/200

 1/73 [..............................] - ETA: 0s - loss: 0.3360 - accuracy: 1.0000
67/73 [==========================>...] - ETA: 0s - loss: 0.5175 - accuracy: 0.7313
73/73 [==============================] - 0s 847us/step - loss: 0.5320 - accuracy: 0.7397 - val_loss: 0.5567 - val_accuracy: 0.5000
Epoch 107/200

 1/73 [..............................] - ETA: 0s - loss: 0.1384 - accuracy: 1.0000
67/73 [==========================>...] - ETA: 0s - loss: 0.5435 - accuracy: 0.6866
73/73 [==============================] - 0s 833us/step - loss: 0.5541 - accuracy: 0.6575 - val_loss: 0.5629 - val_accuracy: 0.5000
Epoch 108/200

 1/73 [..............................] - ETA: 0s - loss: 0.2647 - accuracy: 1.0000
69/73 [===========================>..] - ETA: 0s - loss: 0.6047 - accuracy: 0.6232
73/73 [==============================] - 0s 820us/step - loss: 0.5948 - accuracy: 0.6301 - val_loss: 0.5660 - val_accuracy: 0.5000
Epoch 109/200

 1/73 [..............................] - ETA: 0s - loss: 0.8837 - accuracy: 0.0000e+00
66/73 [==========================>...] - ETA: 0s - loss: 0.5250 - accuracy: 0.7576    
73/73 [==============================] - 0s 861us/step - loss: 0.5357 - accuracy: 0.7397 - val_loss: 0.5583 - val_accuracy: 0.5000
Epoch 110/200

конечная точность:

Score for fold 10: loss of 0.5600861310958862; accuracy of 50.0%

мой вопрос в том, что я могу сделать с переобучением, если я пробовал извлечение элементов и слои исключения и почему точность проверки не меняется?

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