; F* A9 z* {6 k' R3.2、SPSS求解逻辑回归( K# _# R) i$ W# q& Y) }8 B
o W" E4 S4 y- P' m5 H一、决策树 , ?6 N' H. M; R/ ^1.1、决策树算法概述# W: N% h+ {6 S: }
决策树就是从根节点到叶子节点一步步做决策的模型,最终所有的决策都会落在叶子节点,这样该模型既可以做分类,也可以做回归。决策树有严格的先后顺序,每次决策类型的顺序不能发生改变,在前面的节点的重要性要比在后面的节点的重要性要高, % q2 V! d! T$ W$ A" G ]0 p& z$ k1 T; b5 ~% A. [/ h
& N$ V. ~9 ~2 h- z. h
. B; {. l% n' m) @% L
决策树的组成如下:从根节点到叶子节点,最终的决策在叶子节点。) r8 u/ ?5 P w6 o! @( a
/ Y* L$ B- ~3 J! R5 Q ; H, Y! `3 y* [& u6 E3 p* B) n1 E* j) a+ z w
决策树的训练:根据数据构造决策树,测试:有了决策树后从上到下走一遍。 * O# r: k) |- O7 o1 [; X% ~" ~* G# M# K
" u2 E. h* D' h6 _( v: x) l7 O; c- M& V1 M
1.2、熵值的作用 + ?* l: ]/ s# z* p& p0 F1 Q4 j我们在构造决策树的时候需要根据特征的重要性进行切分,即根据区分效果划分节点,那么如何衡量每个特征的重要性呢?一般使用熵值去衡量。9 v6 T! {, a2 |: P7 D8 L' Y
1 R- }1 `' a* q: l% ]! X
: y4 o& j4 }& O4 s. m
2 z' w$ Z4 C# P) p% v: Q 我们使用熵值去衡量决策树特征的好坏,熵值越小,说明越确定,即相对稳定, 6 E7 H8 r* f/ M& l3 X) a( P8 C * n3 @) A9 E7 [& C+ ]5 t 4 K1 e: g V6 c) g8 F7 h, G: ^: ?4 X4 s: n' H% e4 ]
选择信息熵小的,使得按该特征分类后的该类的不确定性程度减小的多。 ; i N+ \8 `: k( h# L! p; G4 \! W* q6 z9 N& j: ^- g( d
& D1 B# a& U- o: R, L" i
5 \( ?: |/ T/ _5 X" Zfunction Gini = getGini(y) ; b6 i$ S3 R( s# F9 E% 计算基尼系数) \1 h, K' J' D& a# n
% y对应的标签,为1或0,对应正例与反例 5 x# N# O6 h" s# |8 A) D# ?/ b%%%%%%===============================================================================; ?; J3 a3 L7 x2 N
N=length(y); %标签长度7 S* p1 a& w! d. r5 A0 }
P_T=sum(y)/N; %正例概率 I" F+ I: ~: }! S4 i1 x$ L P_F=1-P_T; %正例概率 " A9 \% F- M4 X# d Gini=1-P_T*P_T-P_F*P_F; %基尼系数 " d2 @% p( R0 c5 E7 m0 M/ ^6 o4 \%%%%%%===============================================================================, J* ?" ^5 f! I; k! g' {1 z! g, g
end3 L3 d+ u( l0 O
构造决策树的过程中,划分数据集的方法: Y% O3 j( n, o: k p9 P- C- m+ C! y# r) wfunction subDataset = splitDataset(dataset,axis,value)# }# w/ n3 V: L# _/ J) f
%划分数据集,axis为某特征列, 取出该特征值为value的所有样本,并去除该属性 * o: G; W* v4 n/ l % F7 \0 W; m2 G# `% N* HsubDataset = {}; ! [+ ~5 [4 Z* E3 Y0 Ddata_size = size(dataset); 1 }% A j: }( v( d4 D! ^1 x- g 8 W1 l t! W% q1 V% \& Y; Z%取 该特征列 该属性 对应的数据集 6 J8 s) i5 N( x" N& F- Ifor i=1:data_size(1)6 ^* o$ f8 {# Z7 }4 @0 W' u
data = dataset(i,; " U3 r! f' x4 F2 [ if strcmp(cellstr(data(axis)),cellstr(value)) 0 D/ Y4 }. L1 S' E subDataset = [subDataset;[data(1:axis-1) data(axis+1:length(data))]]; %取 该特征列 该属性 对应的数据集 ! i$ Q4 F' _: ^5 s) a end ' Q* ^# y2 E' _5 q/ n Lend* r$ T$ P) i) W7 Y0 U$ d
end 1 r" z$ h r( m7 k; s- ~: n遍历决策树的方法: 3 `( E) ^9 r- ^9 I2 l- @& o. l7 o% N O( {
function [nodeids_,nodevalue_,branchvalue_] = print_tree(tree)7 q' ~$ h& H6 M
% 层序遍历决策树,返回nodeids(节点关系),nodevalue(节点信息),branchvalue(枝干信息) D) B# j- g+ k& j( M8 r, W
nodeids(1) = 0;8 v; m x- a c9 v
nodeid = 0;, Z9 x# ]9 P' C( y/ _- l3 c+ W
nodevalue={};7 B9 O- b; r* G9 o U
branchvalue={};$ c G6 ^6 A' B6 H( y" \
: _4 L: _. \! {, n2 w. C% Y+ k
queue = {tree} ; %形成队列,一个一个进去1 U) [% M+ A; Y, p& k' p; o0 C
while ~isempty(queue) 4 b9 K$ [5 c& g+ o+ K9 X node = queue{1};: n( e; z. P- t8 ~/ J L. m k; i& D
queue(1) = []; %在队列中除去该节点& [" N! X' x( c2 X
if strcmp(cellstr(class(node)),'containers.Map') == 0 %叶节点的话(即走到底了) . x$ @- F3 L- Y8 w" f7 D nodeid = nodeid+1;. x. k# e; k) N1 l: H
nodevalue = [nodevalue,{node}]; 8 N2 L2 C Z' b3 t elseif length(node.keys)==1 %节点的话# e7 |# ]0 Y" H) @ ^6 D) h
nodevalue = [nodevalue,node.keys]; %储存该节点名 / O) U8 ^1 ?' g8 j" I5 } node_info = node(char(node.keys)); %储存该节点下的属性对应的map D# s( ]" j+ D x9 d nodeid = nodeid+1; " e) M4 I0 `( j/ S branchvalue = [branchvalue,node_info.keys]; %每个节点下的属性 9 z6 O9 z' x a! o" i# x3 b for i=1:length(node_info.keys) ' f) {( t j/ k5 X nodeids = [nodeids,nodeid]; " Q+ \. _; F/ N' E- \* c end 4 s/ _8 U- i8 {( ?, y9 d5 Y end 3 e Z5 M. l5 c6 H1 T2 g) g 8 V! v: Z5 ^" c* ^2 ~6 ^! S4 W if strcmp(cellstr(class(node)),'containers.Map') 9 V% T; Z6 s/ q% w keys = node.keys(); ) J& A1 C' O$ b2 A! u9 x/ e for i = 1:length(keys): m1 C% x5 s% z8 w* Z& r
key = keys{i}; , [. n( ^ N) q5 b* u% p. I6 s% c9 _ queue=[queue,{node(key)}]; %队列变成该节点下面的节点8 a4 \$ d$ |7 u" b+ ^: R6 g0 r3 V
end, b5 o1 p) l7 x: G
end 6 `2 [& o9 E" `+ t: Jnodeids_=nodeids; - @* U6 N+ R# t; knodevalue_=nodevalue; ; }6 V) P1 J1 {branchvalue_ = branchvalue; ! U3 n/ Q& p- ?4 {end8 ^0 Z( E) f6 ~5 m& b! b1 A1 m0 j& W- Y; [
% S8 L: ^8 P) i8 u' }6 |8 U9 p$ [
绘制决策树的方法:9 g+ F1 t" R& x% d$ X, K; `% V9 p
- c; K! K0 n2 W# t
/ M* J- f. U0 y3 M* o5 N% _4 `# c
function tree_plot(p,nodevalue,branchvalue)& N" ?4 Z1 x$ S7 j
% 参考treeplot - M* w5 H. h' Y1 Z9 k8 {2 ~ p : D4 ~' D' r: H9 F: e[x,y,h] = treelayout(p); %x:横坐标,y:纵坐标;h:树的深度- X8 q* |# A$ D' W3 t# g& Z
f = find(p~=0); %非0节点 g2 m# e1 u5 @3 J3 Upp = p(f); %非0值4 I/ W; U2 I% x U; @
X = [x(f); x(pp); NaN(size(f))]; , d5 F+ N+ h TY = [y(f); y(pp); NaN(size(f))];: O5 ?0 Q2 T4 T3 S6 P( _
9 J% Z0 N* b0 p% ^* F8 _$ YX = X(;1 n( V& r p) B/ c5 g/ i
Y = Y(; ( a4 b& X- E0 v- | + ^! ~ J! P+ k2 A/ m; @# mn = length(p);* @1 O6 c3 I' @8 `1 u9 _/ N' H$ ~) t
if n<500 + Z: ?. T& v0 ]2 S' U% l% K+ J. j hold on;8 M; [3 B1 P% J- B
plot(x,y,'ro',X,Y,'r-')$ ^! X! M2 p3 h! ?4 E3 @8 K. A) f4 z
nodesize = length(x); 7 Y% a. y% b& U. U# a0 e% e+ ] for i=1:nodesize , F! X, e; C5 N& X+ m* J text(x(i)+0.01,y(i),nodevalue{1,i}); ( @3 m! k& P) V! n, g# g3 H' V/ \
end ' d& i h# p0 Q. c! @/ N for i=2:nodesize `# e$ v q$ ]6 s" N
j = 3*i-5; : A& _2 c( p" O' c text((X(j)+X(j+1))/2-length(char(branchvalue{1,i-1}))/200,(Y(j)+Y(j+1))/2,branchvalue{1,i-1}); x" f2 J7 l4 w! ^ K# S5 n
end- ?5 n: k1 L, _2 O; c7 n
hold off , Z9 o9 @- z/ g2 {6 Helse 4 Y7 r3 K( T% U$ P9 _ plot(X,Y,'r-'); U7 W+ @; @* [; U5 e/ w
end9 h* U: _! U/ S+ m d2 }( e9 ~3 L
xlabel(['height = ' int2str(h)]);: ~7 {1 l) ~; R; I
axis([0 1 0 1]);4 p" n0 P1 ?2 j5 K5 t7 d
end; V' P4 \- |& ^) T }1 t
|/ y9 S; |& B5 `, {% B测试集进行预测的方法: + ]1 {7 f3 i9 {' }+ ^, B" d% q" [# B: i. O, L7 ?
function y_test=predict(x_test,mytree,feature_list) w/ p5 x3 |: ~, ^) ]
%测试0 }4 N6 F+ Y, z, p( V, P( R/ t7 v
* a) Y2 e1 ?2 J% R+ S2 Y0 C8 y
y_test = {}; * x" {7 B; [ `# g6 J7 ~row = size(x_test);2 d4 [# V$ s4 i. g
+ r* e! ~, @, f
; g4 B8 y7 H4 f& [# \
for j= 1:row(1) * P7 r* X# J; ~) S7 @7 _2 T3 \, S queue = {mytree}; %形成队列,一个一个进去 . `- k1 ]: G& h; w& k feature_name = 0;, b- C5 m6 z' u$ Q' {- `: z3 @
feature = 0;( S% N2 ?* |( r, v9 G/ S% C$ x
# }! i, a( }. [3 u$ ~ while ~isempty(queue)1 ?4 c6 b7 W8 H5 i+ O$ K$ q
node = queue{1}; & z4 F, H# U, r: w: y queue(1) = []; %在队列中除去该节点 0 @8 d; j+ Z- E, { f5 R* l& s( H& [3 _. {4 g* b
tag = 2;# i3 ]& P' |9 o" v9 {1 M( W
if strcmp(cellstr(class(node)),'containers.Map') == 0%叶节点的话(即走到底了) / X* S1 v0 m1 [6 d: a3 j5 x# ^; S y_test{j} = node; %走到底就是我们需要的标签 * A) e, j' w) F4 @+ d- F continue " M B' | f1 {$ M' \$ O4 a& ] elseif length(node.keys)==1 %节点的话1 D4 z. ?, _0 u& v$ a, n; x0 O
feature_name = char(node.keys); %得到mytree节点的名字2 A% D% O3 z' d' k. m3 B @
id = ismember(feature_list,feature_name); %mytree该特征所在的坐标 ! g O. l! I. c F2 ?8 r& m x = x_test(j,;- G/ g( {9 l2 w; o; J$ Q
feature = x(id); %得到测试数据的特征属性 : e N+ r% J2 W( {# W! @, l& X tag = 1; 1 o @1 C" P5 K% D% I+ m9 S end. e2 {4 w6 U' j" t3 }0 C R, P
$ S& \9 G% S' K9 i2 P, b
' h' H0 ]4 g+ A: j( g4 o
%tag==2 即要走入下个节点 # A! {7 m! L1 z, M; m" @ q4 ?$ j if tag==24 g, i: i/ X' S# y( R
if strcmp(cellstr(class(node)),'containers.Map')( g, A/ |6 E: a" h2 H
hasKeys=0;- f- \# S% u4 r9 J- J
keys = node.keys(); 7 V5 w. c- F! t for i = 1:length(keys)2 Y! ?* y# ]2 v
key = keys{i}; . W# N B0 O" A$ T, X c = char(feature); / K" B, ] }$ g if strcmp(key,c) 0 \: _5 u d4 Z- h6 V2 ~ queue=[queue,{node(key)}]; %队列变成该节点下面的节点 * E: A' ]; e* u- i hasKeys=1;9 L, w2 D. F7 I8 K: b. e$ ?) I% N
end # h& m. P- W( F# w! N- T9 n end" f7 N+ ?( S. r5 b
if(~hasKeys) + x4 t& r- H' b5 q1 F( ~ key = keys{randi(length(keys))}; 2 K) a2 ~* x( o. N8 [' b# H6 a queue=[queue,{node(key)}]; %队列变成该节点下面的节点" `5 k, }- q" L' d6 C
end 3 u$ e; w9 [& ?2 e% K, r2 K end& O: H; a) d3 b# j+ i* y7 C- U
end/ O' ]* X6 I2 D
7 z. y1 U2 D8 @ %tag==1 即要选则符合测试数据的特征属性,这样就不用历遍整个mytree 7 C$ Y- ~1 t$ O( @4 k if tag==1 % ] _! T3 T F. y3 o if strcmp(cellstr(class(node)),'containers.Map') & q3 O0 k, @5 H! _ keys = node.keys();5 q- }* |$ b% n" v) K
for i = 1:length(keys) * u4 H6 U; I u7 I! P+ q3 p# x key = keys{i};, h) I0 q' p9 l: v9 r: j) L
queue=[queue,{node(key)}]; %队列变成该节点下面的节点 . Z0 \- B: V4 O5 O3 N$ V6 G1 @ t end + H5 @ F# e1 p6 D6 R3 R9 N end ) w3 g( P8 ?# N* p4 Y end$ g/ F$ }4 N% `0 X
end# c( Z. R. r6 Y1 o3 M7 x# B0 w
if length(y_test)<j! c* c. s. {% w# I, S
test=1;* l5 [) a% R( J+ P
end / q* y5 p; T% p# Kend, G$ d5 I* s: m6 e4 n
0 @3 M, e; v, C7 h8 c! C. \3 Eend l7 X# Q& X# k+ v6 W# t6 |4 y/ I
) v, \- @* P% C" j4 ~( O( z K; k二、随机森林 1 i* f( E& C9 [+ Y b2.1、随机森林的算法原理! k: Y# n( h* ^4 D S0 S
我们首先看卡集成算法,也可以叫集成学习,目的是让机器的学习效果更好,常见的又bagging,boosting和stacking,其中bagging是训练多个取平均值,boosting是训练多个组合加权,stacking是聚合多个分类,就是融合多个算法。& k4 W* B# f J8 D, E
& m& D2 Q4 }7 s: W: T+ {3 p
- |' R/ @: ?( q0 q+ m
4 e/ a6 [% z% r. m+ M' z, X 我们看一下Bagging模型,典型的Bagging模型就是随机森林,并行的训练一堆分类器,数据随机采样,特征选择随机,建立多个决策树,即多个分类器,将多个分类器放到一起就组成了森林。: G, L9 m/ W8 y% R! V' O
2 s3 } ]) ?& {7 ?# M
" O$ _! ]: m; l8 ^! e2 w; q8 ?2 A. W0 T' \6 W
通过2重随机性,就是随机采样,随机获取特征,使得构造的决策树具有多样性,最后的平均才能取得更好的效果,更具有说服力。 y6 |' w9 E9 P$ q2 G. o7 M
+ \% [/ }% l! B# f- Z( a+ D $ M* W5 A+ Q/ e0 R# K5 C( \- d- ^( |4 `) Z
2.2、随机森林的优势与特征重要指标 8 S+ g& b4 j% _5 ~; _2 c: A$ d随机森林的可解释性很强,神经网络虽然也可以用来预测和分类,但是神经网络的隐含层不具有可解释性,我们只知道输入和输出,具体内部怎么做的,细节无从得知。随机森林方便进行可视化展示,可以自动做特征筛选,并行速度较快。 * \# v' d$ {! s. y$ |- r! q; I( p ] w0 {' `' X; ~/ I
' `: |: a0 g" b
& H6 b, ? o5 t7 p K7 B
对于随机森林中决策树的个数应该为多少个呢,我们看这个图,可以发现当决策树达到一定的数量,准确率就趋于稳定了。 ( Z) g+ B D0 w4 j, ?7 ?6 ]) w3 y, Z9 _7 m6 S) l# U
+ ?0 ?; i7 i2 u( J- {3 G. K
, s* J4 ?2 N2 Z y( }& e
2.3、随机森林的分类过程 3 b( K8 L( i" F6 B/ F训练随机森林的过程就是训练各个决策树的过程,由于各个决策树的训练是相互独立的,因此随机森林的训练可以通过并行处理来实现,这将大大提高生成模型的效率。当输入待分类样本时,随机森林输出的分类结果由每个决策树的分类结果简单投票决定,随机森林的思想是:随机选取样本构造决策树,随机选取特征进行分裂。 2 c2 {$ I. P; U* s- j1 x' X1 U$ i; t% _
; z' L2 |9 M( B/ ?4 X" U# \6 r
, A% M+ }4 y( _2 K
随机森林的最终分类结果是取众数的方式,或者理解为取平均的方式。 " B7 N9 ?6 I+ \3 m I: I$ V/ @- }) U" M# s& a0 a: f
: X1 W- s! d# ~+ a 5 M3 | I3 }' i) J7 C$ E分类过程可以近似表示为如下:, E! {% w* l% ^" z2 x* N. `: P
& l1 W5 q l' F) m* [) d: I4 z
( J; g+ Q* u' `. z I4 D
, d4 t0 D3 u5 g
% h3 y+ X8 c1 c& D$ N; Y" s0 L1 e# X) h
2.4、随机森林的实验案例及分析% m! V+ ^/ k; A. h) [4 U
我们先看一下我用的数据集,我用的还是上面决策树案例用到的根据环境状况判断是否打球的数据集合,14组数据。 + R# _. D9 `1 c. H- L" h. p5 X 8 m+ j6 g+ l! j# Q! k% j1 T" K 6 A3 j* m8 n, l0 Z8 q ! v$ a# F$ ~2 h; g' l/ v1 o9 q# u/ j" P# L ]8 |# j7 F; H( e, u; l" K
# u" |7 h p6 ` d$ B
第一步:确定决策树的个数和决策树叶子节点数量,其中,RFOptimizationNum是为了多次循环,防止最优结果受到随机干扰;大家如果不需要,可以将这句话删除。+ J$ q& W6 A1 ]
; D7 q( k) w) u3 y) y: F- r! b 这里决策树的个数设置1~500,在这个范围内寻找最合适的决策树个数。+ T Y2 Y9 R0 g" ]8 c( ^$ }
RFLeaf定义初始的叶子节点个数,我这里设置了从5到500,也就是从5到500这个范围内找到最优叶子节点个数。5 G$ V$ d. }" {( ^+ A1 h- M& T7 `
Input与Output分别是我的输入(自变量)与输出(因变量),大家自己设置即可。 : r; f. ~) u# A/ x" z $ D X: T& K, [# R" x& X6 Y( I& F0 B, c
clc; V( ^4 ^2 l+ j) u! J" F7 v U
clear8 S; Y3 v/ p t" u* e9 V
load('data1.mat')+ k `6 m9 t/ q) S
Input = data1(2:end,1:end-1) ' I8 u" V6 }+ d. U" Z) q8 dOutput = data1(2:end,end) 3 \( X1 Q5 ? Q+ L1 [: O
%% 确定叶子节点和决策树的数量 ! F& \4 N2 m- ]' J3 w2 R v- ffor RFOptimizationNum=1:5* Z( C/ T. N; B
RFLeaf=[5,10,20,50,100,200,500]; 4 ~7 @3 T3 \) B6 f4 D6 A2 q0 T- u; {( Rcol='rgbcmyk'; 8 J0 Y5 c$ Q0 M; Afigure('Name','RF Leaves and Trees');% R1 [0 s! b# E8 n" h6 j
for i=1:length(RFLeaf) 7 P- c: P3 G0 o$ {! _ RFModel=TreeBagger(500,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));/ e9 Y# y( d8 h8 j; D, _: N
plot(oobError(RFModel),col(i));) _; L1 F6 e! p9 g" o0 |
hold on8 r0 K3 a7 C3 S. I0 ^
end * ~7 P# h1 T! t1 J. ~: ?xlabel('Number of Grown Trees'); + }! F* K$ I2 B! b/ L' C- c( xylabel('Mean Squared Error') ; # A7 v1 G% w$ f7 a5 M: V$ u. WLeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast'); + j/ J+ c. b5 O8 A$ j, t1 ?- f( J/ Rtitle(LeafTreelgd,'Number of Leaves'); # Y9 z2 q- `# Ohold off; ( ^8 h( C/ B9 Z3 d5 V2 hdisp(RFOptimizationNum);- N7 v* |/ G$ X
end8 l8 i/ B, z `. |/ Z [' \
. d5 f% V) A& S我们从图中分析可以发现这个数据集选5个叶子节点,决策树的数量选取200左右就可以。其实由于该数据集数量较少,总的来说,决策树的叶子数量选取产生的误差相差不大。 9 l/ s4 ]) k/ B8 n. y ) m8 R* Q$ a( z 6 {5 I/ U1 M9 _ 7 O& G. a, @: ?( Y, A0 |选择好决策树的个数和叶子节点数,后面就可以对数据集进行划分,然后建立随机森林进行分类预测,可以计算出预测误差和每个特征的重要性排名,重要性越大,说明该特征对分类的作用越好。 6 a' z7 w3 s2 N3 f2 Y7 e& }% }5 {. o) a! [
clc 9 m. P, ?5 U9 X4 T# E( \clear . {9 \3 _2 A( E, V2 hload('data1.mat')/ q) x, \0 s0 C7 U" B ~& |
Input = data1(2:end,1:end-1) ;$ R4 B3 t% h* ?+ k% [
Output = data1(2:end,end) ;% S( l# Q0 l' T" b9 l
% %% 确定叶子节点和决策树的数量 7 ]' R' H7 j! ?. D" b% for RFOptimizationNum=1:5 Z. q( ?) P4 g% ^* U, ^# T
% RFLeaf=[5,10,20,50,100,200,500]; , d$ N p r8 H1 K: i! d4 K6 ]% col='rgbcmyk';& x; }9 G8 J2 X0 g& P
% figure('Name','RF Leaves and Trees'); 6 ^" d* |1 `9 K% for i=1:length(RFLeaf); ]5 J% _# Q* k; n/ F
% RFModel=TreeBagger(500,Input,Output,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));8 _& {/ t+ e; [* |9 Z
% plot(oobError(RFModel),col(i)); ( E0 H9 b# z7 X6 e1 O% hold on 2 e6 l/ O, G- j1 y. e+ W" a- q% end * }& j- o5 g6 V4 R0 z% xlabel('Number of Grown Trees'); @6 s/ y9 C& d; g4 U
% ylabel('Mean Squared Error') ; z/ M1 d# M- A& J+ H/ J
% LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast'); 1 R8 \9 J' x) O) h8 C% title(LeafTreelgd,'Number of Leaves'); & ^7 }9 |; O7 @9 F% hold off; 5 X) b& B g* S) {1 n% disp(RFOptimizationNum); 5 U, n6 y0 z, _, ]/ B" [8 d7 P K: m) ]% end ; s4 b4 o# T& P3 k%% 循环准备7 I \) ~9 @# C ~- S6 q
RFScheduleBar=waitbar(0,'Random Forest is Solving...'); , V1 p, l6 a; i* ]0 w5 Q% ?" J$ z: |9 ERFRMSEMatrix=[]; " V6 f# C% a qRFrAllMatrix=[]; ) Z X: k& r- u5 g1 U; vRFRunNumSet=5000; % S( ]5 e2 c, U. A& I% {, u1 xfor RFCycleRun=1:RFRunNumSet , F% B7 G6 A" D; \9 x* c" X. }5 @6 e2 K%% 训练集和测试集的划分 0 A9 v; Y, t. @5 D4 t. X X( o lRandomNumber=(randperm(length(Output),floor(length(Output)*0.2)))'; $ B( T4 W' r% d) dTrainYield=Output; 7 \$ u3 r9 |0 G4 q* `TestYield=zeros(length(RandomNumber),1);& S5 ~; o: t, z- y' R1 c
TrainVARI=Input; 4 ~* I3 E; f. w9 XTestVARI=zeros(length(RandomNumber),size(TrainVARI,2));4 M; T! e9 B0 d: S
for i=1:length(RandomNumber), R5 W0 p( t, Z3 N8 H
m=RandomNumber(i,1);# Z/ \2 \3 _/ L! l; I8 D, k6 @7 E# L# O
TestYield(i,1)=TrainYield(m,1); ( C4 v4 |" |/ P1 O" q$ @ TestVARI(i,=TrainVARI(m,;2 ~# J X2 a7 \7 k
TrainYield(m,1)=0; . k& I; \0 d# n" z) c0 H' y+ o TrainVARI(m,=0; 8 @1 D: p/ { W$ A% f- G2 x6 pend # A. A6 b7 f/ J1 T; ]8 u. o4 q1 ]TrainYield(all(TrainYield==-2,2),=[]; % r/ X; ?+ h4 N5 c% \2 z7 C. R" s* S: d; ETrainVARI(all(TrainVARI==-2,2),=[]; H p7 ?- D8 e& j
end! g$ h* O+ O0 E
%% 随机森林# S/ J5 m; [4 }
nTree=200;% W- R8 k6 [" W" `2 j$ O
nLeaf=5; V$ k+ Z) L2 C8 S6 r/ G2 |) D
RFModel=TreeBagger(nTree,TrainVARI,TrainYield,... ( h+ w7 a- V% Q0 o 'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf);. G3 W1 T5 P( a: b
[RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);& v' H j$ D6 c" l9 k4 h
disp('预测结果:') ; / r6 C7 `4 p4 S" n0 }4 O) Tdisp(RFPredictYield) ;' e/ ]6 }2 `3 R0 t( s& b
%% 计算误差1 k" Q5 ^% M+ x& C
RFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));) A" r. X: l" v& M# ?% X1 w% {
RFrMatrix=corrcoef(RFPredictYield,TestYield); 0 d4 ~ C, G9 Y( l0 K, {RFr=RFrMatrix(1,2);* k* r7 T6 [9 m
RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];# K# R* s% S4 J+ l2 S0 i6 F# v
RFrAllMatrix=[RFrAllMatrix,RFr]; . K! J' [ W, u# H! {if RFRMSE<1000 x4 E$ b% \; ? disp('RFRMSE') ;1 X( J2 p2 ~/ E+ R" S8 t
disp(RFRMSE); " t8 z- O; e6 D3 X: aend/ ]. E* s0 P" s, x5 O/ L$ ^; q
%% 比较特征的重要性 & ^% p% w+ f- mfigure/ o$ P9 V+ w" n8 g8 a) f, ?- T' F0 b
bar(RFModel.OOBPermutedVarDeltaError)( H8 Q+ A' t# C& r6 _
xlabel('Feature Number') ) ~1 s+ H2 P" v! u# ?7 uylabel('Out-of-Bag Feature Importance')0 f5 ?) X" {6 f2 S h" b% o! j, x
[mae,rmse,r2,mape] = EvlMetrix(TestYield,RFPredictYield) 2 Q( q$ M/ }5 `' ~0 H6 B; Cfigure # b Y% `' Z0 B3 Y3 Lplot(TestYield,'b-d') 9 ` B/ M: _# Zhold on " ]5 `- ^- Z0 \: d/ F8 e q' a8 jplot(RFPredictYield,'r-d') 2 R+ D: k& x4 h" v/ e i) m- Fhold off 8 O# \7 f1 v4 [& z1 z( E+ }( s" klegend('GroundTruth','Prediction') 1 J& T' V7 Y+ m/ {% T! x# s7 {( R4 fxlabel('Sample Number') 1 b3 d; z9 N* g% p. |2 Z+ f( b- Zylabel('target Value')9 [' _9 D* |6 E2 y) O) y5 J- m; j
* D9 W- F- b% H3 W* s
我就用了两个测试数据,效果不是特别明显。 7 Q3 j, ? ?" N' ^1 o; h% X / x* z! H& Z" u! d, ~7 g% [ # v& m+ a+ t4 T. a: Y9 b/ K- D: @4 P& H% \( I
下面的是每个特征对分类的重要性,1>3>4>2,这个数据量越大,越准确,因为我的数据量很小,所有效果不是很明显。 : n, q3 y( v- r$ Q, `8 L- l2 E7 ]/ I4 }6 h6 ]& N; n9 j `( M) Q
7 Z/ w; Y- Y6 ?, D* f( }6 N- Y, v
: p( v6 v4 a# }+ ?4 d
三、Logistic模型' i0 w9 F, o8 q6 a: W
3.1、Logistic模型理论! o1 o% P- E- w) h5 e
我们看一下这个二分类问题,给了一些水果的属性数据和水果名称,根据水果水果属性,对水果名称进行预测。% m5 i9 w) \ y0 I7 U: l1 R
4 r) P! {5 `' @1 S- d- _1 D
& e# d4 _' |* o, F# t+ F& u8 w' K! h2 T; q- ~% _
首先需要创建虚拟变量,我们根据水果名称创建0和1的虚拟变量,用spss如下:; v& p h( V9 X8 r7 c" ]( b! {
# U# `6 H# B, A& h M
. Q* ^8 I) i$ I' D7 i5 a
1 o" ~- \4 D0 T" s' y E: \
对于二分类问题,我们可以考虑使用logistic模型,预测的概率决定了分类类别,如下:+ A6 U* z' T2 j ^1 u2 ~& o
4 ~0 {4 h. d4 T
一般就是使用极大似然估计进行参数估计,然后代入公式进行预测,如下:2 \$ \' o& Q4 y+ l0 U" R
' q R3 d2 `/ } M) P: g( i ~
9 W% D( M1 I. D& y
" k1 u1 P& j) }' l _4 ^ 9 k5 `9 m6 ~9 P/ g& I' ]- G5 ], ^& ~1 V
3.2、SPSS求解逻辑回归& e* f9 s' Y( s( z
SPSS求解逻辑回归的过程如下,选中自变量和因变量,便可以完成回归预测。 * X" v) @5 n0 r( a9 _4 B$ S0 ^. M; k) u5 X# k9 J7 j
1 C% i& l4 \% ]; H
% B6 W6 @6 F3 {) K! ^
预测的结果在如下表中,第一个是预测值,第二个是预测的分类值。% g {. l- o0 v1 F/ e
! S7 Q; B, f2 y* y0 v) z
5 N0 w- b# ^' t A/ A+ R f% p @; ~: L) \ @) }7 X: w! W
如果预测效果比较差,可以加入平方项作为自变量进行预测,一般会增加预测准确率,但是有可能造成过拟合,即训练效果好,测试效果差,泛化能力差,故可以划分训练集和测试集,多次交叉验证,得到一个稳定的结果。 + a" F1 Y+ w- _- ^/ Z, i" H& N' L3 O: g- f2 \1 L6 p
' x$ M: Y* A' o! j8 |
————————————————* t/ x4 J9 o" J/ Z- a$ L3 R
版权声明:本文为CSDN博主「nuist__NJUPT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 d+ b+ `7 b( C, n
原文链接:https://blog.csdn.net/nuist_NJUPT/article/details/126787683 , ^" @* z; A8 k: b* W q4 g. T, }' e! Q7 a2 {) I" }