Вопрос или проблема
Я программирую на Python. У меня есть два набора образцов. Набор1 содержит образцы класса A, а другой набор, Набор2, содержит образцы класса B. Эти образцы являются частью обучающего набора данных. Когда я предсказываю наборы 1 и 2 по отдельности, классификация идеальна. Но когда я объединяю оба набора для предсказания в один набор, предсказание дает неверный результат для образцов в Наборе2, т.е. предсказывает образцы набора 2 как принадлежащие классу A. В то же время образцы, принадлежащие Набору1, предсказываются как класс A в объединенном наборе. Почему это происходит? (Я сохранил модель и загрузил эту модель для дальнейшего предсказания, та же ошибка сохраняется)
model.add(Dense(newshape[1]+1, activation='relu', input_shape=(newshape[1],)))
model.add(Dropout(0.5))
model.add(Dense(500, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(250, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(100, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(50, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss="binary_crossentropy",
optimizer="adam",
metrics=['binary_accuracy'])
model.fit(X_train, y_train,validation_data=(X_test, y_test),validation_split=0.2, epochs=500, batch_size=25, verbose=0)
У вас есть ошибка где-то в данных, которые вы предоставляете в качестве обучающих данных, или в модели, которую вы используете для предсказания.
Если бы это была действительно одна и та же модель, обученная на полных данных во всех случаях, тогда любой экземпляр в наборе2 всегда предсказывался бы с одним и тем же классом (правильным или неправильным), независимо от других экземпляров в тестовом наборе. Это предполагает, что модель, которая применяется при предсказании отдельных наборов или обоих одновременно, не одна и та же.
В качестве теста сначала сохраните вашу модель, а затем примените ее к различным случаям (используйте сохраненную модель, не обучайте ее снова).
Хорошо, вы пытаетесь провести 3 эксперимента:
- Обучение на полном обучающем наборе создает modelA, затем примените modelA к набору1
- Обучение на полном обучающем наборе создает modelB, затем примените modelB к набору2
- Обучение на полном обучающем наборе создает modelC, затем примените modelC как к набору1, так и к набору2
Но если бы это действительно так, три модели были бы одинаковыми: modelA = modelB = modelC. На самом деле вы можете сделать так:
- Обучение на полном обучающем наборе создает modelD
- примените modelD к любому набору
Судя по вашему описанию, вероятно, происходит следующее:
- Обучение на экземплярах класса A (ошибка) создает modelA, затем примените modelA к набору1 -> идеальные результаты
- Обучение на экземплярах класса B (ошибка) создает modelB, затем примените modelB к набору2 -> идеальные результаты
- Обучение на экземплярах класса A (ошибка) создает modelC = modelA, затем примените modelC к наборам 1 и 2: идеально для класса A, совершенно неверно для класса B
Вам нужно проверить, какие экземпляры вы предоставляете в качестве обучающего набора в каждом случае.
Ответ или решение
Проблема, с которой вы столкнулись при использовании модели машинного обучения для прогноза различных классов из объединенных выборок, может быть связана с несколькими ключевыми аспектами в процессе обучения и предсказания. Позвольте рассмотреть это подробнее, чтобы выявить возможные причины неудачного результата при объединении выборок Set1 и Set2.
1. Модель и данные
На первом этапе важно оценить, как вы подготавливаете данные для обучения. Ваша модель, судя по коду, предназначена для бинарной классификации, где класс A соответствует метке 0, а класс B — метке 1. Следовательно, если вы тренируете модель на выборке, содержащей только элементы одного класса (например, только классы A или только классы B), это может привести к тому, что модель не сможет правильно классифицировать элементы из противоположного класса.
2. Разделение данных и обучение
При обучении на Set1 и Set2 по отдельности вы, вероятно, получаете хорошую точность, потому что модель адаптирована к узкому набору данных, который состоит исключительно из одного класса. Однако, когда вы затем объединяете выборки для предсказания, вы используете модель, которая не была обучена на данных класса B (если в первый раз вы использовали только Set1). Вот возможная последовательность действий:
- Модель A: Обучена на Set1 (только класс A) — хорошая точность при прогнозировании Set1.
- Модель B: Обучена на Set2 (только класс B) — хорошая точность при прогнозировании Set2.
- Модель C (объединение): Обучена на Set1 с ошибками или использует модель, которая не адаптирована для обоих классов — в результате получаете плохую точность на Set2.
3. Проблемы с подготовкой данных
Также необходимо учитывать качество подготовки данных:
- Убедитесь, что обе выборки правильно нормализованы. Различия в диапазонах значений между выборками могут привести к некорректным предсказаниям.
- Проверьте, нет ли в ваших данных аномалий или выбросов, которые могут привести к смещению модели.
- Удостоверьтесь, что при объединении выборок вы не случайно не смешиваете метки классов (например, не заменяете метку класса A на метку класса B для элементов Set1 и наоборот).
4. Обучение на полной выборке
Для достижения наилучших результатов рассмотрите возможность использования всех доступных данных (Set1 + Set2) для обучения одной модели. Это позволит модели лучше понять распределение классов внутри общей выборки и будет способствовать более точным предсказаниям при работе с новыми данными.
Заключение
Ваша задача заключается в том, чтобы убедиться в правильности подготовки данных и правильном обучении модели. Следите за тем, чтобы каждая модель (особенно, когда речь идет о бинарной классификации) имела доступ ко всем классам, чтобы избежать неправильных предсказаний. Возможно, стоит разработать стратегию, в которой вы обучите обобщённую модель на объединенной выборке и протестируете её на отдельных данных из Set1 и Set2 для проверки ее предсказательной способности.