* @# G B9 ?7 h# Zqueue = {tree} ; %形成队列,一个一个进去& X3 D6 i, l) C0 G u- w5 |, k7 s
while ~isempty(queue)+ \) P+ E" R) b' U
node = queue{1};- w: \, l$ T$ `4 f# r
queue(1) = []; %在队列中除去该节点 5 D9 ~8 {+ d* L+ g% U" \ if strcmp(cellstr(class(node)),'containers.Map') == 0 %叶节点的话(即走到底了)" C ]& y) T) ~0 l! n
nodeid = nodeid+1;' z5 D( A4 s' V
nodevalue = [nodevalue,{node}]; $ Z7 |2 h- M ?) d" z( n elseif length(node.keys)==1 %节点的话 2 p! z! Q' s e nodevalue = [nodevalue,node.keys]; %储存该节点名 ( _- a: w" A Y3 y! l1 h; P* p node_info = node(char(node.keys)); %储存该节点下的属性对应的map + ]" X4 h: i3 n nodeid = nodeid+1; 2 _) C3 E* N4 P# L* {: V branchvalue = [branchvalue,node_info.keys]; %每个节点下的属性6 L |8 T) x* ]+ C) Q7 h! N0 T" E4 s
for i=1:length(node_info.keys)2 w) Y3 B3 ?2 l' Q3 e. ?
nodeids = [nodeids,nodeid]; ! {; S& S/ b8 k x" h4 L end # v' g" S$ N/ r3 C% k end 3 Q d8 c0 `, W$ V5 I! ~/ z6 f- s1 a% a$ H: t2 r3 z& D; |4 @
if strcmp(cellstr(class(node)),'containers.Map')# X5 i" n8 J- [1 b( G1 k; `
keys = node.keys();* X7 d- u: @8 e7 R( @& ?! G. t
for i = 1:length(keys)% R: w i/ Z# j+ a
key = keys{i}; # ?' |8 N4 ?9 {4 ` queue=[queue,{node(key)}]; %队列变成该节点下面的节点 + g. b' ]% l7 v8 ^ end$ _+ W7 X1 x8 }3 R7 c+ Y
end) H/ D& x9 k. {
nodeids_=nodeids;9 @6 N- b/ s$ Q4 E U4 _! y
nodevalue_=nodevalue; * v) C' \. P9 P- F4 |$ Dbranchvalue_ = branchvalue; 6 I r9 C) @- @, rend " {: h& |) V# t4 R% F; R & d& k) x& [: y5 V0 W# i' H绘制决策树的方法: 7 f' H' o$ z. i& ^4 G3 { 1 i) F+ a: e$ T( x: i 0 ^8 c, c1 J# i2 k! C- \3 g! qfunction tree_plot(p,nodevalue,branchvalue) * s: r" N, C+ W. }2 T% 参考treeplot/ S8 F E0 W; r6 t/ W
/ H5 K# n# p* G2 O; k[x,y,h] = treelayout(p); %x:横坐标,y:纵坐标;h:树的深度 7 b% G$ W% R$ ?5 gf = find(p~=0); %非0节点7 ]" C* p% v# _
pp = p(f); %非0值 # Q) r$ y ]2 J$ {) tX = [x(f); x(pp); NaN(size(f))];4 u$ ]; {: q9 I0 c
Y = [y(f); y(pp); NaN(size(f))]; : ]2 S6 \; b* w/ {2 T % \6 q9 T) h, b0 M' S6 @X = X(;( W5 G6 b0 k" E+ n: D" s/ Z" e% j: _
Y = Y(; 1 H9 `) T2 b8 m2 J, ~: ]" G6 v! A4 O& @5 y/ n; D3 b* k
n = length(p);7 K9 U7 X3 ]3 ?: I& \0 p
if n<500; u- t! L' ^& H1 z P) m: s
hold on; * Z) n" G1 |; l) a' e plot(x,y,'ro',X,Y,'r-')! i( [& {+ f& Z. U' T6 j% J
nodesize = length(x); * P' p. Y* m* H& i8 y& a for i=1:nodesize + A# j3 y: B- x3 C' D- R2 H text(x(i)+0.01,y(i),nodevalue{1,i}); 7 C7 W( B" H/ j2 Z1 k7 c6 c end ; P5 L" K P \( E for i=2:nodesize Z, {" g# ?9 n( N( j, b# c j = 3*i-5; * V& |$ V& D4 P! b) | text((X(j)+X(j+1))/2-length(char(branchvalue{1,i-1}))/200,(Y(j)+Y(j+1))/2,branchvalue{1,i-1}) C1 M* p! Y! {* q V
end6 [# }" N, j" \+ N8 C1 i6 k
hold off - a$ i2 ~: @, m2 telse 3 l+ R3 C" t4 e8 [; F- I plot(X,Y,'r-'); 3 S& ?% w6 w) }/ L+ d! u& K% xend ) |) i' R" I# b$ W% D8 yxlabel(['height = ' int2str(h)]);! a( \# v. L+ Q; n+ ~
axis([0 1 0 1]); q! N: a# j; G6 B
end ' ^. p' f+ @3 [: l $ W+ E0 p7 h; q; b测试集进行预测的方法: 0 a, B3 p5 H: X: x' d$ K4 {* r2 W0 f* `
function y_test=predict(x_test,mytree,feature_list) 2 a6 u' P/ p+ c6 x( N( K* @0 S s%测试 # o( A9 M1 F& Z; B 9 i, ~, j/ {$ By_test = {}; & j3 T, ^$ L/ d: Z$ H+ ?row = size(x_test);# F, W: a: B8 S' a
, T( A6 Y1 k5 h% t, Q
% F! ^1 [5 i! u' V$ |for j= 1:row(1)- a0 P1 r" t3 W( E& H1 H
queue = {mytree}; %形成队列,一个一个进去 ' F9 R& P# n+ \# h: U feature_name = 0; 6 \8 T$ N9 \7 W |) ^6 @ feature = 0; $ h3 r6 f9 D+ q2 Z. j: J ) f2 r4 k |( K7 {: I while ~isempty(queue)- u; u% r/ W7 p& i9 S+ j
node = queue{1}; 8 H" Y2 T/ g9 h9 I W) q7 n queue(1) = []; %在队列中除去该节点$ r# I# Z7 D* {
# ?9 M- }$ I6 Z" u; j tag = 2; ; q0 O( J, x0 G if strcmp(cellstr(class(node)),'containers.Map') == 0%叶节点的话(即走到底了)& N& o$ w9 Z. E! n L7 x2 H( F9 t; }
y_test{j} = node; %走到底就是我们需要的标签7 c) p" [$ ~' F8 D2 k
continue7 T! N3 w$ K! ^6 F
elseif length(node.keys)==1 %节点的话 1 e9 t/ f7 w' M) @9 P feature_name = char(node.keys); %得到mytree节点的名字0 O3 H/ f" ~. H7 n# K
id = ismember(feature_list,feature_name); %mytree该特征所在的坐标( ]' N2 E4 e* u& t' d- N
x = x_test(j,;0 S+ F% P3 ^; A9 z: N* F' }# c
feature = x(id); %得到测试数据的特征属性3 w6 a+ I) f1 D; h$ i
tag = 1; - L: p3 C$ k4 `4 |! ?) q; I! _
end( G% @/ P. h4 \& s
! O6 m5 p! f l; p" |
; `2 j8 e9 F! G, l( `2 _
%tag==2 即要走入下个节点- N, s: c% E2 |( m
if tag==2 3 Z8 s& Z3 }& x0 {( d6 s# q- M if strcmp(cellstr(class(node)),'containers.Map') 4 Z3 j0 W4 w/ z hasKeys=0; 7 k# q# o2 j; H) f5 b+ E keys = node.keys();: Q3 N# I5 S& D3 X4 ?1 @
for i = 1:length(keys) 3 \% d1 {7 K, f8 g: O$ z V key = keys{i};3 u; P6 n: m* _
c = char(feature); * g# O4 ~$ _3 z2 {+ p5 J5 @ if strcmp(key,c) : k8 J# K' P( r! X7 k6 N: `/ B queue=[queue,{node(key)}]; %队列变成该节点下面的节点 + D& y9 x* O8 c- t& A+ ~ hasKeys=1;" \' u) Q+ s2 d% n/ Z
end( M, Z0 f7 C$ m4 O
end2 ~/ z1 j3 T+ }- h1 D2 d
if(~hasKeys) # l& g3 k9 S( @; T key = keys{randi(length(keys))}; e/ C: L: X% z# U5 p" f queue=[queue,{node(key)}]; %队列变成该节点下面的节点 . {! [+ l9 h, n8 H. N end 6 F' P8 m. i0 p3 P6 F! }* I9 ~ end ) p7 x/ V* C% p+ D end2 }7 ^" \) S- K9 p" _8 w# c0 ?
( P3 E9 x" A! g3 \ %tag==1 即要选则符合测试数据的特征属性,这样就不用历遍整个mytree 8 W" C5 ^9 P+ R k$ U9 F if tag==1) E/ M& L6 Y# h2 c
if strcmp(cellstr(class(node)),'containers.Map')7 W( J% X( P2 ^- l ^; s
keys = node.keys(); 2 w# K5 f1 G5 b7 f& \: u( h5 \ for i = 1:length(keys)9 W5 g* N l; K
key = keys{i}; ' s$ q2 c. h- J) v% r4 r2 k5 \ queue=[queue,{node(key)}]; %队列变成该节点下面的节点3 y/ h' t& o+ {( a, u( D6 m
end5 p( ~( e# o+ _0 }
end! F6 h l( h, p6 }
end 3 W6 l/ y; a+ M0 v end ! O6 {$ g; o X* d( j if length(y_test)<j : Y2 |0 a" o& }+ l& _ test=1;7 R+ }" t/ ~& a, u6 }
end % x' g0 w3 c) ^; ^" oend ' q5 N$ ]- E) e; X# T, x2 {8 S2 Z5 \& i% }
end* ?0 y) U5 Y* n3 z# q+ h# V: p2 s* ^
* z7 z0 ?9 _# H二、随机森林' N n, \; o2 p9 V4 y& n
2.1、随机森林的算法原理 g! t3 i- b8 h. P我们首先看卡集成算法,也可以叫集成学习,目的是让机器的学习效果更好,常见的又bagging,boosting和stacking,其中bagging是训练多个取平均值,boosting是训练多个组合加权,stacking是聚合多个分类,就是融合多个算法。5 }, i6 Y% E# k4 h6 [
0 d3 g% T0 k: f. f* c) X $ P+ o, ]+ G% C) Y$ k 0 Z. |: j5 d9 T 我们看一下Bagging模型,典型的Bagging模型就是随机森林,并行的训练一堆分类器,数据随机采样,特征选择随机,建立多个决策树,即多个分类器,将多个分类器放到一起就组成了森林。 1 {( z) S3 E, T$ W# p 7 r( j6 P5 f5 x7 p3 P% v 1 T1 ?/ `& U/ [% j* ]) o 9 g1 A' H) u, \5 p通过2重随机性,就是随机采样,随机获取特征,使得构造的决策树具有多样性,最后的平均才能取得更好的效果,更具有说服力。7 }/ I- f& F. V+ z
6 M4 U2 A* c! E6 X9 S
# C' r% w D* p& U' B8 v4 z
: t* \8 i8 T5 s2 f8 ]) F
2.2、随机森林的优势与特征重要指标 L' E5 y# J9 X+ i1 {+ X3 z1 C3 @
随机森林的可解释性很强,神经网络虽然也可以用来预测和分类,但是神经网络的隐含层不具有可解释性,我们只知道输入和输出,具体内部怎么做的,细节无从得知。随机森林方便进行可视化展示,可以自动做特征筛选,并行速度较快。 2 o# f! e( X" z: q/ h - e! o3 R) G0 z) {/ j( B2 I' E' j- t3 d: d4 J. E! j5 a# _; W
) `, F7 A9 y" |$ q) X5 S
对于随机森林中决策树的个数应该为多少个呢,我们看这个图,可以发现当决策树达到一定的数量,准确率就趋于稳定了。/ h% |% U7 H, F% D4 U' C
2 D3 x8 ]" S( a/ u% m 5 ^0 }% d) R' ^6 p. e- c5 Q & m" J( c( R1 N! U. ?. T- q 2.3、随机森林的分类过程 7 o9 c4 v- n+ S+ j( i训练随机森林的过程就是训练各个决策树的过程,由于各个决策树的训练是相互独立的,因此随机森林的训练可以通过并行处理来实现,这将大大提高生成模型的效率。当输入待分类样本时,随机森林输出的分类结果由每个决策树的分类结果简单投票决定,随机森林的思想是:随机选取样本构造决策树,随机选取特征进行分裂。5 m( [) }% b' T8 m
- a3 {# m% f* s' Z
( E, q4 H* u" S# [6 x O
+ _( X W+ _; ?2 |" P# A
随机森林的最终分类结果是取众数的方式,或者理解为取平均的方式。2 Z8 ?6 r- t+ e* g! |2 ?$ W ?6 x5 d
$ Z8 B8 d$ c5 G \. B3.2、SPSS求解逻辑回归& @0 a" |5 y8 w3 I- ]$ H1 Y1 a
SPSS求解逻辑回归的过程如下,选中自变量和因变量,便可以完成回归预测。 # U( n+ r. \+ J+ T+ b$ }1 s5 _4 E. t! m' K2 K: j
: L+ u- |0 c7 [, S, ?) }" ?0 B. P! M% q0 U- K2 B+ j
预测的结果在如下表中,第一个是预测值,第二个是预测的分类值。3 P& e: s7 u( E3 ~9 s. c/ U4 E
, ?5 U6 d. f( h9 i \# c1 n2 t9 T
8 p' l; X- ?# u* k" A
如果预测效果比较差,可以加入平方项作为自变量进行预测,一般会增加预测准确率,但是有可能造成过拟合,即训练效果好,测试效果差,泛化能力差,故可以划分训练集和测试集,多次交叉验证,得到一个稳定的结果。: ?/ z5 e/ ]% L) V1 }# t
8 N6 |+ p' P8 T5 }" w
* K1 ~3 V6 J2 l; R/ I
———————————————— ; N% _/ k b' }8 D( I版权声明:本文为CSDN博主「nuist__NJUPT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: t" O* t/ B# u
原文链接:https://blog.csdn.net/nuist_NJUPT/article/details/126787683 : ~6 f2 K! K& k |1 ?" V8 _) f x% L/ A# W; R I5 e