DIY: Haz tu propio machine learning que predice el cáncer maligno de pecho

Hola amigos, y bienvenidos a una entrega más de Datamanía. Aunque sea la primera entrega.

Lo primero que necesitaremos para nuestro Machine Learning, serán los datos. Y además en este caso vamos a hacer un clasificador. ¿Qué diferencia hay entre un clasificador y una regresión? Pues que en un clasificador tenemos clases discretas, por ejemplo los colores por su nombre (rojo, verde, azul, blanco,...) mientras que en una regresión el resultado es un número real, por ejemplo 0.785

¿Y de dónde sacamos los datos? Pues un buen csv (como un excel pero en texto separado por comas) con buen sustrato, ya clasificado. En concreto usaremos los datos del "Breast Cancer Wisconsin (Diagnostic) Dataset". Aquí teneis el link: datos.

Lo descomprimimos y nos encontramos un fichero data.csv que contiene algo así:

Nos fijamos en la columna B, que pone diagnosis. Está será nuestra clase a predecir. Vemos que puede tomar 2 valores: M (Maligno) o B (Benigno). Vemos que la columna A e un identificador, y tenemos otras 30 columnas con diversos datos numéricos que son medidas acerca del cáncer detectado en el pecho. Como no somos expertos en el tema, no sabemos lo que significan (aunque podríamos tener un diccionario de datos para explicarlos), pero aun así tiraremos para adelante, porque vamos a ver qué pasa sin filtrar datos ni nada.

Lo segundo que necesitaremos si queremos un trabajo profesional y bueno, es conocer bien R o Python. Pero como no es el objetivo aquí en Datamanía tener un trabajo fino fino, sino algo asequible, vamos a usar Azure Machine Learning Studio, que es gratuito, y nos permitirá hacer esto con cajitas. Lo encontraremos en esta url: studio.azureml.net/

Una vez dentro vamos a datasets y pinchamos en "new"

Y subimos el fichero y le ponemos un nombre descriptivo:

Y ahora vamos a Experiments y creamos uno nuevo, seleccionamos "Blank Experiment". Veremos algo como esto:

La parte de la izquierda son las cosas que podemos arrastrar hacia la derecha, que será nuestro experimento. Lo primero que hacemos es arrastrar nuestro dataset (buscadlo por nombre). Y además arrastramos un componente llamado "Select columns in dataset", que nos permitirá elegir las columnas que queremos de nuestros datos, en concreto eliminar las columnas "id" y "Column 32" que no nos aportan nada.

Y ahora le damos abajo a "Run" para que el componente Select Columns se ejecute y coja los datos. Por cierto, en cualquier momento a cualquier componentes podéis darle a la bolita que tienen debajo y visualizar el contenido.

Lo siguiente que haremos será partir nuestros datos. ¿Qué es esto? En Machine Learning tienes que entrenar tus datos usando un conjunto de datos para entrenar (train), pero también tienes que probar lo bien que funciona tu modelo con un conjunto de datos para test (test). Para eso arrastrad un componente llamado "Split data". En las propiedades seleccionar 0.7, esto significa que el 70% de los datos se usarán para train y el 30% para test. Y seleccionad además "stratified split" y la columna "diagnosis". ¿Qué hace esto? Como no hay la misma cantidad de cánceres Malignos que Benignos en nuestros datos, esto lo que hace es repartir de manera uniforme entre los datos que usamos para entrenar y los que usamos para testear.

Y le damos a "Run". Ahora la salida 1 de split data serán los datos de train y la 2 los de test.

Ahora arrastraremos 2 componentes: Train Model, y conectaremos la salida 1 de Split data a la entrada 2 de train model; y Two Class Support Vector Machine. ¿Para qué sirven? El segundo es el algoritmo de machine learning. Es un classifier, y todos los que comienzan por Two Class son óptimos para cuando tenemos dos clases, que es nuestro caso. Por el otro lado Train Model es la pieza fundamental, la que a partir de los datos y del algoritmo, entrena nuestro modelo de machine learning. ¿Qué falta? Decirle a nuestro Train Model qué campo debe predecir (label column), lo hacemos pinchando el selector de columnas y ecogemos "diagnosis". Y le damos a "Run".

¡Ya tenemos el modelo entrenado! En realidad el trabajo está hecho, pero ahora tenemos que comprobar lo bien que lo ha hecho. Para eso arrastraremos un componente llamado "Score Model". La salida de "Train Model" va a la entrada 1 del "Score Model" y la salida 2 de "Split Data" va a la entrada 2 de Score Model. Esto lo que hará será coger los datos que guardamos para testear y predecir para cada uno el campo "diagnosis" y compararlo con el verdadero diagnóstico para ver si lo ha hecho bien.

Y por último un componente "Evaluate Model", que enganchamos tras el "Score Model" y que nos mostrará los resultados estadísticos de lo bien que lo hace. Y le damos a "Run" de nuevo.

Si nos vamos a la salida de "Evaluate Model" y le damos a visualize, veremos lo bien que lo hace nuestro modelo, algo así:

Lo más importante que podemos ver en nuestro diagrama ROC es el valor del AUC (Area Under the Curve). La diagonal gris sería el azar. Lo azul la performance de nuestro modelo. Ocupar todo el área, es decir un 1, es el valor perfecto. En nuestro caso tenemos un 0.996, que es un buen valor, sobre todo teniendo en cuenta que no hemos refinado nada, está todo por defecto.

Los True Positive (59) se corresponden con auqellos tumores benignos que efectivamente nuestro modelo identifica como benignos. Los True Negative (105) son aquellos malignos que efectivamente nuestro modelo identifica como malignos. El total de datos es 171, así que sin cambiar nada nuestro modelo acertaría el (59+105)*100/171 = 95.90% de las veces (valor de Accuracy).

Si además queréis convertirlo en un servicio web, podéis pinchar en "Setup Web Services", que lo que hace es crear un servicio al que podéis enviar los datos de una observación o de varias, y te dice para cada caso si el tumor que ve es benigno o maligno.

¡Y esto ha sido todo por hoy!