matlab - 分类前使用 PCA

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

我在训练随机森林之前使用 PCA 来减少特征数量。我首先使用了 125 个主成分中的大约 70 个,它们大约占能量的 99%(根据特征值)。使用新的转换特征训练随机森林后,我得到了更糟糕的结果。之后我使用了所有的主成分,得到了与使用 70 时相同的结果。这对我来说没有意义,因为这是相同的特征空间,仅在不同的基础上(空间仅被旋转,因此不会影响边界)。 有谁知道这里可能存在什么问题吗?

这是我的代码

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

最佳答案

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

关于matlab - 分类前使用 PCA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26742624/

相关文章:

arrays - 使用 matlab 将 yyyy-mm-dd hh :mm:ss. ms 转换为 yyyy-mm-dd hh:mm:ss

nlp - 使用 Lingpipe 识别情感分析中的实体

matlab - 为什么 Scipy 和 MATLAB 的主成分值不一致?

java - 如何从java运行MATLAB文件(.m文件)?

matlab - 在 Matlab 中连接二元运算符(如 "3++ 2")不会出错

matlab - 如何判断矩阵是否奇异?

machine-learning - 用于对未知输入进行分类的 tensorflow

r - 使用 R 的 Bootstrap 问题

pca - scikit-learning 如何对 libsvm 格式的稀疏数据执行 PCA?

machine-learning - 使用PCA时监督学习和无监督学习的区别