$ L7 }5 P: v: l* v6 L6 S 0 K3 Q1 q. [ N K7 F8 r0 d e3 D4 O $ o& s& d" y v* C ) J# s' [' |# J/ q% A2.4、随机森林的实验案例及分析 l, t3 u U& Q8 R+ N. Q我们先看一下我用的数据集,我用的还是上面决策树案例用到的根据环境状况判断是否打球的数据集合,14组数据。 ' z/ o+ i2 ?1 C4 L3 E& |& h& P( t. e$ J1 X- _- x A
& }. q: T% v4 t. g+ t
; `0 g9 n/ d0 R; k( P w& |! L9 ^
+ w% Y& u8 s d+ J' I3 N + G g6 C3 ^; r& W( r第一步:确定决策树的个数和决策树叶子节点数量,其中,RFOptimizationNum是为了多次循环,防止最优结果受到随机干扰;大家如果不需要,可以将这句话删除。+ K% G, z i( N( `" o
( x% `$ a& v2 G 这里决策树的个数设置1~500,在这个范围内寻找最合适的决策树个数。( d; F' q Z: {3 B' W
RFLeaf定义初始的叶子节点个数,我这里设置了从5到500,也就是从5到500这个范围内找到最优叶子节点个数。: J$ c! ^$ W; u) ~ y/ U, Y9 ^% b
Input与Output分别是我的输入(自变量)与输出(因变量),大家自己设置即可。# q! L- B: |8 H6 g
' q' W' e4 M; j, ^" }+ V% f 7 i4 |1 u: B' B! Z" wclc( m% r% F: N- J$ L+ W! Z
clear$ d$ X4 `+ a7 ]+ E0 S6 m j- ]
load('data1.mat') ; U. j9 p5 n1 F( M' X6 W3 lInput = data1(2:end,1:end-1) 9 X f$ m0 n2 i
Output = data1(2:end,end) 9 N+ e8 s# R5 K" h%% 确定叶子节点和决策树的数量6 ?, B0 e* ?4 b s
for RFOptimizationNum=1:5 : Y/ [( T7 J |: S, k* BRFLeaf=[5,10,20,50,100,200,500]; ( S% h% C( H! z4 s4 y4 A% Z+ u- ~' Scol='rgbcmyk'; ( Q0 I. x7 U7 u' v6 U% j* Pfigure('Name','RF Leaves and Trees');/ L% ?( M: f, w4 ~9 l
for i=1:length(RFLeaf) & j4 G* G2 Y4 q7 [9 ? RFModel=TreeBagger(500,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i)); 1 N5 J, e& c; ~; X plot(oobError(RFModel),col(i)); * I, a& w2 o6 b. `4 n4 j5 d2 X hold on5 R% O6 s* L- e5 b& Q
end & D$ U, V- d" ], }6 J9 Q, Pxlabel('Number of Grown Trees');7 M$ V" d% h4 F4 [# h
ylabel('Mean Squared Error') ;( F. l3 z0 A3 [! O" T3 L
LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast');4 ]- b( D E, u- z3 ?( A" ^
title(LeafTreelgd,'Number of Leaves');$ B: o9 Q6 v' I5 b6 B" w) h6 R* {
hold off; 9 \: i% t" U0 k! mdisp(RFOptimizationNum); . T- n7 l Y% c8 W0 ^4 bend 4 a2 N9 z. F. p' [3 ? Z/ C. D7 {" D ) c% `1 Q- ^: {! f8 e我们从图中分析可以发现这个数据集选5个叶子节点,决策树的数量选取200左右就可以。其实由于该数据集数量较少,总的来说,决策树的叶子数量选取产生的误差相差不大。: n+ _, N% E& l& l
, L5 |4 O( A: W: e
# ~* E+ p! r* U. p
# [- X! r9 Z6 S% j选择好决策树的个数和叶子节点数,后面就可以对数据集进行划分,然后建立随机森林进行分类预测,可以计算出预测误差和每个特征的重要性排名,重要性越大,说明该特征对分类的作用越好。 0 q" f A7 w* y! |, ] ! t, {8 ~. a4 fclc * M- D9 L- [7 ~1 I8 H; j' gclear 8 `1 a5 S [! q2 [load('data1.mat'); [% f4 g/ F* u! ~. `* S
Input = data1(2:end,1:end-1) ; A! L- j0 P6 @+ J1 A+ x; \' `
Output = data1(2:end,end) ;* N* D- j. J% M/ ~) t
% %% 确定叶子节点和决策树的数量 / x( I7 H6 |* k( w; b8 c4 A4 O% for RFOptimizationNum=1:5 1 w8 s4 m! U$ S& u0 L! F3 d% RFLeaf=[5,10,20,50,100,200,500];- c$ w: t( f6 }6 J4 l1 K4 t
% col='rgbcmyk'; 0 }7 ~, ^% s" y) @7 K% figure('Name','RF Leaves and Trees'); ( l" i& [ U1 o& c0 b' q% for i=1:length(RFLeaf) + J; P7 q8 Q: _% RFModel=TreeBagger(500,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));1 @8 c9 L! I8 n( ^% Y9 n
% plot(oobError(RFModel),col(i)); ) I4 J0 i/ L5 x5 N" A/ ]" d% hold on 7 a9 E7 m# l8 b4 a0 |9 `4 U% end 4 G' A9 P% ^' ?% H/ M+ U% xlabel('Number of Grown Trees');1 B$ H" v7 n5 w% A
% ylabel('Mean Squared Error') ; * w$ J8 p# }+ {: v. m; ?% LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast'); ) ?3 U- B% P/ P& k* l% title(LeafTreelgd,'Number of Leaves');9 Q$ Z! L M9 F
% hold off;- U. p8 Z2 N4 P+ n
% disp(RFOptimizationNum);/ Z. J" ~, Z4 [/ g
% end( G$ V2 C' {; R# o
%% 循环准备 7 W0 }2 R+ U! \RFScheduleBar=waitbar(0,'Random Forest is Solving...');6 v! y, ]5 O; M# v- {: o
RFRMSEMatrix=[];3 i; S, V% ^- [7 L h F( G, b
RFrAllMatrix=[];% [% l0 M* n7 z9 g
RFRunNumSet=5000; ' h. ]8 l4 B( [: K$ K$ V1 c1 yfor RFCycleRun=1:RFRunNumSet ; c- [! B) N: {. q2 t%% 训练集和测试集的划分$ x) Z+ t l0 k/ d) a- J7 ~9 C+ Y
RandomNumber=(randperm(length(Output),floor(length(Output)*0.2)))'; n2 k7 l/ L; w/ B6 UTrainYield=Output; 9 G; ^) U: w2 O/ y9 XTestYield=zeros(length(RandomNumber),1);9 T4 A4 @ a# ]! B- n3 J
TrainVARI=Input;. ^/ \6 `; s/ m. N! {0 V2 U* y
TestVARI=zeros(length(RandomNumber),size(TrainVARI,2)); 2 v" G4 O d- qfor i=1:length(RandomNumber)4 l9 ~0 X1 @# q$ K: Y5 L
m=RandomNumber(i,1); + Q2 n+ \5 O" Z# v5 ]7 W" W z: i TestYield(i,1)=TrainYield(m,1);2 d5 S; s4 E7 p6 R& `- Y( o
TestVARI(i,=TrainVARI(m,; ) r: \' p* H( w( f8 u& |- ` TrainYield(m,1)=0; G) }& y7 [. J8 m
TrainVARI(m,=0; . P& b# ^6 L/ l: Xend/ h. P$ v: r- M3 h
TrainYield(all(TrainYield==-2,2),=[];6 o% ?4 h- C+ b: r
TrainVARI(all(TrainVARI==-2,2),=[]; 3 [2 S: _) H* ^2 x: zend" k) J/ s4 q& |5 ]. R
%% 随机森林+ }. q9 S. t" R- c* j
nTree=200;9 {9 h5 L s( m6 [9 d2 V1 i$ L; m4 P" [
nLeaf=5; $ w. n0 y; h3 J( |. d5 _7 T+ q' gRFModel=TreeBagger(nTree,TrainVARI,TrainYield,...* _/ K, N- E N& N
'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf); 4 x+ ~! K# [! B! B2 W# S, R[RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);. @5 u* L, q0 |' }% U
disp('预测结果:') ; - g- x w1 T8 f5 j( M5 Bdisp(RFPredictYield) ;! S3 ~! ^' R3 M! x9 j, ]' Z
%% 计算误差 2 b; T O$ e6 VRFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));8 ]0 H4 W7 @ k
RFrMatrix=corrcoef(RFPredictYield,TestYield);9 N* G7 C& z0 [ z0 W+ D2 V
RFr=RFrMatrix(1,2);0 b& B& M$ A$ {( d; w
RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];1 f' p: T; c4 G. ~6 [. \8 U
RFrAllMatrix=[RFrAllMatrix,RFr];" o2 M$ @0 C& r9 o% c
if RFRMSE<1000 - T/ U/ j% {1 h3 H5 w disp('RFRMSE') ; v& X3 y2 J( u, \# v disp(RFRMSE); b6 {. A# Z4 ]: B1 N6 N
end ! P2 K- m/ x) w9 z7 A%% 比较特征的重要性; R% H5 F: Z" ]0 U% Q& Z& c9 j
figure % ]! T& N% v3 `- N# Xbar(RFModel.OOBPermutedVarDeltaError) , p, j w. R7 b% v2 kxlabel('Feature Number') 3 l ^- K9 B8 b# P" ^/ f( Rylabel('Out-of-Bag Feature Importance') J+ F* d; R- u2 Z! h: e; [1 N[mae,rmse,r2,mape] = EvlMetrix(TestYield,RFPredictYield)- _! ?* K& p2 Q: E f
figure, ]% t/ V: q$ d) L* q
plot(TestYield,'b-d') 3 R3 S. V6 x( N- K4 dhold on # e4 h) e9 I( }, fplot(RFPredictYield,'r-d') 9 F' j4 i7 m4 N5 k# m6 Xhold off ! s. X8 X- H( d- e) R: w0 Llegend('GroundTruth','Prediction')" g- p/ i2 Z3 D( R# O$ x4 L
xlabel('Sample Number') 9 r' K, P' k5 `0 {ylabel('target Value')! D$ }3 z! ^/ ~! D
( o2 u3 O8 Q/ G' i+ j! F) u我就用了两个测试数据,效果不是特别明显。5 m, G8 J' B$ v
9 j7 I$ m. | a5 k
6 D" d' s: Y2 \% d* j8 B ) |" Y: B; _6 K. x: O 下面的是每个特征对分类的重要性,1>3>4>2,这个数据量越大,越准确,因为我的数据量很小,所有效果不是很明显。 $ l3 c: s6 c2 ~% }) N 5 N7 N/ z$ j) h2 Z $ @+ G8 x6 E+ x+ b4 G8 s, m+ W! h2 m6 C& H7 k
三、Logistic模型* Q( ^ r/ ^1 Q
3.1、Logistic模型理论 * q6 w5 g6 `0 ^$ G! I1 L我们看一下这个二分类问题,给了一些水果的属性数据和水果名称,根据水果水果属性,对水果名称进行预测。) b" V* ~# k' e
) Q& \; V& C9 i! Q8 l
5 y3 j- S) b5 ?
. V7 r( @3 K; L% t L4 T, D/ z# N首先需要创建虚拟变量,我们根据水果名称创建0和1的虚拟变量,用spss如下: 3 I3 w6 u! ~* n3 l, [2 b / L) J3 K, W, Y5 {0 @ : k& G0 `( `2 V 0 U, P' [4 H/ I3 H5 J# x* |& E* K( M对于二分类问题,我们可以考虑使用logistic模型,预测的概率决定了分类类别,如下: ! \0 F( \. ?; A+ l. [5 o4 @# D4 A1 M3 P2 }6 o. C! E- Q. _' |' y5 w
一般就是使用极大似然估计进行参数估计,然后代入公式进行预测,如下:( W, r, }- @3 q' H! L2 G# K z$ ~
7 ?: }& o% B4 {: v5 M# u8 W
! ?/ \2 C0 Z- B! B
6 W8 B9 v L3 e0 Y- _, N5 z( s- \- S. e& O. m0 B4 k
4 T' I! e5 B$ t2 u7 s( s3.2、SPSS求解逻辑回归8 G& }0 L0 V9 j+ X* e
SPSS求解逻辑回归的过程如下,选中自变量和因变量,便可以完成回归预测。+ F. I# z$ @* a5 a' B
! [8 J/ t& k. K
e& q) F* W& A4 w+ h6 K8 h
4 I% N. X: s [* L9 z如果预测效果比较差,可以加入平方项作为自变量进行预测,一般会增加预测准确率,但是有可能造成过拟合,即训练效果好,测试效果差,泛化能力差,故可以划分训练集和测试集,多次交叉验证,得到一个稳定的结果。( N( X. d1 ^. M. v
/ f. R& p0 a5 B+ y, Q7 M: @9 B
+ S* h: r! V+ \ I———————————————— # U: l n9 x& w8 A版权声明:本文为CSDN博主「nuist__NJUPT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 o; g$ O' R1 u/ N
原文链接:https://blog.csdn.net/nuist_NJUPT/article/details/1267876838 f: `6 h, V! W. i o
$ K2 ~1 _; ^- s