当前位置: 首页 > article >正文

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

下面是一个完整的 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".');

代码解释

  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% 数据点。

总结

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

 


http://www.kler.cn/a/398981.html

相关文章:

  • 【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入
  • 【计算机网络】协议定制
  • java.sql.SQLException Parameter index out of range
  • 算法日记 26-27day 贪心算法
  • 24-Ingest Pipeline Painless Script
  • Notepad++的完美替代
  • sql注入之二次注入(sqlilabs-less24)
  • JSON.stringify的应用说明
  • ARM(安谋) China处理器
  • 多进程/线程并发服务器
  • 如何判断FPGA能够接入几个Camera
  • STM32外设应用:深入探索STM32微控制器的强大功能
  • 2024 RISC-V中国峰会 安全相关议题汇总
  • 聊天服务器(3)muduo网络库
  • IDEA优雅debug
  • 重构代码之替换算法
  • 9.C++面向对象6(实现一个较为完善的日期类)
  • 高效稳定!新加坡服务器托管方案助力企业全球化布局
  • centos7.9安装mysql社区版
  • 动态规划子数组系列一>乘积最大子数组
  • 介绍一下strcmp(c基础)
  • AI赋能社交平台:Facebook的智能化未来
  • 举例理解LSM-Tree,LSM-Tree和B+Tree的比较
  • 【jvm】方法区是否存在GC
  • 2024年中国金融大模型产业发展洞察报告(附完整PDF下载)
  • 【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)