matlab - 为什么神经网络的准确性不好?

标签 matlab machine-learning neural-network classification deep-learning

我有一个包含 43 个示例(数据点)和 70'000 个特征的数据集,这意味着我的数据集矩阵为 (43 x 70'000)。标签包含 4 个不同的值 (1-4),即有 4 个类别。

现在,我已经使用深度置信网络/神经网络进行了分类,但通过留一法交叉验证,我仅获得了 25% 左右的准确率(机会水平)。如果我使用 kNN、SVM 等,我将获得 >80% 的准确率。

我使用了用于 Matlab 的 DeepLearnToolbox ( https://github.com/rasmusbergpalm/DeepLearnToolbox ),并且刚刚改编了工具箱自述文件中的深度置信网络示例。我尝试了不同数量的隐藏层(1-3)和不同数量的隐藏节点(100、500,...)以及不同的学习率、动量等,但准确性仍然很差。特征向量被缩放到范围 [0,1],因为这是工具箱需要的。

详细来说,我已经完成了以下代码(仅显示一次交叉验证):

% Indices of training and test set
train = training(c,m);
test = ~train;

% Train DBN
opts = [];
dbn = [];
dbn.sizes = [500 500 500];
opts.numepochs =   50;
opts.batchsize = 1;
opts.momentum  = 0.001;
opts.alpha     =   0.15;
dbn = dbnsetup(dbn, feature_vectors_std(train,:), opts);
dbn = dbntrain(dbn, feature_vectors_std(train,:), opts);

%unfold dbn to nn
nn = dbnunfoldtonn(dbn, 4);
nn.activation_function = 'sigm';
nn.learningRate = 0.15;
nn.momentum = 0.001;

%train nn
opts.numepochs =  50;
opts.batchsize = 1;
train_labels = labels(train);
nClass = length(unique(train_labels));
L = zeros(length(train_labels),nClass);
for i = 1:nClass
L(train_labels == i,i) = 1;
end

nn = nntrain(nn, feature_vectors_std(train,:), L, opts);
class = nnpredict(nn, feature_vectors_std(test,:));

feature_vectors_std 是 (43 x 70'000) 矩阵,其值缩放至 [0,1]。

有人能推断出为什么我的准确性这么差吗?

最佳答案

因为你的特征比数据集中的示例多得多。换句话说:你有大量的权重,你需要估计所有的权重,但你不能,因为具有如此巨大结构的神经网络无法在如此小的数据集上很好地泛化,你需要更多的数据来学习如此大量的权重隐藏权重(事实上,神经网络可能会记住你的训练集,但无法推断出它是测试集的“知识”)。同时,SVM 和 kNN 等简单方法的 80% 准确率表明您可以使用更简单的规则来描述数据,因为例如 SVM 将只有 70k 权重(而不是 70kfirst_layer_size + first_layer_size Second_layer_size + ...在NN中),kNN根本不会使用权重。

复杂模型不是 Elixir ,您尝试拟合的模型越复杂 - 您需要的数据就越多。

关于matlab - 为什么神经网络的准确性不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903589/

相关文章:

c - 将无符号字符指针从matlab传递到c接口(interface)dll

r - 将 R 中的机器学习包应用于大型数据集

Java XOR 神经网络训练不当

neural-network - 如何用 MLP 训练乘法器?

c++ - opencv中 'imquantize'函数的实现

mysql - 用于在 MATLAB 中处理的图像数据库

python - 如何在 Keras 中创建随时间变化的损失函数

python - TensorFlow tfrecords : tostring() changes dimension of image

computer-vision - lmdb 类型的 Caffe 大文件

Matlab 表/数据集类型优化