分类前使用PCA

时间:2014-11-04 18:43:24

标签: matlab machine-learning pca random-forest feature-selection

我在训练随机森林之前使用PCA来减少功能数量。我首先使用了大约70个主要成分,其中125个是大约99%的能量(根据特征值)。在使用新的转换功能训练随机森林后,我得到了更糟糕的结果。之后我使用了所有的主要组件,得到的结果和我使用70时的结果相同。这对我没有任何意义,因为只有在diirent base中才有相同的特征空间(空间只能旋转,所以不应该影响边界)。 有没有人知道这里可能出现什么问题?

这是我的代码

    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))

2 个答案:

答案 0 :(得分:1)

随机森林在很大程度上取决于基础的选择。它不是线性模型,它是(直到标准化)旋转不变,一旦你“旋转空间”,RF就会完全改变行为。其背后的原因在于它使用决策树作为基本分类器,分析每个特征完全独立,因此结果无法找到任何线性特征组合。旋转空间后,您可以更改功能的“含义”。这没有什么不对,简单的基于树的分类器在这种转换后应用是相当糟糕的选择。改为使用特征选择方法(选择哪些特征有价值而不创建任何线性组合的方法)。事实上,由于其内部的“特征重要性”计算,RF本身可用于此类任务,

答案 1 :(得分:0)

已经有一个matlab函数princomp可以为你做pca。我建议不要陷入数字错误循环。他们为我们做了.. :))