随机森林分类器 Matlab v/s Python
Random Forest Classifier Matlab v/s Python
我在 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 的随机森林分类器使用 gini 作为其默认标准来衡量分割的质量。)
第三,这将取决于你的数据大小(你没有在你的问题中指定)。较小的数据集会在随机森林的结构中产生更多的可变性,反过来,它们的输出在一个森林与另一个森林之间会有更大的差异。
最后,决策树容易受到输入数据可变性的影响(轻微的数据扰动会产生非常不同的树)。随机森林试图通过种植许多树来获得更稳定和准确的解决方案,但通常 10(甚至 100 或 200)棵树往往不足以获得稳定的输出。
寻求解决方案
我可以推荐几种策略。首先,确保将数据加载到各个程序中的方式是等效的。 MATLAB 是否以不同于 Python 的方式误读关键变量,导致变量变得不可预测(例如,将数字变量误读为字符串变量?)。
其次,一旦您确信您的数据在两个程序中的加载方式相同,请仔细阅读随机森林函数的文档,并确保您在两个程序中指定相同的超参数(例如,标准)。您希望确保每个随机森林的创建方式尽可能相似。
第三,可能有必要增加树木的数量以获得更稳定的森林产出。确保两种实现中的树数相同。
第四,程序之间的潜在差异可能来自数据如何划分为训练集和测试集。可能有必要确保某种方法允许您在两种编程语言之间复制相同的交叉验证集(例如,如果您对每条记录都有唯一的 ID,则将偶数编号分配给训练,奇数编号分配给训练)测试)。
最后,您还可以受益于在每种编程语言中创建多个森林并比较跨迭代的平均准确度数字。这些将使您更好地了解准确性差异是否真正可靠和重要,或者只是侥幸。
祝你好运!
我在 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 的随机森林分类器使用 gini 作为其默认标准来衡量分割的质量。)
第三,这将取决于你的数据大小(你没有在你的问题中指定)。较小的数据集会在随机森林的结构中产生更多的可变性,反过来,它们的输出在一个森林与另一个森林之间会有更大的差异。
最后,决策树容易受到输入数据可变性的影响(轻微的数据扰动会产生非常不同的树)。随机森林试图通过种植许多树来获得更稳定和准确的解决方案,但通常 10(甚至 100 或 200)棵树往往不足以获得稳定的输出。
寻求解决方案
我可以推荐几种策略。首先,确保将数据加载到各个程序中的方式是等效的。 MATLAB 是否以不同于 Python 的方式误读关键变量,导致变量变得不可预测(例如,将数字变量误读为字符串变量?)。
其次,一旦您确信您的数据在两个程序中的加载方式相同,请仔细阅读随机森林函数的文档,并确保您在两个程序中指定相同的超参数(例如,标准)。您希望确保每个随机森林的创建方式尽可能相似。
第三,可能有必要增加树木的数量以获得更稳定的森林产出。确保两种实现中的树数相同。
第四,程序之间的潜在差异可能来自数据如何划分为训练集和测试集。可能有必要确保某种方法允许您在两种编程语言之间复制相同的交叉验证集(例如,如果您对每条记录都有唯一的 ID,则将偶数编号分配给训练,奇数编号分配给训练)测试)。
最后,您还可以受益于在每种编程语言中创建多个森林并比较跨迭代的平均准确度数字。这些将使您更好地了解准确性差异是否真正可靠和重要,或者只是侥幸。
祝你好运!