我有43个示例(数据点)和70'000个特征的数据集,这意味着我的数据集矩阵是(43 x 70'000)。标签包含4个不同的值(1-4),即有4个类。
现在,我已经使用深度信念网络/神经网络进行了分类,但是我只能通过留一交叉验证获得大约25%(机会级别)的准确度。如果我正在使用kNN,SVM等,我的准确率将达到> 80%。
我使用了DeepLearnToolbox for Matlab(https://github.com/rasmusbergpalm/DeepLearnToolbox),并且刚刚从工具箱的自述文件中修改了Deep Belief Network示例。我尝试了不同数量的隐藏层(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]。
有人可以推断为什么我的准确度如此糟糕吗?
答案 0 :(得分:3)
因为您拥有的功能远远多于数据集中的示例。换句话说:你有大量的权重,你需要估计所有权重,但你不能,因为具有如此庞大结构的NN不能很好地概括这么小的数据集,你需要更多的数据来学习这么大的数量隐藏的权重(实际上NN可能会记住你的训练集,但无法推断它是测试集的“知识”)。同时,使用SVM和kNN等简单方法可以实现80%的准确性,这表明您可以使用更简单的规则来描述数据,因为例如SVM只有70k权重(而不是70k first_layer_size + first_layer_size nN中的second_layer_size + ...),kNN根本不会使用权重。
复杂模型不是银弹,你想要更复杂的模型 - 你需要的数据越多。
答案 1 :(得分:0)
很明显,您的数据集太小而不是网络的复杂性。 reference from there
神经网络的复杂性可以通过数字来表达 参数。在深度神经网络的情况下,这个数字可以是 在数百万,数千万甚至是某些情况下 亿万。让我们称这个数字为P.你想成为 确定模型的概括能力,一个很好的经验法则 数据点的数量至少为P * P.
虽然KNN和SVM更简单,但他们并不需要那么多数据。 所以他们可以更好地工作。