Метрики точности, полноты и правильности существенно различаются между обучающими/валидационными данными и фактическими предсказаниями.

Вопрос или проблема

У меня есть две последовательные модели, построенные с использованием Keras, которые обучаются на данных из CSV-файла. Вот как они построены

# Первая модель

model = Sequential()
model.add(Input(shape=X_1.shape))
model.add(Dense(128, activation='relu', kernel_initializer="he_uniform"))
model.add(Dense(64, activation='relu', kernel_initializer="he_uniform"))
model.add(Dropout(0.7))
model.add(Dense(32, activation='relu', kernel_initializer="he_uniform"))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss="binary_crossentropy",
              optimizer=Adam(learning_rate=0.001),
              metrics=[recall, prec, ba])

# Вторая модель

model_2 = Sequential()
model_2.add(Input(shape=X_1.shape))
model_2.add(Dense(64, activation='relu', kernel_initializer="he_uniform"))
model_2.add(Dropout(0.5))
model_2.add(Dense(32, activation='relu', kernel_initializer="he_uniform"))
model_2.add(Dense(1, activation='sigmoid'))
model_2.compile(loss="binary_crossentropy",
              optimizer=Adam(learning_rate=0.001),
              metrics=[recall, prec, ba])

Мой набор данных разделен пополам: один для обучения/валидации и один для тестирования, также у меня около 47 тысяч строк данных в 19 колонках. Большинство из них категориальные, только одна – численная, все категориальные данные закодированы с помощью one hot encoding, а численные нормализованы с использованием MinMaxScaler. Когда я обучаю модель, я использую встроенные метрики Keras для полноты, точности и точности, и получаю хорошие показатели выше 0.7 для этих метрик. Я вручную вычисляю F1 баллы своих результатов.

Затем я тестирую обученную модель на оставшихся данных (второй половине набора данных) и вычисляю метрики, используя Sklearn, так как мне не удалось найти встроенные функции для этого в Keras. Я использую следующий код.

# предсказать классы для тестового набора
yhat_classes = (model.predict(X_2) > 0.5).astype("int32")

# Вычислить F1 балл
accuracy = accuracy_score(y_2, yhat_classes)
precision = precision_score(y_2, yhat_classes)
recall = recall_score(y_2, yhat_classes)
f1 = f1_score(y_2, yhat_classes)

По этим метрикам я получаю значительно более низкие показатели во всех случаях. Опять же, мои значения валидации из метода .fit модели точно соответствуют тому, что мне нужно. Я также использую EarlyStopping для своей модели, наблюдая за val_recall во время обучения.

Почему мои результаты предсказания так отличаются от обучения и как я могу улучшить их? Есть ли разница между тем, как Sklearn и Keras вычисляют точность и полноту?

Ваша модель переобучена. Это значит, что вы как бы “запоминаете” данные для обучения, в то время как должны “учиться”. Хорошая модель должна иметь похожие результаты для обучающих и валидационных данных, но это не ваш случай, показатели сильно различаются. Чтобы избежать этого:

  • Используйте больше данных для обучения. Почему вы используете только 50% для обучения? Я бы рекомендовал использовать почти 90%. В любом случае, вы оставите около 5000 строк для тестирования вашей модели, этого более чем достаточно. С большим объемом данных труднее переобучиться. Более того, вы можете использовать техники увеличения данных, чтобы получить больше данных.
  • Увеличьте сложность модели. Добавьте больше слоев или сверток.
  • Вы также можете попробовать использовать дополнительные техники, такие как дропаута или регуляризация.
  • Уменьшите значение скорости обучения, возможно, вы сможете улучшить свою модель с помощью этого шага.

Если вы используете комбинацию этих пунктов, которые я прокомментировал, вы должны увидеть улучшение ваших валидационных результатов.

Ответ или решение

Разделение данных на обучающую, валидационную и тестовую выборки является важным шагом в создании моделей машинного обучения. Ваша ситуация подтверждает распространенную проблему, с которой сталкиваются многие разработчики — заметное снижение показателей точности, полноты и f1-метрики при тестировании модели на данных, которые не использовались в обучении. Давайте более детально разберем причины такого поведения и возможные пути улучшения.

Причины различий в метриках

  1. Переобучение (Overfitting):
    Выборка модели обучена слишком хорошо на обучающих данных, что привело к тому, что модель фактически "запомнила" образцы. Это может происходить, если модель слишком сложная или объем обучающих данных слишком мал. Низкая вариативность данных, с которой обучается модель, часто приводит к сильному отделению показателей качества на валидационных и тестовых выборках.

  2. Неравномерность данных (Data Imbalance):
    Если в ваших данных наблюдается несоответствие классов (например, один класс доминирует над другим), это может привести к смещению в метриках, которые вы получаете. Убедитесь, что данные сбалансированы, или применяйте методы, такие как переобучение или уменьшение, чтобы исправить это смещение.

  3. Различия в оценке метрик:
    Keras и Scikit-learn действительно могут использовать разные реализации для расчета точности и полноты. Убедитесь, что предобработанные данные точно соответствуют формату оценок, чтобы избежать возможных расхождений в вычислениях.

Рекомендации для улучшения модели

  1. Увеличение объема обучающего набора:
    Если возможно, используйте больше данных для обучения модели. Это может помочь сократить переобучение, так как оборудование будет обучаться на более разнообразных примерах. В идеале, старайтесь доставить не менее 70% данных для обучения, оставляя 30% для тестирования и оценки.

  2. Регуляризация:
    Попробуйте добавить регуляризацию (например, L1 или L2) или использовать другие методы, такие как дропаут — вы уже начали использовать дропаут, но можно попробовать экспериментировать с его параметрами и архитектурой сети, чтобы улучшить регуляризацию.

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

  4. Кросс-валидация:
    Используйте кросс-валидацию, чтобы проверить, насколько хорошо ваша модель будет работать с различными подмножествами данных. Это поможет убедиться, что ваша модель не переобучает часто используемые образцы.

  5. Балансировка классов:
    Если ваши данные имеют несбалансированные классы, вы можете попробовать методы балансировки, такие как увеличенное обучение миноритарных классов или меньшая выборка мажоритарных классов.

  6. Дополнительный анализ:
    Проведите более тщательный анализ ошибок модели — возможно, существуют определенные закономерности среди ошибок, которые поможет разобрать и учесть в процессе дальнейшего обучения.

Следуя приведенным рекомендациям, вы сможете создать более сбалансированную модель и достичь улучшенного качества предсказаний на тестовой выборке. Успех в машинном обучении требует терпения и постоянного улучшения методов, поэтому стоит пробовать разные подходы и алгоритмы для достижения наилучшего результата.

Оцените материал
Добавить комментарий

Капча загружается...