下面是一个完整的 MATLAB 代码示例,用于实现随机森林(Random Forest, RF)回归,执行 5 折交叉验证,并根据预测误差删除误差较大的行,将处理后的数据保存为新的 Excel 文件。
% 导入数据
data = readmatrix('data.xlsx');% 提取特征矩阵和输出向量
features = data(:, 1:end-1);
output = data(:, end);% 设置 5 折交叉验证
cv = cvpartition(size(data, 1), 'KFold', 5);% 存储预测误差
errors = zeros(size(data, 1), 1);% 进行 5 折交叉验证
for fold = 1:cv.NumTestSets% 获取训练和测试索引trainIdx = cv.training(fold);testIdx = cv.test(fold);% 训练随机森林回归模型Mdl = TreeBagger(100, features(trainIdx, :), output(trainIdx), ...'Method', 'regression');% 对测试集进行预测predictions = predict(Mdl, features(testIdx, :));% 计算误差(绝对误差)errors(testIdx) = abs(predictions - output(testIdx));
end% 设置误差阈值(例如,使用误差的 95% 分位数作为阈值)
threshold = prctile(errors, 95);% 标记误差较大的行
outlierIdx = errors > threshold;% 打印检测到的误差较大行的数量
fprintf('检测到的误差较大行数量: %d\n', sum(outlierIdx));% 删除误差较大的行
cleanedData = data(~outlierIdx, :);% 保存清理后的数据到新的 Excel 文件
writematrix(cleanedData, 'cleaned_data.xlsx');disp('清理后的数据已保存为 "cleaned_data.xlsx".');
代码解释
readmatrix('data.xlsx')
:导入 Excel 数据文件,假设数据是数值型。- 特征和输出提取:
features = data(:, 1:end-1)
提取前面的特征。output = data(:, end)
提取最后一列作为输出。
- 5 折交叉验证:
cvpartition
设置 5 折交叉验证分区。- 在每一折中,训练随机森林模型并计算测试集上的预测误差。
- 误差计算:
- 计算预测值与实际值的绝对误差并存储。
- 设置阈值:
- 使用误差的 95% 分位数作为阈值来标记误差较大的行。
- 删除误差较大的行:
- 将误差大于阈值的行标记为异常并删除。
- 输出到 Excel 文件:
writematrix(cleanedData, 'cleaned_data.xlsx')
将清理后的数据保存为cleaned_data.xlsx
。
调整和扩展
- 误差类型:可以根据需要更改误差计算方法,例如平方误差或相对误差。
- 阈值选择:
prctile(errors, 95)
表示使用误差的 95% 分位数作为阈值,可以根据具体需求调整。 - 随机森林参数:
TreeBagger(100, ...)
中的100
表示树的数量,可以根据数据集规模调整。
改变 95% 分位数会影响异常检测的严格程度,即哪些数据点会被标记为误差较大并被删除。以下是使用不同分位数的影响:
1. 分位数的定义
- 分位数是将数据按照一定比例进行划分。例如,95% 分位数表示数据中有 95% 的值低于该数值,5% 的值高于该数值。
2. 设置高分位数(如 95%)
- 影响:使用 95% 分位数作为阈值意味着将数据中误差最大的 5% 标记为异常值并删除。这样可以有效地识别并删除极端误差点。
- 优点:能排除误差较大的数据点,从而提高整体数据集的质量。
- 缺点:如果 95% 分位数过于严格,可能会误删一些有意义的数据点,尤其是在数据集中存在较大的正常误差范围时。
3. 降低分位数(如 90% 或 80%)
- 影响:降低分位数(例如使用 90%)会标记更多的数据点为异常值。更多数据会被标记为误差较大并被删除。
- 优点:更严格的筛选标准,适合在高精度要求的应用中使用。
- 缺点:过低的分位数会删除过多的数据,可能导致样本量不足或重要数据被删除。
4. 提高分位数(如 98% 或 99%)
- 影响:提高分位数(如使用 98% 或 99%)会减少被标记为异常值的数据点,仅删除极少数误差特别大的数据点。
- 优点:适合在数据中噪声较多但误差范围较广的情况下使用,避免删除潜在的正常数据。
- 缺点:可能无法完全清除误差较大的异常值,降低清理数据的效果。
5. 选择分位数的考虑因素
- 数据的分布:如果数据误差的分布比较集中,较高的分位数(如 95% 或 98%)适合用来排除极端点。如果误差分布较分散或有多个异常点,较低的分位数(如 90%)可能更合适。
- 应用场景:在精度要求高的场景中,适当降低分位数会更严格地筛选数据。在对误差容忍度较高的场景中,可以提高分位数以保留更多数据。
示例解释
- 95% 分位数:如果设置为
prctile(errors, 95)
,只会删除误差最大的 5% 数据点,保留 95% 的数据。 - 90% 分位数:如果设置为
prctile(errors, 90)
,删除误差最大的 10% 数据点。 - 99% 分位数:删除误差最大的 1% 数据点。
总结
调整分位数会影响异常检测的严格性。高分位数意味着更保守的清理,删除更少的数据,适合希望尽可能保留数据的应用;低分位数则意味着更严格的筛选,适合希望消除尽可能多异常数据的应用。选择合适的分位数应根据数据特征和具体应用需求进行。