随机森林(Random Forest, RF)筛选回归数据(处理异常值)

下面是一个完整的 MATLAB 代码示例,用于实现随机森林(Random Forest, RF)回归,执行 5 折交叉验证,并根据预测误差删除误差较大的行,将处理后的数据保存为新的 Excel 文件。

Matlab 复制代码
% 导入数据
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".');

代码解释

  1. readmatrix('data.xlsx'):导入 Excel 数据文件,假设数据是数值型。
  2. 特征和输出提取
    • features = data(:, 1:end-1) 提取前面的特征。
    • output = data(:, end) 提取最后一列作为输出。
  3. 5 折交叉验证
    • cvpartition 设置 5 折交叉验证分区。
    • 在每一折中,训练随机森林模型并计算测试集上的预测误差。
  4. 误差计算
    • 计算预测值与实际值的绝对误差并存储。
  5. 设置阈值
    • 使用误差的 95% 分位数作为阈值来标记误差较大的行。
  6. 删除误差较大的行
    • 将误差大于阈值的行标记为异常并删除。
  7. 输出到 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% 数据点。

总结

调整分位数会影响异常检测的严格性。高分位数意味着更保守的清理,删除更少的数据,适合希望尽可能保留数据的应用;低分位数则意味着更严格的筛选,适合希望消除尽可能多异常数据的应用。选择合适的分位数应根据数据特征和具体应用需求进行。

相关推荐
551只玄猫7 小时前
【数学建模 matlab 实验报告13】主成分分析
开发语言·数学建模·matlab·课程设计·主成分分析
无敌昊哥战神7 小时前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
小白菜又菜7 小时前
Leetcode 2075. Decode the Slanted Ciphertext
算法·leetcode·职场和发展
Proxy_ZZ07 小时前
用Matlab绘制BER曲线对比SPA与Min-Sum性能
人工智能·算法·机器学习
黎阳之光7 小时前
黎阳之光:以视频孪生领跑全球,赋能数字孪生水利智能监测新征程
大数据·人工智能·算法·安全·数字孪生
小李子呢02117 小时前
前端八股6---v-model双向绑定
前端·javascript·算法
2301_822703208 小时前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
cmpxr_9 小时前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台9 小时前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆9 小时前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法