Нейронная сеть двоичной классификации предсказывает только одно значение для невидимых данных даже после тренировки с использованием веса класса - PullRequest
0 голосов
/ 12 апреля 2019

Бинарный классификатор, который я построил, имеет вспомогательное значение: 72% на тренировочных данных и 78% на тестовых данных.Однако, когда я сохраняю параметры модели и оцениваю невидимые несбалансированные данные, он предсказывает только одно значение для всех точек данных.

Ниже приводится архитектура модели

#Define Model
model = Sequential()
# Input layer
model.add(Dense(units = 512, activation = "relu", input_dim = input_dim, kernel_initializer = "normal", kernel_regularizer=regularizers.l2(0.005), 
                kernel_constraint = max_norm(5.)))
# Add dropout regularization
##model.add(Dropout(rate=0.2))

model.add(Dense(units = 512, activation = "relu", input_dim = input_dim, kernel_initializer = "normal", kernel_regularizer=regularizers.l2(0.005), 
                kernel_constraint = max_norm(5.)))
# Add dropout regularization
##model.add(Dropout(rate=0.2))

# First hidden layer
model.add(Dense(units = 256, activation='relu', kernel_regularizer=regularizers.l2(0.005), kernel_constraint=max_norm(5)))
# Add dropout regularization
##model.add(Dropout(rate=0.1))

# Second hidden layer
model.add(Dense(128, activation='relu', kernel_regularizer=regularizers.l2(0.005), kernel_constraint=max_norm(5)))
# Add dropout regularization
##model.add(Dropout(rate=0.1))

# Third hidden layer
model.add(Dense(64, activation='relu', kernel_regularizer=regularizers.l2(0.05), kernel_constraint=max_norm(5)))
# Add dropout regularization
##model.add(Dropout(rate=0.1))

# Output layer
model.add(layers.Dense(units = 1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy',auc])
model.summary()

Веса классов определены следующим образом:

def get_class_weights(y):
    counter = Counter(y)
    majority = max(counter.values())
    return  {cls: round(float(majority)/float(count), 2) for cls, count in counter.items()}

Для невидимых данных прогнозируется только 0,98 для всех точек данных.Прочитал много литературы по несбалансированным данным и перепробовал все.Его все еще не становится лучше.Цени любую помощь / вклад.

1 Ответ

0 голосов
/ 13 апреля 2019

Возможно, ваши проблемы связаны с переоснащением.

Вы должны начать с простой модели и постепенно добавлять скрытые слои. Вы можете начать даже с одного плотного слоя с сигмовидной единицей. Эффективным способом предотвращения перегрузки сетей прямой связи является отсев. На самом деле, вы должны использовать его между всеми скрытыми слоями. В начале вы должны начать без регуляризации L2 и ограничений ядра и только если заметите, что модель переоснащается, добавьте ее.

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

...