Нейронная сеть предсказывает только один класс из двоичного класса - PullRequest
2 голосов
/ 11 марта 2019

Моя задача - изучить дефектные предметы на фабрике.Это значит, что я пытаюсь обнаружить бракованный товар или прекрасный товар.Это привело к проблеме, когда один класс доминирует над другими (один класс составляет 99,7% данных), поскольку дефектные элементы были очень редкими.Точность обучения составляет 0,9971, а точность проверки - 0,9970.Это звучит потрясающе.Но проблема в том, что модель только предсказывает, что все это 0 класс, который является хорошим товаром.Это означает, что он не может классифицировать любые дефектные товары.Как я могу решить эту проблему?Я проверил другие вопросы и попробовал, но у меня все еще есть ситуация.общее количество точек данных составляет 122400 строк и 5 x функций.

В конце концов, моя запутанная матрица набора тестов выглядит так:

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 ]

3 голосов
/ 11 марта 2019

Похоже, у вас сильно разбалансированный набор данных, модель учится только тому, как классифицировать товары высокого качества.Вы можете попробовать один из подходов, перечисленных здесь: https://machinelearningmastery.com/tactics-to-combat-imbalanced-classes-in-your-machine-learning-dataset/

1 голос
/ 12 марта 2019

Лучшей попыткой было бы сначала собрать почти одинаковые части данных обоих классов, разделить их на train-test-val, обучить классификатор и провести тщательное тестирование вашего полного набора данных. Вы также можете попробовать применить методы дополнения данных к своему другому набору, чтобы получить больше данных из того же набора. Продолжайте итерацию и, возможно, даже попытайтесь изменить функцию потерь в соответствии с вашими условиями.

...