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

时间:2024-11-18 07:02:01

下面是一个完整的 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% 数据点。

总结

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