Juntándolo todo
Además del pipeline de detección de anomalías basado en distancias que creaste en el ejercicio anterior, también quieres admitir uno basado en características con un SVM de una clase. Decides extraer dos características: primero, la longitud de la cadena y, segundo, una codificación numérica de la primera letra de la cadena, obtenida con la función LabelEncoder() descrita en el Capítulo 1. Para asegurar una comparación justa, introducirás las puntuaciones de atípicos en un cálculo de AUC. Ya se han importado: LabelEncoder(), roc_auc_score() como auc() y OneClassSVM. Los datos están disponibles como un pandas data frame llamado proteins con dos columnas, label y seq, y dos clases, IMMUNE SYSTEM y VIRUS. Hay un detector LoF ajustado disponible como lof_detector.
Este ejercicio forma parte del curso
Diseño de flujos de trabajo de Machine Learning en Python
Instrucciones del ejercicio
- Para una cadena
s,len(s)devuelve su longitud. Aplícalo a la columnaseqpara obtener una nueva columnalen. - Para una cadena
s,list(s)devuelve una lista de sus caracteres. Úsalo para extraer la primera letra de cada secuencia y codifícala conLabelEncoder(). - Las puntuaciones de LoF están en el atributo
negative_outlier_factor_. Calcula su AUC. - Ajusta un SVM de 1 clase a un data frame con solo las columnas
lenyfirst. Extrae las puntuaciones y evalúa tanto las puntuaciones de LoF como las del SVM usando AUC.
Ejercicio interactivo práctico
Prueba este ejercicio y completa el código de muestra.
# Create a feature that contains the length of the string
proteins['len'] = proteins['seq'].apply(____)
# Create a feature encoding the first letter of the string
proteins['first'] = ____.____(
proteins['seq'].apply(____))
# Extract scores from the fitted LoF object, compute its AUC
scores_lof = lof_detector.____
print(____(proteins['label']==____, scores_lof))
# Fit a 1-class SVM, extract its scores, and compute its AUC
svm = ____.____(proteins[['len', 'first']])
scores_svm = svm.____(proteins[['len', 'first']])
print(____(proteins['label']==____, scores_svm))