Вопрос или проблема
У меня есть две последовательные модели, построенные с использованием 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-метрики при тестировании модели на данных, которые не использовались в обучении. Давайте более детально разберем причины такого поведения и возможные пути улучшения.
Причины различий в метриках
-
Переобучение (Overfitting):
Выборка модели обучена слишком хорошо на обучающих данных, что привело к тому, что модель фактически "запомнила" образцы. Это может происходить, если модель слишком сложная или объем обучающих данных слишком мал. Низкая вариативность данных, с которой обучается модель, часто приводит к сильному отделению показателей качества на валидационных и тестовых выборках. -
Неравномерность данных (Data Imbalance):
Если в ваших данных наблюдается несоответствие классов (например, один класс доминирует над другим), это может привести к смещению в метриках, которые вы получаете. Убедитесь, что данные сбалансированы, или применяйте методы, такие как переобучение или уменьшение, чтобы исправить это смещение. -
Различия в оценке метрик:
Keras и Scikit-learn действительно могут использовать разные реализации для расчета точности и полноты. Убедитесь, что предобработанные данные точно соответствуют формату оценок, чтобы избежать возможных расхождений в вычислениях.
Рекомендации для улучшения модели
-
Увеличение объема обучающего набора:
Если возможно, используйте больше данных для обучения модели. Это может помочь сократить переобучение, так как оборудование будет обучаться на более разнообразных примерах. В идеале, старайтесь доставить не менее 70% данных для обучения, оставляя 30% для тестирования и оценки. -
Регуляризация:
Попробуйте добавить регуляризацию (например, L1 или L2) или использовать другие методы, такие как дропаут — вы уже начали использовать дропаут, но можно попробовать экспериментировать с его параметрами и архитектурой сети, чтобы улучшить регуляризацию. -
Налаштывание гиперпараметров:
Экспериментируйте с гиперпараметрами модели, такими как количество слоев, количество нейронов в каждом слое, скорость обучения (возможно, стоит уменьшить скорость обучения) и размер пакета. Это может значительно улучшить производительность модели. -
Кросс-валидация:
Используйте кросс-валидацию, чтобы проверить, насколько хорошо ваша модель будет работать с различными подмножествами данных. Это поможет убедиться, что ваша модель не переобучает часто используемые образцы. -
Балансировка классов:
Если ваши данные имеют несбалансированные классы, вы можете попробовать методы балансировки, такие как увеличенное обучение миноритарных классов или меньшая выборка мажоритарных классов. -
Дополнительный анализ:
Проведите более тщательный анализ ошибок модели — возможно, существуют определенные закономерности среди ошибок, которые поможет разобрать и учесть в процессе дальнейшего обучения.
Следуя приведенным рекомендациям, вы сможете создать более сбалансированную модель и достичь улучшенного качества предсказаний на тестовой выборке. Успех в машинном обучении требует терпения и постоянного улучшения методов, поэтому стоит пробовать разные подходы и алгоритмы для достижения наилучшего результата.