我在Python和MATLAB中使用了随机森林分类器。在集成中使用10棵树时,Python的准确率约为80%,而MATLAB仅为30%左右。即使MATLAB的随机森林增加到100或200棵树,这种差异仍然存在。
这两种编程语言之间可能存在差异的原因是什么?
MATLAB代码如下:
load 'path\to\feature vector'; % Observations X Features, loaded as segment_featuresload 'path\to\targetValues'; % Observations X Target value, loaded as targets% Set up Division of Data for Training, Validation, TestingtrainRatio = 70/100;valRatio = 0/100;testRatio = 30/100;[trainInd,valInd,testInd] = dividerand(size(segment_features,1),trainRatio,... valRatio,testRatio);% Train the ForestB=TreeBagger(10,segment_features(trainInd,:), target(trainInd),... 'OOBPred','On');% Test the Networkoutputs_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的随机森林分类器默认使用gini作为测量分裂质量的标准)。
第三,这将取决于您的数据大小(您在问题中未指定)。较小的数据集会在随机森林的结构上产生更多的变异性,从而导致不同森林之间的输出差异更大。
最后,决策树容易受到输入数据的变异性影响(轻微的数据扰动可能会产生非常不同的树)。随机森林通过生长多棵树来尝试获得更稳定和准确的解决方案,但通常10棵树(甚至100或200棵)往往不足以获得稳定的输出。
解决方案
我可以推荐几种策略。首先,确保数据加载到每个程序中的方式是等同的。MATLAB是否以与Python不同的方式误读了关键变量,导致变量变得不可预测(例如,将数值变量误读为字符串变量)?
其次,一旦您确信数据在两个程序中加载方式相同,请仔细阅读随机森林函数的文档,并确保在两个程序中指定相同的超参数(例如,标准)。您希望确保每个程序中的随机森林尽可能相似地创建。
第三,可能需要增加树的数量以获得更稳定的森林输出。确保两个实现中的树的数量相同。
第四,程序之间的潜在差异可能来自于数据如何被分割成训练集与测试集。可能需要确保某种方法允许您在两种编程语言中复制相同的交叉验证集(例如,如果您对每条记录有一个唯一ID,将偶数分配给训练集,将奇数分配给测试集)。
最后,您还可以从在每种编程语言中创建多个森林并比较迭代中的平均准确率数字中受益。这些将使您更好地了解准确率差异是否真正可靠和显著,还是只是偶然现象。
祝好运!