Нейронная сеть предсказывает только один класс из двоичного класса
Моя задача - выучить дефектные предметы на фабрике. Это значит, что я пытаюсь обнаружить бракованный товар или прекрасный товар. Это привело к проблеме, когда один класс доминирует над другими (один класс составляет 99,7% данных), поскольку дефектные элементы были очень редкими. Точность обучения составляет 0,9971, а точность проверки - 0,9970. Это звучит потрясающе. Но проблема в том, что модель только предсказывает, что все это 0 класс, который является хорошим товаром. Это означает, что он не может классифицировать любые дефектные товары. Как я могу решить эту проблему? Я проверил другие вопросы и попробовал, но у меня все еще есть ситуация. общее количество точек данных составляет 122400 строк и 5 х функций.
В конце концов, моя путаница с набором тестов выглядит следующим образом
array([[30508, 0],
[ 92, 0]], dtype=int64)
который делает ужасную работу.
Мой код, как показано ниже:
le = LabelEncoder()
y = le.fit_transform(y)
ohe = OneHotEncoder(sparse=False)
y = y.reshape(-1,1)
y = ohe.fit_transform(y)
scaler = StandardScaler()
x = scaler.fit_transform(x)
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.25, random_state = 777)
#DNN Modelling
epochs = 15
batch_size =128
Learning_rate_optimizer = 0.001
model = Sequential()
model.add(Dense(5,
kernel_initializer='glorot_uniform',
activation='relu',
input_shape=(5,)))
model.add(Dense(5,
kernel_initializer='glorot_uniform',
activation='relu'))
model.add(Dense(8,
kernel_initializer='glorot_uniform',
activation='relu'))
model.add(Dense(2,
kernel_initializer='glorot_uniform',
activation='softmax'))
model.compile(loss='binary_crossentropy',
optimizer=Adam(lr = Learning_rate_optimizer),
metrics=['accuracy'])
history = model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
y_pred = model.predict(x_test)
confusion_matrix(y_test.argmax(axis=1), y_pred.argmax(axis=1))
Спасибо
2 ответа
Похоже, у вас очень несбалансированный набор данных, модель учит только тому, как классифицировать товары высокого качества. Вы можете попробовать один из подходов, перечисленных здесь: https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/
Лучшей попыткой было бы сначала собрать почти одинаковые порции данных обоих классов, разделить их на train-test-val, обучить классификатор и провести тщательное тестирование вашего полного набора данных. Вы также можете попробовать применить методы дополнения данных к своему другому набору, чтобы получить больше данных из того же набора. Продолжайте итерацию и, возможно, даже попытайтесь изменить функцию потерь в соответствии с вашими условиями.