如何优化人工神经网络的准确性

Posted

技术标签:

【中文标题】如何优化人工神经网络的准确性【英文标题】:How to optimize accuracy of ANN 【发布时间】:2020-01-23 15:46:23 【问题描述】:

我有 300 个数据集的 50 个目标类。

这是我的示例数据集,包含 98 个特征:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
dataset = pd.read_csv(root_path + 'pima-indians-diabetes.data.csv', header=None)

X= dataset.iloc[:,0:8]
y= dataset.iloc[:,8]

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X = sc.fit_transform(X)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.3)

from keras import Sequential
from keras.layers import Dense

classifier = Sequential()
#First Hidden Layer
classifier.add(Dense(units = 10, activation='relu',kernel_initializer='random_normal', input_dim=8))
#Second  Hidden Layer
classifier.add(Dense(units = 10, activation='relu',kernel_initializer='random_normal'))
#Output Layer
classifier.add(Dense(units = 1, activation='sigmoid',kernel_initializer='random_normal'))

#Compiling the neural network
classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics =['accuracy'])

#Fitting the data to the training dataset
classifier.fit(X_train,y_train, batch_size=2, epochs=10)

我在这里得到了 19% 的准确率,但我不知道如何优化我的预测结果。

【问题讨论】:

“我有 300 个数据集的 50 个目标类”是什么意思 300条数据记录,50类 【参考方案1】:

我认为您已经对具有 98 个特征的原始数据执行了降维技术,因此您在模型中使用了 8 维输入特征。

我对您的实施有几点看法:

[作为分类问题]

正如您提到的,您的样本属于 50 个不同的类别,这个问题肯定是一个多类别分类问题。因此,您需要先对标签进行编码,例如:

from keras.utils import to_categorical
y = to_categorical(y, num_classes=50, dtype='float32')

在这种情况下,您需要更改最后一层的输出节点(代表类)和激活函数的数量,如下所示:

classifier.add(Dense(units = 50, activation='softmax'))

此外,您必须在编译模型时使用 categorical_crossentropy 作为损失函数。

classifier.compile(optimizer ='adam',loss='categorical_crossentropy', metrics =['accuracy'])

[作为回归问题]

您也可以将此问题视为多元回归问题,因为输出在 0 到 50(连续)的范围内,并且可以像您一样在最后一层保留单个输出节点。但在这种情况下,您应该使用linear 激活函数而不是sigmoid

所以,最后一层应该是这样的:

classifier.add(Dense(units = 1)) # default activation is linear

此外,在回归问题的情况下,mean_squared_error 是最相关的成本函数(假设您的数据集中没有多少异常值),accuracy 作为性能指标是无关紧要的(您可以使用mean_absolute_error类似于损失)。因此,第二个修改是:

classifier.compile(optimizer ='adam',loss='mean_squared_error')

【讨论】:

这很酷,但是当使用更多最大数据时我遇到了一个新问题 它是相同的数据,但更大。 41.000 条数据 请在此处或在新线程中描述您的问题。许多专家都在那里提供帮助。更多的数据有利于神经网络更好的泛化。请记住,您必须找到最佳的超参数(学习率、批量大小、时期)并且您当前的 batch_size 太小。您可能还想调整您的模型,例如不。隐藏层、隐藏单元、激活函数、内核初始化器等,取决于性能。 其实是同一种情况,我用ANN来分类我的数据。现在我有 355 个班级,每个班级在我的数据集上有 100 个数据样本。在这种情况下,我使用与上面的程序相同的模型。我使用 sigmoid 作为隐藏层的激活,softmax 作为输出层的激活。然后我得到 80% 的准确率。坏消息是我的损失也超过了 70% 如果我有 355 个类,每个类有 100 个数据样本,那么我的模型的最佳激活函数是什么?

以上是关于如何优化人工神经网络的准确性的主要内容,如果未能解决你的问题,请参考以下文章

人工智能实践:神经网络优化

月径流预测基于matlab人工生态系统算法优化BP神经网络月径流预测含Matlab源码 2000期

多维时序 | MATLAB实现GTO-CNN-BiLSTM人工大猩猩部队优化卷积双向长短期记忆神经网络多变量多步时间序列预测

[人工智能-深度学习-15]:神经网络基础 - 常见优化器Optimizer及其算法 - 梯度下降法系列

机器学习人工神经网络ANN

吴裕雄--天生自然 神经网络人工智能项目:基于深度学习TensorFlow框架的图像分类与目标跟踪报告