Ejercicio 1: Algoritmo k-NN
El algoritmo kNN debe su nombre a ‘The nearest neighbors’ ó el vecino más cercano. Este algoritmo es de gran utilidad para tareas de clasificación donde las relaciones entre las diferentes clases son numerosas, complicadas, y difíciles de entender. El algoritmo kNN funciona con un set de datos de ‘entrenamiento’ con ejemplos que van a ser clasificados en diferentes categorías. Para cada elemento en el set de nuestros datos, kNN identificará los elementos k en el set de datos de entrenamiento que son más similares entre sí, donde k es un numero entero que se ha especificado con anterioridad. Este algoritmo calcula la distancia entre los ‘vecinos más cercanos’, o con otras palabras, los elementos de nuestro set de datos que son más similares entre sí, calculando la distancia Euclediana, que es la distancia que se mediría con una regla entre dos puntos: la raíz cuadrada de la suma de todas las resta al cuadrado de las coordenadas de los dos puntos. En base a la distancía más cercana, el elemento quedará clasificado en un grupo u en otro. Esta clasificación depende del valor de k, por lo que la elección de un valor de k apropiado, dará lugar a una mejor o peor classificación. Este algoritmo es muy útil para aplicaciones en computacion visual, como por ejemplo el reconocimiento de carácteres ópticos y reconocimiento facial. La predición también se puede aplicar a si por ejemplo una persona disfruta viendo una película o no que se le ha recomendado, o identificar patrones de datos genéticos.
Fortalezas del algoritmo kNN: -Simple y efectivo. -No realiza asunciones sobre la distribución de datos. -Tiene un fase de aprendizaje rápida.
Debilidades: -No produce un modelo, lo que limita la abilidad de encontrar nuevas relaciones entre los elementos. -Tiene una fase lenta de clasificación. -Requiere mucha memoria. -Los elementos nominales y los datos perdidos requieren procesamiento adiccional.
Ejercicio 2.
#Aplicar el método de encoding one-hot spot y matrix blosum62 a los peptidos.
Ejercicio 3.
Desarrollar un script en R que implemente in clasificador knn. El script debe realizar los siguientes apartados. a) Leer los datos peptidos.csv y hacer una breve descripcion de ellos. Incluir en esta descripcion el patron de clase de peptido mediante la representación de secuencia logo.
#Leemos el archivo peptidos.csv.
peptidos <- read.csv('peptidos.csv', header=TRUE, sep=';')
str(peptidos)
## 'data.frame': 15840 obs. of 2 variables:
## $ sequence: Factor w/ 15840 levels "AAAPSACSV","AACNCGQTV",..: 7469 5105 3169 13842 8498 13106 13742 12915 11765 1667 ...
## $ label : Factor w/ 2 levels "NB","SB": 2 1 2 1 1 2 2 1 1 1 ...
summary(peptidos$label)
## NB SB
## 7920 7920
#En este archivo encontramos dos variables: sequence donde se almacenan todos los peptidos que contienen cada uno 9 aminoácidos y la variable label que contiene dos posibles condiciones SB y NS que NB indica si no hay interacción y SB si SI hay interacción.
#Instalar el paquete ggseqlogo para visualizar los datos como logos.
install.packages('ggseqlogo', repos = 'http://crans.us.r-project.org')
require(ggplot2)
## Loading required package: ggplot2
require(ggseqlogo)
## Loading required package: ggseqlogo
pepseq<- as.vector(peptidos$sequence)
ggseqlogo(pepseq,seq_type='auto', namespace = 'NULL', font='helvetica_regular', col_scheme = 'nucleotide')
b) i.
peptidos <- read.csv('peptidos.csv', header=TRUE, sep=';')
peptidosonehot <- read.csv('peptidos_transf_one_hot.csv', header=TRUE, sep=';')
#Los datos correspondientes a totalonedot los almacenaré en totalonehot.
peptidos_label<- as.data.frame(peptidos$label)
peptidoslabel <- na.omit(peptidos_label)
peptidosonehot <- na.omit(peptidosonehot)
#ONE-HOT ENCODING
#Semilla aleatoria para separar los datos:
smp_size <-floor(0.67 *nrow(peptidosonehot))
set.seed(123)
train_ind <- sample(seq_len(nrow(peptidosonehot)), size=smp_size)
train_onehot <- peptidosonehot[train_ind, ]
test_onehot <- peptidosonehot[-train_ind, ]
#Semilla aleatoria para los labels
smp_size <-floor(0.67 *nrow(peptidoslabel))
set.seed(123)
train_ind_l <- sample(seq_len(nrow(peptidoslabel)), size=smp_size)
train_label <- peptidoslabel[train_ind_l, ]
test_label <- peptidoslabel[-train_ind_l, ]
iii.Utilizar knn (k=3,5,7,11 y realizar una curva ROC para cada k) Para k=3
install.packages('class', repos = 'http://crans.us.r-project.org')
install.packages('gmodels', repos = 'http://crans.us.r-project.org')
install.packages('ROCR', repos = 'http://crans.us.r-project.org')
library(class)
library(gmodels)
library(ROCR)
## Loading required package: gplots
##
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
##
## lowess
library(ggplot2)
peptidosonhot_test_pred <- knn(train= train_onehot, test= test_onehot, cl = train_label, k=3)
CrossTable(x=test_label, y=peptidosonhot_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosonhot_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1818 | 816 | 2634 |
## | 0.690 | 0.310 | 0.504 |
## | 0.999 | 0.239 | |
## | 0.348 | 0.156 | |
## -------------|-----------|-----------|-----------|
## SB | 2 | 2592 | 2594 |
## | 0.001 | 0.999 | 0.496 |
## | 0.001 | 0.761 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1820 | 3408 | 5228 |
## | 0.348 | 0.652 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosonhot_test_pred <- as.numeric(peptidosonhot_test_pred)
caTools::colAUC(peptidosonhot_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.844717
#como podemos ver con el k=3 es muy elevado, el numero de falsos positivos para, por lo que este k no es bueno para predicción.
Para k=5
#
library(class)
library(gmodels)
#probamos con la k=5
peptidosonhot_test_pred <- knn(train= train_onehot, test= test_onehot, cl = train_label, k=5)
CrossTable(x=test_label, y=peptidosonhot_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosonhot_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1866 | 768 | 2634 |
## | 0.708 | 0.292 | 0.504 |
## | 1.000 | 0.228 | |
## | 0.357 | 0.147 | |
## -------------|-----------|-----------|-----------|
## SB | 0 | 2594 | 2594 |
## | 0.000 | 1.000 | 0.496 |
## | 0.000 | 0.772 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1866 | 3362 | 5228 |
## | 0.357 | 0.643 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosonhot_test_pred <- as.numeric(peptidosonhot_test_pred)
caTools::colAUC(peptidosonhot_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8542141
#Con la k=5 el numero de falsos positivos es menor, pero aun asi alto.
Para k=7
#
library(class)
library(gmodels)
#probamos con la k=5
peptidosonhot_test_pred <- knn(train= train_onehot, test= test_onehot, cl = train_label, k=7)
CrossTable(x=test_label, y=peptidosonhot_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosonhot_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1858 | 776 | 2634 |
## | 0.705 | 0.295 | 0.504 |
## | 1.000 | 0.230 | |
## | 0.355 | 0.148 | |
## -------------|-----------|-----------|-----------|
## SB | 0 | 2594 | 2594 |
## | 0.000 | 1.000 | 0.496 |
## | 0.000 | 0.770 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1858 | 3370 | 5228 |
## | 0.355 | 0.645 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosonhot_test_pred <- as.numeric(peptidosonhot_test_pred)
caTools::colAUC(peptidosonhot_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8526955
#Con la k=7 el numero de falsos positivos es menor, pero aun asi alto.
Para k=11
#
library(class)
library(gmodels)
#probamos con la k=5
peptidosonhot_test_pred <- knn(train= train_onehot, test= test_onehot, cl = train_label, k=11)
CrossTable(x=test_label, y=peptidosonhot_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosonhot_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1822 | 812 | 2634 |
## | 0.692 | 0.308 | 0.504 |
## | 1.000 | 0.238 | |
## | 0.349 | 0.155 | |
## -------------|-----------|-----------|-----------|
## SB | 0 | 2594 | 2594 |
## | 0.000 | 1.000 | 0.496 |
## | 0.000 | 0.762 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1822 | 3406 | 5228 |
## | 0.349 | 0.651 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosonhot_test_pred <- as.numeric(peptidosonhot_test_pred)
caTools::colAUC(peptidosonhot_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8458618
#Con la k=11 el numero de falsos positivos es mayor.
#BLOSUM62:
blosum62 <- read.csv('peptidos_transf_BLOSUM62.csv', header=TRUE, sep=';', dec=',')
blosum62 <- na.omit(blosum62)
smp_size <-floor(0.67 *nrow(blosum62))
set.seed(123)
train_ind <- sample(seq_len(nrow(blosum62)), size=smp_size)
train_blosum <- blosum62[train_ind, ]
test_blosum <- blosum62[-train_ind, ]
#Semilla aleatoria para los labels
smp_size <-floor(0.67 *nrow(peptidoslabel))
set.seed(123)
train_ind_l <- sample(seq_len(nrow(peptidoslabel)), size=smp_size)
train_label <- peptidoslabel[train_ind_l, ]
test_label <- peptidoslabel[-train_ind_l, ]
#clasificación con la matriz BLOSUM62
library(class)
library(gmodels)
#probamos con la k=1
peptidosblosum_test_pred <- knn(train= train_blosum, test= test_blosum, cl = train_label, k=3)
CrossTable(x=test_label, y=peptidosblosum_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosblosum_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1871 | 763 | 2634 |
## | 0.710 | 0.290 | 0.504 |
## | 0.994 | 0.228 | |
## | 0.358 | 0.146 | |
## -------------|-----------|-----------|-----------|
## SB | 11 | 2583 | 2594 |
## | 0.004 | 0.996 | 0.496 |
## | 0.006 | 0.772 | |
## | 0.002 | 0.494 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1882 | 3346 | 5228 |
## | 0.360 | 0.640 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
CrossTable(x=test_label, y=peptidosblosum_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosblosum_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1871 | 763 | 2634 |
## | 0.710 | 0.290 | 0.504 |
## | 0.994 | 0.228 | |
## | 0.358 | 0.146 | |
## -------------|-----------|-----------|-----------|
## SB | 11 | 2583 | 2594 |
## | 0.004 | 0.996 | 0.496 |
## | 0.006 | 0.772 | |
## | 0.002 | 0.494 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1882 | 3346 | 5228 |
## | 0.360 | 0.640 | |
## -------------|-----------|-----------|-----------|
##
##
peptidosblosum_test_pred <- as.numeric(peptidosonhot_test_pred)
caTools::colAUC(peptidosblosum_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8458618
#Los falsos positivos son menores pero aun asi son altos.
#clasificación con la matriz BLOSUM62
library(class)
library(gmodels)
#probamos con la k=5
peptidosblosum_test_pred <- knn(train= train_blosum, test= test_blosum, cl = train_label, k=5)
CrossTable(x=test_label, y=peptidosblosum_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosblosum_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1835 | 799 | 2634 |
## | 0.697 | 0.303 | 0.504 |
## | 0.999 | 0.236 | |
## | 0.351 | 0.153 | |
## -------------|-----------|-----------|-----------|
## SB | 2 | 2592 | 2594 |
## | 0.001 | 0.999 | 0.496 |
## | 0.001 | 0.764 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1837 | 3391 | 5228 |
## | 0.351 | 0.649 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosblosum_test_pred <- as.numeric(peptidosblosum_test_pred)
caTools::colAUC(peptidosblosum_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.847944
#Los falsos positivos mas
#clasificación con la matriz BLOSUM62
library(class)
library(gmodels)
#probamos con la k=7
peptidosblosum_test_pred <- knn(train= train_blosum, test= test_blosum, cl = train_label, k=7)
CrossTable(x=test_label, y=peptidosblosum_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosblosum_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1794 | 840 | 2634 |
## | 0.681 | 0.319 | 0.504 |
## | 1.000 | 0.245 | |
## | 0.343 | 0.161 | |
## -------------|-----------|-----------|-----------|
## SB | 0 | 2594 | 2594 |
## | 0.000 | 1.000 | 0.496 |
## | 0.000 | 0.755 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1794 | 3434 | 5228 |
## | 0.343 | 0.657 | |
## -------------|-----------|-----------|-----------|
##
##
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
peptidosblosum_test_pred <- as.numeric(peptidosblosum_test_pred)
caTools::colAUC(peptidosblosum_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8405467
#Los falsos positivos son aun mas altos
#clasificación con la matriz BLOSUM62
library(class)
library(gmodels)
#probamos con la k=11
peptidosblosum_test_pred <- knn(train= train_blosum, test= test_blosum, cl = train_label, k=11)
CrossTable(x=test_label, y=peptidosblosum_test_pred, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 5228
##
##
## | peptidosblosum_test_pred
## test_label | NB | SB | Row Total |
## -------------|-----------|-----------|-----------|
## NB | 1769 | 865 | 2634 |
## | 0.672 | 0.328 | 0.504 |
## | 1.000 | 0.250 | |
## | 0.338 | 0.165 | |
## -------------|-----------|-----------|-----------|
## SB | 0 | 2594 | 2594 |
## | 0.000 | 1.000 | 0.496 |
## | 0.000 | 0.750 | |
## | 0.000 | 0.496 | |
## -------------|-----------|-----------|-----------|
## Column Total | 1769 | 3459 | 5228 |
## | 0.338 | 0.662 | |
## -------------|-----------|-----------|-----------|
##
##
peptidosblosum_test_pred <- as.numeric(peptidosblosum_test_pred)
#Para representar la curva ROC:
#La curva ROC también nos permite conocer los valores del area bajo la curva, que indica que valores mayores que 0.5 representan que el modelo es mejor que los modelos 'random guess'
caTools::colAUC(peptidosblosum_test_pred, test_label, plotROC = TRUE)
## [,1]
## NB vs. SB 0.8358011
#Los falsos positivos son menores pero aun asi son altos.
#El numero de falsos positivos para one-hot es : con k=3, de 813, para k=5, 746, para k=7, 740 y para k=11 es de 785, por lo que para este modelo, una k= a 7 es la mejor opción para predicción. Mientras que para la matriz blosum62, k=3, 762 falsos positivos, k=5, 803, k=7, 829, k=11 840, por lo que para blosum, es mejor una k=3. Según esto, el modelo one-hot es mejor para estos datos que el modelo de sustitución de matriz blosum62 ya que produce un numero menor de falsos positivos que el blosum62.