分类 ANN 停留在 60%
Posted
技术标签:
【中文标题】分类 ANN 停留在 60%【英文标题】:Classification ANN stuck at 60% 【发布时间】:2021-03-15 20:17:34 【问题描述】:我正在尝试在 10,000 个数据集上创建一个二元分类器。我尝试了多个激活器和优化器,但结果始终在 56.8% 和 58.9% 之间。鉴于数十次迭代的相当稳定的结果,我认为问题是:
-
我的数据集不可分类
我的模型坏了
这是数据集:training-set.csv
我也许可以再获得 2000 条记录,但仅此而已。
我的问题是:我的模型的构建方式是否存在阻碍它学习到更高程度的东西?
请注意,我很高兴根据需要拥有尽可能多的层和节点,并且时间不是生成模型的因素。
dataframe = pandas.read_csv(r"training-set.csv", index_col=None)
dataset = dataframe.values
X = dataset[:,0:48].astype(float)
Y = dataset[:,48]
#count the input variables
col_count = X.shape[1]
#normalize X
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_scale = sc_X.fit_transform(X)
# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_scale, Y, test_size = 0.2)
# define baseline model
activator = 'linear' #'relu' 'sigmoid' 'softmax' 'exponential' 'linear' 'tanh'
#opt = 'Adadelta' #adam SGD nadam RMSprop Adadelta
nodes = 1000
max_layers = 2
max_epochs = 100
max_batch = 32
loss_funct = 'binary_crossentropy' #for binary
last_act = 'sigmoid' # 'softmax' 'sigmoid' 'relu'
def baseline_model():
# create model
model = Sequential()
model.add(Dense(nodes, input_dim=col_count, activation=activator))
for x in range(0, max_layers):
model.add(Dropout(0.2))
model.add(Dense(nodes, input_dim=nodes, activation=activator))
#model.add(BatchNormalization())
model.add(Dense(1, activation=last_act)) #model.add(Dense(1, activation=last_act))
# Compile model
adam = Adam(lr=0.001)
model.compile(loss=loss_funct, optimizer=adam, metrics=['accuracy'])
return model
estimator = KerasClassifier(build_fn=baseline_model, epochs=max_epochs, batch_size=max_batch)
estimator.fit(X_train, y_train)
y_pred = estimator.predict(X_test)
#confusion matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
score = np.sum(cm.diagonal())/float(np.sum(cm))
【问题讨论】:
一般来说,当你的数据是严格同质的时,最好使用神经网络,而对于其他异构数据(例如梯度提升等集成方法),最好使用其他模型。此外,提高性能指标的一个重要部分是特征工程(删除、转换和创建新变量)。尝试阅读有关单变量特征分析(例如信息值)以及多变量方法(PCA、递归消除)的内容,以了解如何在拟合 NN 之前处理您的数据。 尝试换入一个更简单的非神经模型,看看效果如何。有一个基线可以帮助您确定问题是数据还是模型。 【参考方案1】:两点:
绝对没有意义用线性激活堆叠密集层 - 它们只会产生一个线性单元;更改为activator = 'relu'
(并且不要打扰您已注释掉的列表中的其他候选激活函数)。
不要默认使用 dropout,尤其是当你的模型在学习上有困难时(比如这里);删除 dropout 层,并准备好将它们(其中一些)放回去,以防万一你看到过度拟合(你目前离那个点还很远,所以现在不用担心 )。
【讨论】:
当使用线性激活堆叠密集层时,损失函数(例如预测和基本事实之间的 MSE)怎么样:它仍然是凸的吗? @MustafaAydın 如前所述;堆叠一百万个线性层,你会得到相当于一个线性单元的东西 是的,但它 turns out(第 283 页,第三段)损失函数失去了它们的凸性,因此形成这样的网络可能很有用:“Saxe et al. (2013) 提供了精确的解决方案此类网络中的完整学习动态,并表明这些模型中的学习捕获了在训练具有非线性激活函数的深度模型中观察到的许多定性特征。”我完全理解你在回答中的观点;但是说 > 绝对没有意义 恕我直言不完全正确。 引用的 @MustafaAydın 可能对学习动态的学习和研究有用,但这并不意味着它们可以在实践中使用,就像这里尝试的那样。无论如何,这更像是一个理论问题,这不是此类讨论的正确论坛。以上是关于分类 ANN 停留在 60%的主要内容,如果未能解决你的问题,请参考以下文章
Matlab基于人工神经网络ANN实现多分类预测(Excel可直接替换数据)