Модель Keras может только предсказать класс - PullRequest
3 голосов
/ 24 апреля 2019

Сводка

У меня есть задача двоичной классификации.В конце концов, точность кажется% 81, но модель предсказывает только класс.

Проблема: Я понимаю, что модель не может многому научиться;но почему это предсказывает только класс?И я не уверен, что сделал ошибку во время генерации данных.Что-то не так?

Информация:

  • У меня, возможно, большие данные (~ 2 ГБ).Поэтому я тренирую модель по методу Кераса fit_generator;он не умещается в памяти, и данные, вероятно, будут увеличиваться в будущем.

  • Я выполняю этапы предварительной обработки и повторной выборки внутри функции генератора.

  • Данные несбалансированы.Я пытался выполнить повышающую дискретизацию (см. Код ниже).

  • Во время тренировки точность не увеличивается;потери очень немного уменьшаются.

  • Это то, что я получаю, когда запускаю classification_report на тестовом наборе (я делаю те же самые шаги предварительной обработки для тестового набора):

UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predi
cted samples.

  'precision', 'predicted', average, warn_for)              
              precision    recall  f1-score   support                                                                                                                                                              

     non-VPN       0.81      1.00      0.89     29432                                                                                                                                                              
         VPN       0.00      0.00      0.00      6973                                                                                                                                                              

   micro avg       0.81      0.81      0.81     36405            
   macro avg       0.40      0.50      0.45     36405                                                               
weighted avg       0.65      0.81      0.72     36405   

Коды:
Метод генератора данных:

def data_generotto(path: str, batchsize: int):
    while True:
        chunks = pd.read_csv(os.path.join(
            path, "shuffled.csv"), sep=';', chunksize=batchsize)

        for i, chunk in enumerate(chunks):
            X, y = preprocess.preprocess(chunk)

            # X = np.array(X).reshape(X.shape[0], 1, X.shape[1])

            yield (X, y)

Повторная выборка (среди других предварительных обработок)шаги):

# sorry for messy code
def balance_train_data(data, fold_count=3):
    """Balance the data using sklearn.utils resample to max sentiment count."""
    balanced_data = pd.DataFrame()
    data_dict = dict(data['label'].value_counts())

    for label in data_dict.keys():
        df = data[data.label == label]
        samples_count = int(
            (max(data_dict.values()) - data_dict[label])/fold_count)
        df_up = resample(df, replace=True,
                         n_samples=samples_count, random_state=42)

        print("Resampled {} tweets: {} + {} = {}".format(label,
                                                         len(df), len(df_up), len(df)+len(df_up)))
        balanced_data = pd.concat([balanced_data, df, df_up])
    return shuffle(balanced_data, random_state=42)

Очень простая модель ANN:

def create_model(model_folder_name):
    global folder_name
    folder_name = model_folder_name
    model = Sequential()

    model.add(Dense(8, activation='relu', input_dim=4))
    model.add(Dense(4, kernel_initializer='uniform', activation='relu'))
    model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))

    optimizer = optimizers.Adam(lr=0.0001)

    model.compile(optimizer=optimizer, loss="binary_crossentropy",
                  metrics=['accuracy'])
    model.summary(print_fn=myprint)

    return model, optimizer.get_config(), "ann"

fit_generator Функция:

    model.fit_generator(data_generotto(
        "./complete_csv", BS), steps_per_epoch=TRAIN_SIZE // BS, epochs=EPOCHS, callbacks=[es])

    save_model(model, f"./models/{model_folder_name}/MODEL.h5")

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете попробовать использовать imblearn и использовать другие методы выборки из него.

Кроме того, для решения проблемы дисбаланса вы можете попробовать использовать class_weight с соответствующими весами при установке модели.

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