DNN二元分类器的准确率没有增加

Posted

技术标签:

【中文标题】DNN二元分类器的准确率没有增加【英文标题】:DNN binary classifier's accuracy not increasing 【发布时间】:2019-09-27 19:38:40 【问题描述】:

我的二元分类器 DNN 的准确性似乎自 epoch 1 起就卡住了。我认为这意味着模型没有学习。关于为什么会发生这种情况的任何见解?

问题陈述:我想将给定的传感器读数序列(例如 [0 1 15 1 0 3])分类为 0 或 1(0 相当于“空闲”状态,1 相当于“活动”状态)。

关于数据集:数据集可用here “状态”列是目标,而其余列是特征。

我尝试使用 SGD 代替 Adam,尝试使用不同的内核初始化,尝试更改隐藏层的数量和每层的神经元数量,并尝试使用 sklearn 的 StandardScaler 而不是 MinMaxScaler。这些方法似乎都没有改变结果。

这是代码:

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.callbacks import EarlyStopping
from keras.optimizers import Adam
from keras.initializers import he_uniform
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder

seed = 7
random_state = np.random.seed(seed)

data = pd.read_csv('Dataset/Reformed/Model0_Dataset.csv')
X = data.drop(['state'], axis=1).values
y = data['state'].values

#min_max_scaler = MinMaxScaler()
std_scaler = StandardScaler()

# X_scaled = min_max_scaler.fit_transform(X)
X_scaled = std_scaler.fit_transform(X)

X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=random_state)

# One Hot encode targets
y_train = y_train.reshape(-1, 1)
y_test = y_test.reshape(-1, 1)

enc = OneHotEncoder(categories='auto')
y_train_enc = enc.fit_transform(y_train).toarray()
y_test_enc = enc.fit_transform(y_test).toarray()

epochs = 500    
batch_size = 100
model = Sequential()
model.add(Dense(700, input_shape=(X.shape[1],), kernel_initializer=he_uniform(seed)))
model.add(Dropout(0.5))
model.add(Dense(1400, activation='relu', kernel_initializer=he_uniform(seed)))
model.add(Dropout(0.5))
model.add(Dense(700, activation='relu', kernel_initializer=he_uniform(seed)))
model.add(Dropout(0.5))
model.add(Dense(800, activation='relu', kernel_initializer=he_uniform(seed)))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
model.summary()

early_stopping_monitor = EarlyStopping(patience=25)
# model.compile(SGD(lr=.01, decay=1e-6, momentum=0.9, nesterov=True), loss='binary_crossentropy', metrics=['accuracy'])
model.compile(Adam(lr=.01, decay=1e-6), loss='binary_crossentropy', metrics=['accuracy'], )

history = model.fit(X_train, y_train_enc, validation_split=0.2, batch_size=batch_size,
                    callbacks=[early_stopping_monitor], epochs=epochs, shuffle=True, verbose=1)
eval = model.evaluate(X_test, y_test_enc, batch_size=batch_size, verbose=1)

预期结果:每个 epoch(至少在早期 epoch 中)的准确度都会增加(并且损失会减少)。

实际结果:在整个训练过程中,以下值是固定的:

loss: 8.0118 - acc: 0.5001 - val_loss: 8.0366 - val_acc: 0.4987

【问题讨论】:

【参考方案1】:

您使用了错误的损失,对于两个输出的 softmax,您应该使用 categorical_crossentropy,并且您应该对标签进行 one-hot 编码。如果你想使用binary_crossentropy,那么输出层应该是一个带有sigmoid激活的单元。

【讨论】:

如您所说更新损失函数后,准确率上升到 0.61-0.62,但没有增加。

以上是关于DNN二元分类器的准确率没有增加的主要内容,如果未能解决你的问题,请参考以下文章

单个神经元也能实现DNN功能,图像分类任务准确率可达98%,登上Nature子刊

为啥打乱训练数据会影响我的随机森林分类器的准确性?

性能:提高朴素贝叶斯分类器的准确性

提高二元分类模型的准确性

Keras DNN 预测模型准确率没有提高

为啥逻辑回归分类器的准确率与 k 近邻不同? [关闭]