|
3 | 3 | \section{Introducción} |
4 | 4 | En este anexo se va a describir con detalle la documentación técnica de programación. Se describirá la estructura de directorios que posee, la instalación del propio entorno de desarrollo, cómo llevar a cabo su compilación, instalación y ejecución; además de las pruebas que se han realizado. |
5 | 5 |
|
6 | | -Se debe recordar que el proyecto se encuentra dividido en dos repositorios diferenciados, UBUMLaaS e IS-SSL~\footnote{Biblioteca de algoritmos de selección de instancias y aprendizaje semi-supervisado programado.}; es por ello que, se dividirá en dos secciones respectivamente, y tantas subsecciones como son necesarias para cada uno de ellos. |
| 6 | +Se debe recordar que el proyecto se encuentra dividido en dos repositorios diferenciados, UBUMLaaS e IS-SSL\footnote{Biblioteca de algoritmos de selección de instancias y aprendizaje semi-supervisado programado.}; es por ello que, se dividirá en dos secciones respectivamente, y tantas subsecciones como son necesarias para cada uno de ellos. |
7 | 7 |
|
8 | 8 | \section{UBUMLaaS} |
9 | 9 |
|
@@ -74,7 +74,184 @@ \subsection{Estructura de directorios} |
74 | 74 | \end{itemize} |
75 | 75 |
|
76 | 76 | \subsection{Manual del programador} |
| 77 | +En esta subsección se describen todos aquellos métodos seguidos por el equipo de desarrollo para, valga la redundancia, desarrollar el proyecto. De tal forma que un futuro desarrollador no tenga inconvenientes a la hora de retomar el proyecto. |
| 78 | + |
| 79 | +\subsubsection{Entorno de desarrollo} |
| 80 | +Para poder continuar con el desarrollo del proyecto, se requiere tener instalado el siguiente \textit{software} en el equipo: |
| 81 | +\begin{itemize} |
| 82 | +\tightlist |
| 83 | +\item Python 3.7+. |
| 84 | +\item Bibliotecas Python. |
| 85 | +\item Git |
| 86 | +\item VSCode/PyCharm/\dots. |
| 87 | +\end{itemize} |
| 88 | + |
| 89 | +En los siguientes apartados se detalla la instalación de cada uno de los componentes anteriormente citados. |
| 90 | + |
| 91 | +\subsubsection{Python 3.7+} |
| 92 | +El desarrollo se ha realizado siguiendo las últimas formas de programación disponibles a partir de la versión 3.7 de Python. El desarrollo se comenzó después de que se dejara de mantener Python 2, por lo que se trabajó desde el inicio con versiones de Python 3. Se puede obtener la última versión disponible de Python desde~\cite{pythonGetIt}. Es importante que el desarrollador se asegure que los binarios han sido añadidos al \texttt{path} del sistema que esté utilizando. |
| 93 | + |
| 94 | +\subsubsection{Bibliotecas Python} |
| 95 | +Esta sección es la más importante de todas junto con la anterior, debido a que el proyecto depende de (está construido utilizando) bibliotecas de $3^{os}$. Y en especial, determinadas versiones de las mismas. |
| 96 | + |
| 97 | +En la Tabla~\ref{tab:bibliotecas-python} se detallan las bibliotecas necesarias para utilizar el proyecto tal y como se encuentra en el repositorio. Para el uso en exclusiva de las librerías de \texttt{IS-SSL} se deben utilizar aquellas que se encuentran en negrita. |
| 98 | + |
| 99 | +\begin{table}[] |
| 100 | +\centering |
| 101 | +\begin{tabular}{c|c} |
| 102 | + Biblioteca & Versión \\ |
| 103 | + \toprule |
| 104 | + \rowcolor[HTML]{EFEFEF} |
| 105 | + \textbf{\texttt{NumPy}} & \textbf{1.20.3} \\ \midrule |
| 106 | + \textbf{\texttt{Scikit-learn}} & \textbf{0.24.2} \\ \midrule |
| 107 | + \rowcolor[HTML]{EFEFEF} |
| 108 | + \texttt{Matplotlib} & 3.4.3 \\ \midrule |
| 109 | + \textbf{\texttt{Pandas}} & \textbf{1.3.4} \\ \midrule |
| 110 | + \rowcolor[HTML]{EFEFEF} |
| 111 | + \texttt{YagMail} & 0.15.277 \\ \midrule |
| 112 | + \textbf{\texttt{Scipy}} & \textbf{1.7.1} \\ |
| 113 | + \rowcolor[HTML]{EFEFEF} |
| 114 | + \bottomrule |
| 115 | +\end{tabular} |
| 116 | +\caption{Bibliotecas utilizadas y sus versiones.}\label{tab:bibliotecas-python} |
| 117 | +\end{table} |
| 118 | + |
| 119 | +Se recomienda el uso de un entorno de desarrollo de \texttt{Conda}, se facilitan ficheros de configuración tanto para \texttt{Conda} como para instalación con \texttt{PIP}. |
| 120 | + |
| 121 | +\subsubsection{Git} |
| 122 | +\imagenRuta{../img/anexos/manual-programador/gitkraken}{Interfaz de \texttt{GitKraken}.}{gitkraken} |
| 123 | +Para poder utilizar el repositorio ha de utilizarse el gestor de versiones \texttt{Git}. Se recomienda utilizar GUI con soporte a VC\footnote{Control de versiones (\textit{Version Control}).} tales que no requieran de una interfaz de comandos para su utilización, pero eso se deja a decisión del futuro desarrollador. |
| 124 | + |
| 125 | +En la Figura~\ref{fig:gitkraken} se aprecia como el \textit{software} \texttt{GitKraken} permite, de forma intuitiva y sencilla, el uso de \texttt{Git} y todo su potencial. Se puede obtener desde~\cite{gitkraken}. |
| 126 | + |
| 127 | +\subsubsection{VSCode/Pycharm/\dots} |
| 128 | +El desarrollo propio del producto puede ser realizado en cualquier editor de textos, incluso en \texttt{Vi} si así se desea. La ventaja de herramientas como \texttt{Visual Studio Code} o \texttt{PyCharm}, es que permiten el uso de \textit{plugins} añadidos a los complementos del propio IDE, lo cual permite la generación de código un proceso mucho más sencillo y directo, reduciendo el número de errores ocasionados y permitiendo una depuración o refactorización del código fuente mucho más eficiente y sencilla. |
| 129 | + |
| 130 | +Se puede obtener cada una de las herramientas desde~\cite{VSCode, PyCharm}, respectivamente. |
77 | 131 |
|
78 | 132 | \subsection{Compilación, instalación y ejecución del proyecto} |
| 133 | +En esta subsección se va a detallar el proceso a seguir para poder hacer uso del proyecto en local, modificarlo y/o utilizarlo. |
| 134 | + |
| 135 | +\subsubsection{Adquisición del código fuente} |
| 136 | +Lo primero que se necesita es obtener el código en el equipo, para ello podemos seguir una de las siguientes aproximaciones: |
| 137 | +\begin{itemize} |
| 138 | +\item Mediante el uso de la terminal. |
| 139 | +\begin{enumerate} |
| 140 | +\tightlist |
| 141 | +\item Apertura de la terminal. |
| 142 | +\item Desplazarse al directorio en donde se desee clonar el repositorio (usando \texttt{cd} en Unix o \texttt{dir} en Windows). |
| 143 | +\item Hacer uso del siguiente comando:\\ |
| 144 | +\texttt{git clone https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-\\methods.git} |
| 145 | +\item Se dispone de una copia idéntica a la alojada en el repositorio de \texttt{GitHub}. |
| 146 | +\end{enumerate} |
| 147 | + |
| 148 | +\item Descarga desde el navegador. |
| 149 | +\begin{itemize} |
| 150 | +\tightlist |
| 151 | +\item Apertura del navegador preferido. |
| 152 | +\item Introducir en la barra de búsqueda la siguiente dirección:\\ |
| 153 | +\texttt{https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-methods/\\archive/refs/heads/main.zip} |
| 154 | +\item Aceptar la descarga en caso de tener habilitada la comprobación. |
| 155 | +\item Navegar con el Explorador de archivos del sistema hasta el directorio de descarga. |
| 156 | +\end{itemize} |
| 157 | + |
| 158 | +\item Uso de \texttt{GitKraken}. |
| 159 | +\begin{itemize} |
| 160 | +\tightlist |
| 161 | +\item Apertura de la aplicación. |
| 162 | +\item Hacer \textit{click} en \textit{Clone a repo}. |
| 163 | +\item En \textit{Repository Management} $\rightarrow$ \textit{Clone} $\rightarrow$ \textit{Clone with URL}: |
| 164 | +\begin{itemize} |
| 165 | +\item Indicar la ruta local en la que nos interesa que se clone el repositorio. |
| 166 | +\item En URL introducir:\\ |
| 167 | +\texttt{git clone https://github.com/dpr1005/\\Semisupervised-learning-and-instance-selection-\\methods.git} |
| 168 | +\end{itemize} |
| 169 | +\item Hacer \textit{click} en \textit{Clone the repo!}. |
| 170 | +\end{itemize} |
| 171 | +\end{itemize} |
| 172 | + |
| 173 | +\subsubsection{Importar proyecto en PyCharm} |
| 174 | +Importar un proyecto en \texttt{PyCharm} es tan sencillo como: |
| 175 | +\begin{enumerate} |
| 176 | +\tightlist |
| 177 | +\item Apertura de \texttt{PyCharm}. |
| 178 | +\item Hacer \textit{click} en \textit{Open.} (Notar que también podríamos clonar el proyecto en este momento haciendo \textit{click} en \textit{Get from VCS}). |
| 179 | +\item Seleccionar la ruta en el equipo dónde se encuentra el directorio raíz del proyecto. |
| 180 | +\end{enumerate} |
| 181 | + |
| 182 | +\subsubsection{Crear entorno virtual de trabajo} |
| 183 | +Como se ha comentado previamente, para poder trabajar con este proyecto se requieren de una serie de bibliotecas de Python. El proyecto está preparado para crear un entorno de \texttt{Conda} propio, de forma que no interfiera con otros proyectos y sea más sencillo de mantener y actualizar. |
| 184 | + |
| 185 | +Se recomienda que los binarios de anaconda o miniconda estén configurados en el \texttt{path} del sistema para poder utilizar el comando \texttt{conda} desde la línea de comandos. |
| 186 | + |
| 187 | +El proceso de creación del entrono virtual con \texttt{Conda} es el siguiente: |
| 188 | +\begin{enumerate} |
| 189 | +\tightlist |
| 190 | +\item Apertura de la terminal. |
| 191 | +\item Navegar hasta la raíz del proyecto. |
| 192 | +\item Crear el entorno con:\\ |
| 193 | +\texttt{conda env create -f is-ssl.yml} |
| 194 | +\item Cuando se desee utilizar se debe activar:\\ |
| 195 | +\texttt{conda activate is-ssl} |
| 196 | +\end{enumerate} |
| 197 | + |
| 198 | +En caso de que se desee añadir al entorno (\texttt{venv}) actual en el que se encuentre el usuario: |
| 199 | +\begin{enumerate} |
| 200 | +\tightlist |
| 201 | +\item Apertura de la terminal. |
| 202 | +\item Navegar hasta la raíz del proyecto. |
| 203 | +\item Instalar los requerimientos del proyecto con:\\ |
| 204 | +\texttt{pip install -r requeriments.txt} |
| 205 | +\end{enumerate} |
| 206 | + |
| 207 | +\subsubsection{Uso del proyecto} |
| 208 | +La forma de usar la biblioteca es muy sencilla, todo \texttt{IS-SSL} ha sido codificado siguiendo la misma guía de estilo (PEP 8), de forma que cualquier programador habituado con el uso de bibliotecas en Python lo encuentre intuitivo y sencillo. |
| 209 | + |
| 210 | +Todos los métodos de selección de instancias y algoritmos de aprendizaje semi-supervisado son clases de Python, de manera que para utilizarlo hay que hacer una importación del paquete y de la clase. |
| 211 | + |
| 212 | +Un ejemplo del uso completo de este \textit{software} es lo encontramos en Listing~\ref{lst:ejemplo}, donde se detallan los tipos de datos de entrada. |
| 213 | + |
| 214 | +Según la codificación realizada, todos los métodos accesibles de las clases esperan la entrada de objetos de tipo \texttt{DataFrame} de la librería de \texttt{Pandas}. Internamente en función de las operaciones que tenga que realizar, serán convertidos estos objetos a listas de Python o arreglos de \texttt{NumPy}. Independientemente de las operaciones internas, siempre la salida producida (en caso de tenerla) serán objetos de \texttt{Pandas}, no teniendo que ser necesariamente el mismo objeto de entrada modificado, en la mayor parte de las ocasiones serán objetos nuevos. |
| 215 | + |
| 216 | +\pagebreak |
| 217 | +\begin{lstlisting}[language=Python, caption={Ejemplo de uso de IS-SSL}, label={lst:ejemplo}] |
| 218 | +from ssl_dnx import TriTraining |
| 219 | +from is_dnx import ENN |
| 220 | +from sklearn.naive_bayes import GaussianNB |
| 221 | +from sklearn.neighbors import KNeighborsClassifier |
| 222 | +from sklearn.tree import DecisionTreeClassifier |
| 223 | +from sklearn.datasets import load_iris |
| 224 | + |
| 225 | +if __name__ == "__main__": |
| 226 | + model = TriTraining( |
| 227 | + random_state = 42, |
| 228 | + c1 = GaussianNB, c1_params = None, |
| 229 | + c2 = KNeighborsClassifier, c2_params = {n_neighbors: 2}, |
| 230 | + c3 = DecisionTreeClassifier, c3_params = None |
| 231 | + ) |
| 232 | + filter_model = ENN(nearest_neighbors = 5, power_parameter = 2) |
| 233 | + |
| 234 | + iris = load_iris() |
| 235 | + X = iris['data'] |
| 236 | + y = iris['target'] |
| 237 | + |
| 238 | + X = pd.DataFrame(X) |
| 239 | + y = pd.DataFrame(y) |
| 240 | + X, y = filter_model.filter(X, y) |
| 241 | + |
| 242 | + val = [True if i % 2 == 0 else False for i in range(len(y))] |
| 243 | + y[val] = -1 |
| 244 | + |
| 245 | + X, X_test, y, y_test = train_test_split(X.to_numpy(), y.to_numpy()) |
| 246 | + |
| 247 | + X = pd.DataFrame(X) |
| 248 | + y = pd.DataFrame(y) |
| 249 | + |
| 250 | + model.fit(X, y) |
| 251 | + y_pred = model.predict(X_test) |
| 252 | + print(accuracy_score(y_true=y_test, y_pred=y_pred)) |
| 253 | + |
| 254 | +\end{lstlisting} |
| 255 | +\pagebreak |
79 | 256 |
|
80 | 257 | \subsection{Pruebas del sistema} |
0 commit comments