请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册
查看: 7161|回复: 1

随机森林法

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-6-2 21:59:14 | 显示全部楼层 |阅读模式
随机森林法: 区别:本视频是算法底层代码原理实现,本帖内容为工具箱下的随机森林法实现。
百度网盘视频链接:
视频链接:
视频1: http://pan.baidu.com/s/1kVBPUsB
视频2:http://pan.baidu.com/s/1hszKNjA
录制的视频是算法底层原理讲解,底层代码实现,方便大家真正掌握算法实质,开发出更加出色的算法。录制视频的初衷是:避免读者朋友利用大把时间学习已有常见算法,本系列视频旨在让读者朋友快速深入了解这些常见算法原理,有更多的时间去研究更加高大上算法(价值)。

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

使用环境:Win7-32bit-matlab2014a
主程序(MATLAB工具箱使用):
  1. load fisheriris
  2. X = meas;
  3. Y = species;
  4. BaggedEnsemble = generic_random_forests(X,Y,60,'classification')
  5. predict(BaggedEnsemble,[5 3 5 1.8])
复制代码
子函数程序如下:
  1. BaggedEnsemble = TreeBagger(iNumBags,X,Y,'OOBPred','On','Method',str_method)

  2. % plot out of bag prediction error
  3. oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  4. figID = figure;
  5. plot(oobErrorBaggedEnsemble)
  6. xlabel 'Number of grown trees';
  7. ylabel 'Out-of-bag classification error';
  8. print(figID, '-dpdf', sprintf('randomforest_errorplot_%s.pdf', date));

  9. oobPredict(BaggedEnsemble)

  10. % view trees
  11. view(BaggedEnsemble.Trees{1}) % text description
  12. view(BaggedEnsemble.Trees{1},'mode','graph') % graphic description
复制代码


参考:https://github.com/kjw0612/awesome-random-forest
http://database.51cto.com/art/201407/444788.htm


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2017-6-7 20:02:50 | 显示全部楼层
  1. % random forest随机森林 RF
  2. clc,clear,close all
  3. warning off
  4. feature jit off
  5. data = xlsread('数据3.xlsx',3,'B3:P137'); % 加载数据
  6. rng(1945,'twister') % For reproducibility
  7. % OOB(Out-of-Bag)样本
  8. x = data(:,2:end);    % 各个指标
  9. y = data(:,1);        % 输出,按照年份聚类
  10. ntree = 300;          % CART决策树的数量
  11. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',2,'MinLeaf',5 );
  12. %% 原始样本分布情况
  13. % RF来计算样本的相似度矩阵(Proximity Matrix)
  14. Prox = fillProximities(BaggedEnsemble);
  15. PM = Prox.Proximity;
  16. figure(1),
  17. [mdsPM,eigvalue] = mdsProx(Prox,'Colors','rgbcmshpkx*.o><');
  18. xlabel('Dim1');ylabel('Dim2');title('相似度矩阵投影图')
  19. %% Outliers
  20. % 异常样本也称作离群数据(Outliers),通常定义为远离数据主体的样本。
  21. OM = Prox.OutlierMeasure;
  22. figure(2),bar(OM);
  23. xlabel('样本数');ylabel('Outliers');
  24. % 剔除异常样本
  25. abnormal = find(OM>3);
  26. data(abnormal,:) = [];  % 删除异常样本
  27. x = data(:,2:end);      % 更新各个指标
  28. y = data(:,1);          % 更新输出,按照年份聚类
  29. ntree = 300;          % CART决策树的数量
  30. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',2,'MinLeaf',5 );
  31. Prox=[];Prox = fillProximities(BaggedEnsemble);
  32. PM=[];PM = Prox.Proximity;
  33. figure(111),
  34. [mdsPM,eigvalue] = mdsProx(Prox,'Colors','rgbcmshpkx*.o><');
  35. xlabel('Dim1');ylabel('Dim2');title('去除异常样本的相似度矩阵投影图')
  36. xx = x;
  37. yy = y;
  38. %% OOB估计误差
  39. ntree = 300;          % CART决策树的数量
  40. BaggedEnsemble=[];
  41. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',1,'MinLeaf',5 );
  42. oobErrorBaggedEnsemble=[];oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  43. figure(3),plot(oobErrorBaggedEnsemble)
  44. xlabel(['决策树数量,ntree=',num2str(ntree)]);
  45. ylabel('OOB分类误差');

  46. ntree = 500;          % CART决策树的数量
  47. BaggedEnsemble=[];
  48. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',1,'MinLeaf',5 );
  49. oobErrorBaggedEnsemble=[];oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  50. figure(4),plot(oobErrorBaggedEnsemble)
  51. xlabel(['决策树数量,ntree=',num2str(ntree)]);
  52. ylabel('OOB分类误差');

  53. ntree = 1000;          % CART决策树的数量
  54. BaggedEnsemble=[];
  55. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',1,'MinLeaf',5 );
  56. oobErrorBaggedEnsemble=[];oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  57. figure(5),plot(oobErrorBaggedEnsemble)
  58. xlabel(['决策树数量,ntree=',num2str(ntree)]);
  59. ylabel('OOB分类误差');
  60. %% 确定mtry
  61. for mtry=1:15
  62.     ntree = 300;          % CART决策树的数量
  63.     BaggedEnsemble=[];
  64.     BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','OOBPred','On','NVarToSample',mtry,'MinLeaf',5 );
  65.     oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  66.     ROC(mtry) = mean(oobErrorBaggedEnsemble);
  67. end
  68. figure(6),plot(ROC,'o-');
  69. title(['best mtry = ',num2str( find(ROC==max(ROC)) )])
  70. xlabel('mtry'); ylabel('ROC(Repeated Cross-Validation)');

  71. %% 变量的重要性求解
  72. ntree = 300;          % CART决策树的数量
  73. BaggedEnsemble=[];
  74. BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','oobvarimp','on','OOBPred','On','NVarToSample',1,'MinLeaf',5 );
  75. Prox=[];Prox = fillProximities(BaggedEnsemble);  % RF来计算样本的相似度矩阵(Proximity Matrix)
  76. MDA = Prox.OOBPermutedVarDeltaError;        
  77. MDG = Prox.OOBPermutedVarDeltaMeanMargin;  
  78. % MDA、MDG画图
  79. [wu,sortMDA] = sort(MDA,'ascend');  % 升序排列
  80. [wu,sortMDG] = sort(MDG,'ascend');  % 升序排列
  81. index = {'应急响应能力X21','耕地灌溉率X2','饮水保障X3','抗旱经费支出X10',...
  82.     '水库蓄水能力X20','作物种植比例X4','农业总产值比例X18','人均粮食产量X16',...
  83.     '旱地比重X5','人均耕地面积X1','农用设施配备比例X19','外出务工比例X12',...
  84.     '土壤墒情X8','年平均降水量X7'}';
  85. figure(7),
  86. axes1 = axes('Position',[0.3 0.15 0.6 0.7]);
  87. axis(axes1);
  88. for i=1:length(sortMDA)
  89.     plot(i,MDA( sortMDA(i) ),'ro');
  90.     hold on
  91.     text(-6.2,min(MDA)+(i-1)*(max(MDA)-min(MDA))/length(sortMDA),index( sortMDA(i) ));
  92. end
  93. set(gca,'ytick',[])        %  同时去掉 x 轴和 y 轴的刻度
  94. set(gca, 'XGrid', 'on');   %  网格
  95. set(gca, 'YGrid', 'on');   %  网格
  96. xlabel('MDA')
  97. hold off

  98. figure(8),
  99. axes1 = axes('Position',[0.3 0.15 0.6 0.7]);
  100. axis(axes1);
  101. for i=1:length(sortMDG)
  102.     plot(i,MDG( sortMDG(i) ),'ro');
  103.     hold on
  104.     text(-6.2,min(MDG)+(i-1)*(max(MDG)-min(MDG))/length(sortMDG),index( sortMDG(i) ));
  105. end
  106. set(gca,'ytick',[])        %  同时去掉 x 轴和 y 轴的刻度
  107. set(gca, 'XGrid', 'on');   %  网格
  108. set(gca, 'YGrid', 'on');   %  网格
  109. xlabel('MDG')
  110. hold off
  111. %% 按照MDG进行删除指标计算ROC
  112. ntree = 300;          % CART决策树的数量
  113. mtry = 1;             % CART决策树生长过程中分枝时随机选择的变量个数
  114. indexP = ones(length(sortMDG),1);
  115. for i=1:13             % 删除前8个不重要指标
  116.     x=xx;
  117.     x(:, sortMDG(1:i) ) = [];
  118.     BaggedEnsemble=[];
  119.     BaggedEnsemble = TreeBagger(ntree,x,y,'Method','C','OOBPred','On','NVarToSample',mtry,'MinLeaf',5 );
  120.     oobErrorBaggedEnsemble=[];
  121.     oobErrorBaggedEnsemble = oobError(BaggedEnsemble);
  122.     AUC(i) = mean(oobErrorBaggedEnsemble);
  123.     indexP(i) = i/13;
  124. end
  125. figure(9),plot(AUC,'r-.')
  126. xlabel('删除不重要指标的个数');ylabel('OOB-AUC');

  127. %% 重复交叉验证过程指标选择概率排序
  128. figure(10),
  129. axes2 = axes('Position',[0.3 0.15 0.6 0.7]);
  130. axis(axes2);
  131. for i=1:length(sortMDG)
  132.     plot(indexP(i),i,'ro');
  133.     hold on
  134.     text(-0.43,i,index( sortMDG(i) ));
  135. end
  136. set(gca,'ytick',[])        %  同时去掉 x 轴和 y 轴的刻度
  137. set(gca, 'XGrid', 'on');   %  网格
  138. set(gca, 'YGrid', 'on');   %  网格
  139. xlabel('指标被选中的概率')
  140. hold off
复制代码
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-4-18 09:05 , Processed in 0.235080 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表