alazypii 2024-03-29 11:00 采纳率: 0%
浏览 9

随机森林的特征重要性全为零

用随机森林模型得到的特征重要性为什么全是零呢?有一部分有结果,有一部分没有(只改了data的来源。)谢谢大家~

% MATLAB随机森林回归代码
clc
clear
data = readtable('C:\Users\Administrator\Desktop\RFRtest.csv');
x = data(:,4:end-1);
y = data(:,end);
% 将数据集按30%分成训练集和测试集
cv = cvpartition(size(x,1),'HoldOut',0.3);
idx = cv.test;
Xtrain = x(~idx,:);
Ytrain = y(~idx,:);
Xtest = x(idx,:);
Ytest = y(idx,:);
% 使用TreeBagger函数训练随机森林分类器
ntrees = 200; % 树的数量
B = TreeBagger(ntrees,Xtrain,Ytrain,'Method','regression','OOBPrediction','On','OOBPredictorImportance','on');
Ypred =predict(B,Xtest);
Ytest = table2array(Ytest);
% 评估模型性能
rmse = sqrt(mean((Ytest - Ypred).^2));
r_squared = corrcoef(Ytest, Ypred).^2;
% 显示评估结果
disp(['均方根误差(RMSE): ', num2str(rmse)]);
disp(['R²值: ', num2str(r_squared(1, 2))]);
importance = B.OOBPermutedPredictorDeltaError;  % 重要性
disp(['特征重要性:',num2str(importance)]);


  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 11:00
    关注

    引自免费微信小程序:皆我百晓生

    在 MATLAB 中,当 randomForest 函数预测随机森林模型时,若所有特征的重要性均为零,可能是因为以下几个原因导致的:

    1. 数据缺失:如果你的数据集中存在缺失值,那么 tree_bagger 函数可能会忽略某些特征的影响,因为这些特征没有对应的预测值。在这种情况下,你需要考虑填充缺失值或通过其他方法处理缺失值。

      假设你有一个包含特征A、B、C的DataFrame,其中B和C分别有缺失值,且对决策树模型影响较小:

    data = table([1, 'A', 'B', NaN, 'C'], [2, NaN, 'B', 'C', 'D'], [3, NaN, 'A', 'C', 'E'], ...
        [4, 'A', 'C', 'E', 'F'], [5, 'B', 'C', 'F', 'G']);
    

    对于特征A,由于它是预测中的一个特征,tree_bagger 函数将保留它的信息,但忽略了B和C的预测值,导致其特征重要性为空。

    然后,你可以进行以下操作来填充缺失值并调整特征重要性:

    a. 删除包含缺失值的行matlab data = removevars(data, {'A', 'C'});

    b. 使用估计的填充值替换缺失值matlab filled_data = fillmissing(data, data.A == 0 | data.C == 0); tree_bagger.fittedmodel(Categorical(filled_data), Xtrain, Ytrain, ... 'DataVariables', 'C', 'RegressionMethod', 'regress', 'OptimizeIntercept', 'off', ... 'Predictor Importance', 'off', 'SelectFeatures', 'off', 'ValidationSetFraction', 0.3);

    c. 重新计算特征重要性matlab importance = tree_bagger.OOBPermutationPredictorDeltaError(filled_data, 'AllAttributes'); selected_features = tree_bagger.SelectSubset(filled_data, [0 importance], 'WithinRow', true, 'TestSize', 0.3);

    d. 更新预测结果与真实标签matlab y_pred = predict(tree_bagger.fittedmodel(selected_features, Xtest), Xtest); Ytest = table2array(Ytest); % 将预测结果转换回DataFrame格式 r_squared = corrcoef(y_test, y_pred).^2; disp(['均方根误差(RMSE): ', num2str(rmse)]); disp(['R²值: ', num2str(r_squared(1, 2))]);

    注意:上述代码实现过程假设原始数据集不存在空值、缺失值已经被正确填充,而且预测结果的有效性已知。在实际应用中,你可能需要根据具体情况进行调整和优化,例如选择更有效的特征选择算法、调整参数设置等。

    如果以上步骤都无法解决你的问题,建议尝试以下方法进一步分析和解决:

    1. 查看 tree_bagger 函数输出:确保在预测过程中并未出现错误信息,如 TypeError: no method named 'OOBPermutationPredictorDeltaError' for input arguments of type 'logical'struct'。这通常表明你在调用 tree_bagger.fittedmodel 函数时传递了不正确的输入类型。

    2. 检查 tree_bagger.fittedmodel 的代码:确认 tree_bagger.fittedmodel 函数在计算特征重要性的过程中是否按照预期工作。例如,select_features 参数应接收一个布尔数组表示哪些特征需要被选中。如果出现了未被筛选掉的特征,tree_bagger.fittedmodel 可能会忽略它们并仅返回 selected_features 数组中包含的特征。

    3. 执行可视化操作:通过绘制特征重要性矩阵、平均绝对误差曲线等图形来更好地理解随机森林模型的工作原理。如果因子因变量(特征)间的相关性较差,可能存在特征间的非线性关系导致预测质量降低。

    4. 探索不同特征选择方法:考虑使用不同的特征选择算法,如信息增益、卡方检验、互信息等,并比较不同方法下的预测结果。不同的特征选择算法可能更适合你的具体问题域和数据分布。

    5. 检查预测准确性:使用准确率、精确率、召回率、F1分数等指标来评估预测的精度。观察 y_pred 在测试集上的表现是否符合实际情况,以判断模型的预测效果。

    6. 使用交叉验证:使用交叉验证(如 k-fold cross-validation)来评估随机森林模型的泛化能力。通过划分数据集为多个子集,每次迭代将数据集分为 k 个子集,每个子集再次作为验证集,其余子集作为训练集,这样可以有效评估模型在新数据上的泛化性能。

    7. 对比其他模型的预测结果:如果随机森林模型在小样本的情况下表现不佳,你可能需要考虑使用其他的机器学习模型,如支持向量机、逻辑回归、神经网络等,并对它们的表现进行对比分析,找出最适合你问题的模型。

    以上策略结合运用可能会对解决随机森林特征重要性全为零的问题有所帮助,但具体的解决办法可能需要根据你所使用的特定工具和数据集特点进行调整。如有更详细的调试需求,欢迎随时提出,我会很乐意为你提供更详细的指导和代码示例。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月29日

悬赏问题

  • ¥15 office打开卡退(新电脑重装office系统后)
  • ¥300 FLUENT 火箭发动机燃烧EDC仿真
  • ¥15 【Hadoop 问题】Hadoop编译所遇问题hadoop-common: make failed with error code 2
  • ¥15 vb6.0+webbrowser无法加载某个网页求解
  • ¥15 RPA财务机器人采购付款流程
  • ¥15 计算机图形多边形及三次样条曲线绘制
  • ¥15 根据protues画的图用keil写程序
  • ¥200 如何使用postGis实现最短领规划?
  • ¥15 pyinstaller打包错误
  • ¥20 cesm的气溶胶排放文件