05.5 RRNN Análisis de microarrays¶
Objetivos de la práctica
Utilizar datos de microarrays para agrupar genes en función de sus patrones de expresión.
Comparar los grupos obtenidos con los diferentes tipos de cáncer anotados.
El conjunto de datos NCI60 contiene información genética de 64 líneas celulares cancerígenas. Para cada una de ellas, se ha cuantificado la expresión de 6830 genes mediante tecnología microarray. Se conoce el tipo de cáncer (histopatología) al que pertenece cada línea celular y se puede utilizar esta información para evaluar si el método de clustering (agglomerative hierarchical clustering) es capaz de agrupar correctamente las líneas empleando los niveles de expresión génica.
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd
import numpy as np
from skimage import io
from IPython import display
Carga de Datos¶
Descargar el archivo que se encuentra en Moodle con el nombre nci_data.csv y situarlo en una carpeta de nombre data en el path donde se encuentre el cuaderno Jupyter.
df = pd.read_csv('data/nci_data.csv')
df.head()
Gene | s1 | s2 | s3 | s4 | s5 | s6 | s7 | s8 | s9 | ... | s55 | s56 | s57 | s58 | s59 | s60 | s61 | s62 | s63 | s64 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | g1 | 0.300 | 0.679961 | 0.940 | 0.280 | 0.485 | 0.310 | -0.830 | -0.190 | 0.460 | ... | 0.010 | -0.620 | -0.380 | 0.04998 | 0.650 | -0.030 | -0.270 | 0.210 | -0.050 | 0.350 |
1 | g2 | 1.180 | 1.289961 | -0.040 | -0.310 | -0.465 | -0.030 | 0.000 | -0.870 | 0.000 | ... | -1.280 | -0.130 | 0.000 | -0.72002 | 0.640 | -0.480 | 0.630 | -0.620 | 0.140 | -0.270 |
2 | g3 | 0.550 | 0.169961 | -0.170 | 0.680 | 0.395 | -0.100 | 0.130 | -0.450 | 1.150 | ... | -0.770 | 0.200 | -0.060 | 0.41998 | 0.150 | 0.070 | -0.100 | -0.150 | -0.090 | 0.020 |
3 | g4 | 1.140 | 0.379961 | -0.040 | -0.810 | 0.905 | -0.460 | -1.630 | 0.080 | -1.400 | ... | 0.940 | -1.410 | 0.800 | 0.92998 | -1.970 | -0.700 | 1.100 | -1.330 | -1.260 | -1.230 |
4 | g5 | -0.265 | 0.464961 | -0.605 | 0.625 | 0.200 | -0.205 | 0.075 | 0.005 | -0.005 | ... | -0.015 | 1.585 | -0.115 | -0.09502 | -0.065 | -0.195 | 1.045 | 0.045 | 0.045 | -0.715 |
5 rows × 65 columns
Los 64 tipos de cancer se encuentra en el archivo nci_label.txt también situado en Moodle y se descarga a la misma carpeta data
df_lbl = pd.read_csv('data/nci_label.txt', header=None, names=["Cell"])
df_lbl.head()
y = df_lbl.values
np.size(y), np.unique(y)
(64,
array(['BREAST', 'CNS', 'COLON', 'K562A-repro', 'K562B-repro', 'LEUKEMIA',
'MCF7A-repro', 'MCF7D-repro', 'MELANOMA', 'NSCLC', 'OVARIAN',
'PROSTATE', 'RENAL', 'UNKNOWN'], dtype=object))
La estructura del fichero nci_data.csv es:
Una columna que sirve para enumerar las 6830 expresiones genéticas y que no se utilizará.
64 columnas con los tipos de cancer.
Por tanto, se toman las 64 últimas columnas, por lo que es necesario transponer la matriz X_trap para obtener el conjunto inicial de entrenamiento, que se denomina X_ini.
X_ini ya tiene 64 filas por cada tipo histológico de cancer con 3680 características, siendo cada uno de ellos la expresión de un gen.
X_trap = df.values[:,1:65]
X_ini = np.transpose(X_trap)
X_ini.shape
(64, 6830)
Estandarización de los datos de entrada
Para poder probar con datos estandarizados o no estandarizados en la siguiente celda tenemos las dos opciones de forma que en la matriz X con la que se va a trabajar se podrá volcar el dato estandarizado o no, según se comente o descomente la última línea de código
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X_ini)
#X = X_ini
División en Train y Test¶
Debido a la baja población no es posible hacer la división, pues quedarían clases con 1 sólo elemento. Se emplea todo X e y
Entrenamiento del Perceptron¶
Primero se echa un vistazo a las dimensiones del conjunto de entrada y a la cantidad de etiquetas de la variable objetivo
X.shape, np.size(np.unique(y))
((64, 6830), 14)
Elegir el número de neuronas de la capa de entrada
El número de neuronas de entrada es 6830 y las de salida son 14
i=6830
o=14
h=2*(i+o)/3
int(h), h
(4562, 4562.666666666667)
Por compatibilidad y evitar Warnings se convierte la lista de tipos de cancer de Y en array
y_array = np.ravel(y)
Se adopta una capa oculta con las neuronas calculadas anteriormente
Mostrar la exactitud de todo el conjunto de entrenamiento
from sklearn.neural_network import MLPClassifier
## Inicialización y creación del objeto clasificador
mlp = MLPClassifier(hidden_layer_sizes=(4562), max_iter=500,activation = 'logistic',solver='lbfgs',random_state=1)
mlp.fit(X, y_array)
print("Exactitud del conjunto de entrenamiento: {:.3f}".format(mlp.score(X, y_array)))
Exactitud del conjunto de entrenamiento: 1.000