python - 随机森林分类器 Matlab 与 Python

标签 python matlab machine-learning statistics random-forest

我在 Python 和 MATLAB 中使用了随机森林分类器。集成中有 10 棵树,我在 Python 中获得了大约 80% 的准确率,而在 MATLAB 中只有 30%。即使 MATLAB 的随机森林种植了 100 或 200 棵树,这种差异仍然存在。

这两种编程语言之间存在这种差异的可能原因是什么?

MATLAB 代码如下:

load 'path\to\feature vector'; % Observations X Features, loaded as segment_features
load 'path\to\targetValues'; % Observations X Target value, loaded as targets
% Set up Division of Data for Training, Validation, Testing
trainRatio = 70/100;
valRatio = 0/100;
testRatio = 30/100;
[trainInd,valInd,testInd] = dividerand(size(segment_features,1),trainRatio,...
    valRatio,testRatio);

% Train the Forest
B=TreeBagger(10,segment_features(trainInd,:), target(trainInd),...
    'OOBPred','On');

% Test the Network
outputs_test = predict(B,segment_features(testInd, :));
outputs_test = str2num(cell2mat(outputs_test));
targets_test = target(testInd,:);
Accuracy_test=sum(outputs_test==targets_test)/size(testInd,2);

oobErrorBaggedEnsemble = oobError(B);
plot(oobErrorBaggedEnsemble)
xlabel 'Number of grown trees';
ylabel 'Out-of-bag classification error';

最佳答案

问题

使用两种不同编程语言(例如 MATLAB 和 Python)实现随机森林会产生不同结果的原因有很多。

首先,请注意,根据设计,使用相同数据训练的两个随机森林的结果永远不会相同:随机森林通常在每个分割处随机选择特征,并在构建每棵树时使用自举样本。

其次,不同的编程语言可能为随机森林的超参数设置不同的默认值(例如,scikit-learn 的随机森林分类器使用基尼作为衡量分割质量的默认标准。)

第三,这取决于您的数据大小(您在问题中没有指定)。较小的数据集将在随机森林的结构中产生更大的可变性,反过来,它们的输出在一个森林与另一个森林之间会存在更大的差异。

最后,决策树很容易受到输入数据变化的影响(轻微的数据扰动可能会产生非常不同的树)。随机森林试图通过种植许多树来获得更稳定和准确的解决方案,但通常 10 棵(甚至 100 或 200 棵)树往往不足以获得稳定的输出。

寻求解决方案

我可以推荐几种策略。首先,确保将数据加载到各个程序中的方式是等效的。 MATLAB 是否以与 Python 不同的方式误读关键变量,导致该变量变得不可预测(例如,将数值变量误读为字符串变量?)。

其次,一旦您确信两个程序中的数据加载方式相同,请仔细阅读随机森林函数的文档,并确保您在两个程序中指定相同的超参数(例如标准)。您希望确保每个中的随机森林的创建方式尽可能相似。

第三,可能需要增加树木数量才能从森林中获得更稳定的产出。确保两个实现中的树数量相同。

第四,程序之间的潜在差异可能来自于数据如何分为训练集和测试集。可能有必要确保某种方法允许您在两种编程语言之间复制相同的交叉验证集(例如,如果每个记录都有唯一的 ID,则将偶数的记录分配给训练,将奇数的记录分配给训练)测试)。

最后,您还可以受益于在每种编程语言中创建多个森林并比较各个迭代的平均准确度数字。这些将使您更好地了解准确性差异是否真正可靠且显着,还是只是侥幸。

祝你好运!

关于python - 随机森林分类器 Matlab 与 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30404942/

相关文章:

python - Jupyter 不渲染 latex

python - 在 Python 中查询连接的 USB 设备信息的简单方法?

python - pytest 是否有类似 google test 的非致命 EXPECT_* 行为?

java - 如何使用 matlabcontrol 从 Java 调用 Matlab 函数,而无需每次都启动新 session ?

r - R 中 svm 特征选择的示例

algorithm - 线性回归的梯度下降没有找到最佳参数

python - OpenCV ORB 检测器发现非常少的关键点

matlab - MATLAB 能做什么而 R 不能做什么?

user-interface - 如何将进度条控件添加到 Matlab gui?

python - 可以将增强数据放入验证集中吗?