Funció per fer un cross validation. Aquesta funció trevalla sobre objectes de tipus DATA i utilitza PCA i CBR de la llibreria exitPCA. Un cop realitzat el procediment es mostraran els resultats mitjançant les funcións Plot_Confusion_Matrix (Per mostrar les matrius de confusió) i plot_Bars (Per mostrar el % de classificació de cada partició). Parametres d'entrada: in - Un objecte DATA. Aquest objecte és el que ha de contenir les dades sobre les quals aplicarem el cross validation. És molt important que aquest objecte dades tingui inicialitzats tots els camps, especialment la matriu de dades i les corresponents classes. Les fases només seran necessaries si s'escullen distancies que les utilitzen. Els noms dels lots, si en tenim, s'utilitzeran per identificar els lots que fallen a les matrius de confusió. divs - Double que indica el nombre de divisions que es bolen utilitzar en el cross validation. Seguirem el proces descrit pel k-fold Cross-Validation, i divs ens indica la k que utilitzarem. vk - (Configuració CBR) Veins que es vol agafar a cada nivell. dc - (Configuració CBR) method - (Configuració CBR) net - (Configuració CBR) W - (configuració PCA) Double que indica el métode de desdoblament que utilitzarem (0= BW 1 = VW). Cross validation utilitza CBR i aquest no és compatible amb Variable Wise!! est - (configuració PCA) Double que indica el métode d'Estandardització que utilitzadem. Els valors possibles són: 1 - Auto Scaling 2 - Group Scaling 3 - Continous Scaling 4 - Block Scaling FM - (configuració PCA) Double per indicar si s’ha de treure la forma mitja (x =True) o no (x = False) durant el procés d’estandardització. Metode - (configuració PCA) Double que indica el procediment a usar per determinar el nombre de components principals. Els possibles valors són: 0 - Manual 1 - Kaiser 2 - Manual/Visual pel colze 3 - Auto/Visual pel colze(proves) 4 - Manual/Visual pel % d`explicacio de les dades 5 - VRE limits - (configuració PCA) Double per indicar el metode que utilitzarem per calcular els limits. Els possibles valors son: 1=analitic 0= 3 sigma conts - (configuració PCA) Double per indicar el metode de calcul de les contribucións. Els possibles valors són: 0 = descartar negatius 1 = negatius i positius classes - Llista de doubles que indiquen les classes que bolem utilitxar per fer el model. Exemple: Tenim un problema amb 4 classes 1,2,3 i 4. I volem que els models es crein nómes utilitzant les classes 1 i3 per tant haurem d'indicar a [1 3], si bolem que s'utilitzi nomes la classe 2 podem indicar-ho [2] o simplement 2. Si volem totes les classes podem indicar-ho [1 2 3 4] o bé utilitzant : parami - Indica els parametres extres per a les distancies de CBR que ho necessitin. ~ - No utilitzat, per mantenir compatibilitat amb versions anteriors on aquest parametre indicava si es mostrarien les matrius de confusió i barres amb % de classificació o no. Parametres de sortida: mcbr - Cell aray que conte els k cbr que s'han muntat durant el proces de k-fold cross validation. te - List de Objectes DATA que contenen els Casos que s'han utilitzat per testejar els k diferents objectes CBR (retornats a mcbr) creats durant el procés de k-fold cross validation.
0001 function [mcbr te] = Cross4( in, divs, vk,dc,method,net,W,est,FM,Metode,limits,conts,classes,parami,~) 0002 % Funció per fer un cross validation. Aquesta funció trevalla sobre 0003 % objectes de tipus DATA i utilitza PCA i CBR de la llibreria exitPCA. Un 0004 % cop realitzat el procediment es mostraran els resultats mitjançant les 0005 % funcións Plot_Confusion_Matrix (Per mostrar les matrius de confusió) i 0006 % plot_Bars (Per mostrar el % de classificació de cada partició). 0007 % 0008 % Parametres d'entrada: 0009 % 0010 % in - Un objecte DATA. Aquest objecte és el que ha de contenir les 0011 % dades sobre les quals aplicarem el cross validation. És molt 0012 % important que aquest objecte dades tingui inicialitzats tots 0013 % els camps, especialment la matriu de dades i les corresponents 0014 % classes. Les fases només seran necessaries si s'escullen 0015 % distancies que les utilitzen. Els noms dels lots, si en tenim, 0016 % s'utilitzeran per identificar els lots que fallen a les 0017 % matrius de confusió. 0018 % 0019 % divs - Double que indica el nombre de divisions que es bolen 0020 % utilitzar en el cross validation. Seguirem el proces descrit 0021 % pel k-fold Cross-Validation, i divs ens indica la k que 0022 % utilitzarem. 0023 % 0024 % 0025 % vk - (Configuració CBR) Veins que es vol agafar a cada nivell. 0026 % dc - (Configuració CBR) 0027 % method - (Configuració CBR) 0028 % net - (Configuració CBR) 0029 % 0030 % W - (configuració PCA) Double que indica el métode de desdoblament 0031 % que utilitzarem (0= BW 1 = VW). Cross validation utilitza CBR i 0032 % aquest no és compatible amb Variable Wise!! 0033 % 0034 % est - (configuració PCA) Double que indica el métode 0035 % d'Estandardització que utilitzadem. 0036 % Els valors possibles són: 0037 % 1 - Auto Scaling 0038 % 2 - Group Scaling 0039 % 3 - Continous Scaling 0040 % 4 - Block Scaling 0041 % 0042 % 0043 % FM - (configuració PCA) Double per indicar si s’ha de treure la 0044 % forma mitja (x =True) o no (x = False) durant el procés 0045 % d’estandardització. 0046 % 0047 % Metode - (configuració PCA) Double que indica el procediment a usar 0048 % per determinar el nombre de components principals. 0049 % Els possibles valors són: 0050 % 0 - Manual 0051 % 1 - Kaiser 0052 % 2 - Manual/Visual pel colze 0053 % 3 - Auto/Visual pel colze(proves) 0054 % 4 - Manual/Visual pel % d`explicacio de les dades 0055 % 5 - VRE 0056 % 0057 % 0058 % limits - (configuració PCA) Double per indicar el metode que 0059 % utilitzarem per calcular els limits. 0060 % Els possibles valors son: 0061 % 1=analitic 0062 % 0= 3 sigma 0063 % 0064 % conts - (configuració PCA) Double per indicar el metode de calcul 0065 % de les contribucións. 0066 % Els possibles valors són: 0067 % 0 = descartar negatius 0068 % 1 = negatius i positius 0069 % 0070 % 0071 % 0072 % classes - Llista de doubles que indiquen les classes que bolem 0073 % utilitxar per fer el model. 0074 % Exemple: 0075 % Tenim un problema amb 4 classes 1,2,3 i 4. I volem que 0076 % els models es crein nómes utilitzant les classes 1 i3 0077 % per tant haurem d'indicar a [1 3], si bolem que 0078 % s'utilitzi nomes la classe 2 podem indicar-ho [2] o 0079 % simplement 2. Si volem totes les classes podem 0080 % indicar-ho [1 2 3 4] o bé utilitzant : 0081 % 0082 % parami - Indica els parametres extres per a les distancies de CBR 0083 % que ho necessitin. 0084 % 0085 % ~ - No utilitzat, per mantenir compatibilitat amb versions 0086 % anteriors on aquest parametre indicava si es mostrarien les 0087 % matrius de confusió i barres amb % de classificació o no. 0088 % 0089 %Parametres de sortida: 0090 % 0091 % mcbr - Cell aray que conte els k cbr que s'han muntat durant el proces 0092 % de k-fold cross validation. 0093 % 0094 % te - List de Objectes DATA que contenen els Casos que s'han utilitzat 0095 % per testejar els k diferents objectes CBR (retornats a mcbr) 0096 % creats durant el procés de k-fold cross validation. 0097 % 0098 0099 %Aquesta funció pot trigar vastant a executar-se per tant crearem una barra 0100 %de progres perque l'usuari tingui constancia del temps que falta. 0101 progressbar(0); 0102 0103 %Calculem el nombre de lots que tenim per fer les particions de les dades 0104 nlots=in.getBatchCount(); 0105 0106 %desordenem tots els casos aleatoriament (si no ho fem sempre tindrem els mateixos casos als models!) 0107 in.shuffle;%comentar per no desordenar aleatoriament 0108 0109 % No ens interessa que puguin quedar particions amb numeros de classe 0110 % descompensats per tant ordenarem 'in' per que quedin les classes ordenades!! 0111 a=in.getClass(); 0112 [~,a]=sort(a); 0113 in.shuffle(a); 0114 %ara les particions tindran la mateixa proporcio de numero de lots de cada classe que l'objecte dades k ens passen! 0115 %ATENCIO! 'in' esta ordenat per classes -> les particions tambe -> DROP4 i 0116 %els altres metodes sencitius a l'ordre 0117 0118 %construim un index que ens indicara a quina divisió pertany cada lot 0119 indexs = repmat(1:divs, 1 , floor(nlots/length(1:divs))); 0120 indexs = [indexs 1:mod(nlots,length(1:divs))]; 0121 0122 %conseguim el numero maxim de classes 0123 maxclasses = max(in.getClass); 0124 treuoutliers=[]; 0125 Numero =[]; 0126 for i = divs:-1:1 %per cada divisió 0127 progressbar((divs-i+1)/(divs+1)); 0128 %construim la base de casos 0129 C_B = in.copy();%fem una copia 0130 C_B.deleteBatch(indexs == i); %treiem els que farem servir de dades 0131 0132 %construim el Model amb tots els de la classe indicades 0133 model=C_B.copy(); 0134 for t=1:length(classes) 0135 if(t==1) 0136 %el primer cop hem de recuperar les classes 0137 inde =model.getClass ~= classes(t); 0138 else 0139 %la resta nomes cal fer una and 0140 inde = and(inde, (model.getClass ~= classes(t))); 0141 end 0142 end 0143 model.deleteBatch(inde);%treiem tots els lots que no formen part del model 0144 model = PCA(model);%creo el model 0145 0146 %configurem el PCA 0147 model.setUnfoldingMethod(W); %CBR no Variable Wise!! 0148 model.setNormalizationMethod(est); 0149 model.setTrajectoryRemoval(FM); 0150 model.setPCSelectionMethod(Metode); 0151 model.setLimitMethod(limits); 0152 model.setContributionMethod(conts); 0153 0154 %fem que nomes demani 1 sol cop el numero de components principals a 0155 %utilitzar assumirem que es sempre el mateix!! 0156 if (Metode == 0) %metode manual! 0157 if isempty(Numero) 0158 Numero = model.getNum(); 0159 else 0160 model.setNum(Numero); 0161 end 0162 end 0163 0164 %construim les dades de test 0165 test=in.copy(); 0166 test.deleteBatch(indexs ~= i); 0167 te(i)=test.copy(); 0168 0169 %no ens interesa tenir la C_B ordenada per classes!! -> Drop4 IB.. Fallarien 0170 C_B.shuffle(); 0171 0172 outs = model.getOutLiers(); 0173 0174 while(sum(outs) > 0) 0175 if isempty(treuoutliers) 0176 treuoutliers = questdlg('There are outliers do you want to remove them?','Attention!','YES','NO','YES'); 0177 end 0178 switch treuoutliers 0179 case '' 0180 %no han contestat fem que contestin! 0181 outs = 1; 0182 treuoutliers =[]; 0183 case 'YES' 0184 %treiem els outliers 0185 model.deleteBatch(outs); 0186 outs=model.getOutLiers(); 0187 case 'NO' 0188 %sortim sense treure outliers 0189 treuoutliers ='NO'; 0190 break 0191 0192 end 0193 0194 end 0195 %construim el CBR pertinent 0196 MY_CBR = CBR(model,C_B,'NO'); 0197 0198 switch net 0199 case 1 0200 MY_CBR.IB2(vk,dc,method,parami); 0201 case 2 0202 MY_CBR.IB3(vk,dc,method,parami); 0203 case 3 0204 MY_CBR.DROP4(vk,dc,method,parami); 0205 case 4 0206 MY_CBR.IBUdG(min(vk),0,vk,dc,method,parami);%valor per defecte de veins i descartats 0207 otherwise 0208 %S'ha escollit no netejar! 0209 end 0210 0211 MY_CBR.retrieve(test ,vk,dc,parami); 0212 0213 classpredit=MY_CBR.reuse(method); 0214 [M{i},fallen]=MY_CBR.revise(); 0215 0216 %MY_CBR.retain(fallen); 0217 0218 %Guardem les dades les dades pels plots i sortides 0219 mcbr{i} = MY_CBR; 0220 f{i}= fallen; 0221 classp{i} = classpredit; 0222 classreal{i} = test.getClass; 0223 end 0224 Plot_Confusion_Matrix(classp,classreal,maxclasses,te,M) 0225 plot_Bars(f); 0226 %Resultats promig 0227 progressbar(1); 0228 end