0

Я использую PCA для уменьшения количества функций перед тренировкой Random Forest. Сначала я использовал около 70 основных компонентов из 125, которые составляли около 99% энергии (по собственным значениям). Я получил намного худшие результаты после тренировки Random Forests с новыми преобразованными функциями. После этого я использовал все основные компоненты, и получил те же результаты, что и при использовании 70. Это не имело для меня никакого смысла, поскольку это одно и то же пространство функций только в различной базе (пространство только поворачивается так, что оно не должно влиять на граница). У кого-нибудь есть идея, что может быть проблемой здесь?Использование PCA перед классификацией

Вот мой код

clc; 
clear all; 
close all; 

load patches_training_256.txt 
load patches_testing_256.txt 

Xtr = patches_training_256(:,2:end); 
Xtr = Xtr'; 
Ytr = patches_training_256(:,1); 
Ytr = Ytr'; 

Xtest = patches_testing_256(:,2:end); 
Xtest = Xtest'; 
Ytest = patches_testing_256(:,1); 
Ytest = Ytest'; 

data_size = size(Xtr, 2); 
feature_size = size(Xtr, 1); 

mu = mean(Xtr,2); 
sigma = std(Xtr,0,2); 
mu_mat = repmat(mu,1,data_size); 
sigma_mat = repmat(sigma,1,data_size); 

cov = ((Xtr - mu_mat)./sigma_mat) * ((Xtr - mu_mat)./sigma_mat)'/data_size; 

[v d] = eig(cov); 

%[U S V] = svd(((Xtr - mu_mat)./sigma_mat)'); 

k = 124; 
%Ureduce = U(:,1:k); 

%XtrReduce = ((Xtr - mu_mat)./sigma_mat) * Ureduce; 
XtrReduce = v'*((Xtr - mu_mat)./sigma_mat); 

B = TreeBagger(300, XtrReduce', Ytr', 'Prior', 'Empirical', 'NPrint', 1); 

data_size_test = size(Xtest, 2); 
mu_test = repmat(mu,1,data_size_test); 
sigma_test = repmat(sigma,1,data_size_test); 

XtestReduce = v' * ((Xtest - mu_test) ./ sigma_test); 

Ypredict = predict(B,XtestReduce'); 

error = sum(Ytest' ~= (double(cell2mat(Ypredict)) - 48)) 

ответ

1

Случайные леса в значительной степени зависит от выбора базы. Это не линейная модель, которая (до нормализации) инварианта вращения, RF полностью меняет поведение, как только вы «вращаете пространство». Причина этого заключается в том, что он использует деревья принятия решений в качестве базовых классификаторов, которые анализируют каждую функцию полностью независимо, поэтому в результате не удается найти линейную комбинацию функций. Когда вы вращаете свое пространство, вы меняете «смысл» функций. В этом нет ничего плохого, просто классификаторы на основе дерева - довольно плохой выбор для применения после таких преобразований. Вместо этого используйте методы выбора функций (методы, которые выбирают, какие функции ценны, без создания каких-либо линейных комбинаций). Фактически, сами RFs могут быть использованы для такой задачи из-за их внутренней «важности» вычисления,

+0

Спасибо за ответ, я подозревал то же самое. Я попробовал метод выбора объектов (форвардное и обратное устранение), однако из-за количества функций, которые он выполняет, чтобы замедлить работу и непрактично. Я мог бы попытаться использовать функцию важности из РФ, так как я могу вспомнить, что в РФ есть несколько показателей значимости функции (процентная частота выбора, среднее улучшение оценки и т. Д.), Есть ли у вас какой-либо опыт или рекомендации относительно того, как использовать их для достижения наилучших результатов? – user3847160

+0

К сожалению, причина существования множества критериев заключается в том, что их применимость сильно зависит от конкретных данных/проблем, поэтому вам придется проверять хотя бы несколько из них. – lejlot

0

Существует уже функция matlab princomp, которая будет делать pca для вас. Я бы предложил не падать в числовые петли ошибок. Они сделали это для нас .. :)