0

У меня есть набор данных из 43 примеров (точек данных) и 70 000 функций, что означает, что моя матрица набора данных (43 x 70'000). Этикетки содержат 4 разных значения (1-4), т. Е. Существует 4 класса.Почему плохая точность с нейронной сетью?

Теперь, я сделал классификацию с сетью глубоких убеждений/нейронной сетью, но я получаю только точность около 25% (случайный уровень) с перекрестной проверкой «один-одинекторный». Если я использую kNN, SVM и т. Д., Я получаю точность> 80%.

Я использовал DeepLearnToolbox для Matlab (https://github.com/rasmusbergpalm/DeepLearnToolbox) и только что адаптировал пример Deep Belief Network из readme панели инструментов. Я пробовал различное количество скрытых слоев (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 х 70'000) со значениями масштабированных на [0,1] ,

Может ли кто-нибудь понять, почему я получаю такую ​​плохую точность?

ответ

3

Поскольку в наборе данных у вас гораздо больше функций, чем примеров. Другими словами: у вас есть большое количество весов, и вам нужно оценить их все, но вы не можете, потому что NN с такой огромной структурой не может хорошо обобщаться на таком маленьком наборе данных, вам нужно больше данных, чтобы узнать такое большое количество скрытые веса (на самом деле NN может запомнить ваш набор тренировок, но не может вывести его «знание» на тестовый набор). В то же время 80% -ная точность с такими простыми методами, как SVM и kNN, указывает, что вы можете описать свои данные с гораздо более простыми правилами, потому что, например, SVM будет иметь вес всего 70 тысяч (вместо 70k first_layer_size + first_layer_size second_layer_size + ... в NN), kNN вообще не будет использовать веса.

Сложная модель не серебряная пуля, более сложная модель, которую вы пытаетесь уместить - чем больше данных вам нужно.

0

Очевидно, что ваш набор данных слишком мал, чем сложность вашей сети. reference from there

Сложность нейронной сети может быть выражена через число параметров. В случае глубоких нейронных сетей это число может быть в диапазоне миллионов, десятков миллионов, а в некоторых случаях даже сотен миллионов. Назовем это число P. Поскольку вы хотите быть уверен в способности модели обобщать, хорошее правило большого пальца для , количество точек данных не менее P * P.

В то время как KNN и SVM проще, они не нуждаются в такой большой информации. Таким образом, они могут работать лучше.

Смежные вопросы