随机森林分类器Matlab v / s Python

时间:2015-05-22 19:56:35

标签: 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';

1 个答案:

答案 0 :(得分:2)

问题

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

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

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

第三,它取决于您的数据大小(您未在问题中指定)。较小的数据集将使随机森林的结构产生更多的变化,反过来,它们的输出将因森林而异。

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

寻求解决方案

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

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

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

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

最后,您还可以从每种编程语言中创建多个林中获益,并比较迭代中的平均准确度数。这些将使您更好地了解准确性差异是否真正可靠和重要,或仅仅是侥幸。

祝你好运!