\section{Algorithm} \begin{itemize} \item[] // notation \item $n$ features ${\cal{X}} = \{X_1, \dots, X_n\}$ and the class $Y$ \item $m$ instances. \item $D = \{ (x_1^i, \dots, x_n^i, y^i) \}_{i=1}^{m}$ \item $W$ a weights vector. $W_0$ are the initial weights. \item $D[W]$ dataset with weights $W$ for the instances. \end{itemize} \bigskip \begin{enumerate} \item[] // initialization \item $W_0 \leftarrow (w_1, \dots, w_m) \leftarrow 1/m$ \item $W \leftarrow W_0$ \item $Vars \leftarrow {\cal{X}}$ \item $\delta \leftarrow 10^{-4}$ \item $convergence \leftarrow True$ // hyperparameter \item $maxTolerancia \leftarrow 3$ // hyperparameter \item $bisection \leftarrow False$ // hyperparameter \item $finished \leftarrow False$ \item $AODE \leftarrow \emptyset$ \hspace*{2cm} // the ensemble \item $tolerance \leftarrow 0$ \item $numModelsInPack \leftarrow 0$ \item $maxAccuracy \leftarrow -1$ \item[] \newpage \item[] // main loop \item While $(\lnot finished)$ \begin{enumerate} \item $\pi \leftarrow SortFeatures(Vars, criterio, D[W])$ \item $k \leftarrow 2^{tolerance}$ \item if ($tolerance == 0$) $numItemsPack \leftarrow0$ \item $P \leftarrow Head(\pi,k)$ \hspace*{2cm} // first k features in order \item $spodes \leftarrow \emptyset$ \item $i \leftarrow 0$ \item While ($ i < size(P)$) \begin{enumerate} \item $X \leftarrow P[i]$ \item $i \leftarrow i + 1$ \item $numItemsPack \leftarrow numItemsPack + 1$ \item $Vars.remove(X)$ \item $spode \leftarrow BuildSpode(X, {\cal{X}}, D[W])$ \item $\hat{y}[] \leftarrow spode.Predict(D)$ \item $\epsilon \leftarrow error(\hat{y}[], y[])$ \item $\alpha \leftarrow \frac{1}{2} ln \left ( \frac{1-\epsilon}{\epsilon} \right )$ \item if ($\epsilon > 0.5$) \begin{enumerate} \item $finished \leftarrow True$ \item break \end{enumerate} \item $spodes.add( (spode,\alpha_t) )$ \item $W \leftarrow UpdateWeights(W,\alpha,y[],\hat{y}[])$ \end{enumerate} \item $AODE.add( spodes )$ \item if ($convergence \land \lnot finished$) \begin{enumerate} \item $\hat{y}[] \leftarrow AODE.Predict(D)$ \item $actualAccuracy \leftarrow accuracy(\hat{y}[], y[])$ \item $if (maxAccuracy == -1)\; maxAccuracy \leftarrow actualAccuracy$ \item if $((accuracy - maxAccuracy) < \delta)$\hspace*{2cm} // result doesn't improve enough \begin{enumerate} \item $tolerance \leftarrow tolerance + 1$ \end{enumerate} \item else \begin{enumerate} \item $tolerance \leftarrow 0$ \item $numItemsPack \leftarrow 0$ \end{enumerate} \end{enumerate} \item If $(Vars == \emptyset \lor tolerance>maxTolerance) \; finished \leftarrow True$ \item $lastAccuracy \leftarrow max(lastAccuracy, actualAccuracy)$ \end{enumerate} \item if ($tolerance > maxTolerance$) \hspace*{1cm} // algorithm finished because of lack of convergence \begin{enumerate} \item $removeModels(AODE, numItemsPack)$ \end{enumerate} \item Return $AODE$ \end{enumerate}