Implementación de PCA en Python con Scikit-Learn

    Con la disponibilidad de CPU y GPU de alto rendimiento, es prácticamente posible resolver cada regresión, clasificación, agrupación y otros problemas relacionados mediante el uso de modelos de Machine Learning y aprendizaje profundo. Sin embargo, todavía existen varios factores que causan cuellos de botella en el rendimiento al desarrollar dichos modelos. Una gran cantidad de características en el conjunto de datos es uno de los factores que afectan tanto el tiempo de entrenamiento como la precisión de los modelos de Machine Learning. Tiene diferentes opciones para lidiar con una gran cantidad de características en un conjunto de datos.

    • Intente entrenar los modelos en el número original de funciones, lo que lleva días o semanas si el número de funciones es demasiado alto.
    • Reduzca el número de variables fusionando variables correlacionadas.
    • Extraiga las características más importantes del conjunto de datos que son responsables de la varianza máxima en la salida. Se utilizan diferentes técnicas estadísticas para este propósito, por ejemplo, análisis discriminante lineal, análisis factorial y análisis de componentes principales.

    En este artículo, veremos cómo análisis de componentes principales se puede implementar utilizando la biblioteca Scikit-Learn de Python.

    Análisis de componentes principales

    Análisis de componentes principales, o PCA, es una técnica estadística para convertir datos de alta dimensión en datos de baja dimensión mediante la selección de las características más importantes que capturan la máxima información sobre el conjunto de datos. Las características se seleccionan en función de la variación que provocan en la salida. La característica que causa la mayor variación es el primer componente principal. La característica responsable de la segunda varianza más alta se considera el segundo componente principal y así sucesivamente. Es importante mencionar que los componentes principales no tienen correlación entre sí.

    Ventajas de PCA

    Hay dos ventajas principales de reducción de dimensionalidad con PCA.

    • El tiempo de entrenamiento de los algoritmos se reduce significativamente con menos funciones.
    • No siempre es posible analizar datos en grandes dimensiones. Por ejemplo, si hay 100 características en un conjunto de datos. El número total de diagramas de dispersión necesarios para visualizar los datos sería 100(100-1)2 = 4950. Prácticamente no es posible analizar datos de esta manera.

    Normalización de características

    Es imperativo mencionar que se debe normalizar un conjunto de características antes de aplicar PCA. Por ejemplo, si un conjunto de características tiene datos expresados ​​en unidades de kilogramos, años luz o millones, la escala de varianza es enorme en el conjunto de entrenamiento. Si se aplica PCA en un conjunto de características de este tipo, las cargas resultantes para las características con alta variación también serán grandes. Por lo tanto, los componentes principales estarán sesgados hacia características con alta varianza, lo que conducirá a resultados falsos.

    Finalmente, el último punto que debemos recordar antes de comenzar a codificar es que el PCA es una técnica estadística y solo se puede aplicar a datos numéricos. Por lo tanto, las características categóricas deben convertirse en características numéricas antes de que se pueda aplicar la PCA.

    Implementación de PCA con Scikit-Learn

    En esta sección implementaremos PCA con la ayuda de Python Scikit-Learn biblioteca. Seguiremos el proceso clásico de Machine Learning en el que primero importaremos bibliotecas y conjuntos de datos, realizaremos análisis exploratorios de datos y preprocesamiento y finalmente entrenaremos nuestros modelos, haremos predicciones y evaluaremos la precisión. El único paso adicional será realizar PCA para averiguar el número óptimo de funciones antes de entrenar nuestros modelos. Estos pasos se han implementado de la siguiente manera:

    Importación de bibliotecas

    import numpy as np
    import pandas as pd
    

    Importar conjunto de datos

    El conjunto de datos que vamos a utilizar en este artículo es el famoso Conjunto de datos de iris. Alguna información adicional sobre el conjunto de datos Iris está disponible en:

    https://archive.ics.uci.edu/ml/datasets/iris

    El conjunto de datos consta de 150 registros de la planta Iris con cuatro características: ‘longitud de sépalo’, ‘ancho de sépalo’, ‘longitud de pétalo’ y ‘ancho de pétalo’. Todas las funciones son numéricas. Los registros se han clasificado en una de las tres clases, es decir, ‘Iris-setosa’, ‘Iris-versicolor’ o ‘Iris-verginica’.

    Ejecute el siguiente script para descargar el conjunto de datos usando pandas:

    url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
    names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
    dataset = pd.read_csv(url, names=names)
    

    Echemos un vistazo a cómo se ve nuestro conjunto de datos:

    dataset.head()
    

    La ejecución del comando anterior mostrará las primeras cinco filas de nuestro conjunto de datos como se muestra a continuación:

    Longitud del sépalo Ancho del sépalo Longitud del pétalo Ancho del pétalo Clase

    05.13,51.40,2Iris-setosa
    14.93,01.40,2Iris-setosa
    24.73.21.30,2Iris-setosa
    34.63.11,50,2Iris-setosa
    45,03.61.40,2Iris-setosa

    Preprocesamiento

    El primer paso del preprocesamiento es dividir el conjunto de datos en un conjunto de características y las etiquetas correspondientes. El siguiente script realiza esta tarea:

    X = dataset.drop('Class', 1)
    y = dataset['Class']
    

    El script anterior almacena los conjuntos de funciones en el X variable y la serie de etiquetas correspondientes en el y variable.

    El siguiente paso de preprocesamiento es dividir los datos en conjuntos de prueba y entrenamiento. Ejecute el siguiente script para hacerlo:

    # Splitting the dataset into the Training set and Test set
    from sklearn.model_selection import train_test_split
    
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
    

    Como se mencionó anteriormente, PCA funciona mejor con un conjunto de características normalizadas. Realizaremos una normalización escalar estándar para normalizar nuestro conjunto de características. Para hacer esto, ejecute el siguiente código:

    from sklearn.preprocessing import StandardScaler
    
    sc = StandardScaler()
    X_train = sc.fit_transform(X_train)
    X_test = sc.transform(X_test)
    

    Aplicación de PCA

    Es solo una cuestión de tres líneas de código para realizar PCA usando la biblioteca Scikit-Learn de Python. los PCA class se utiliza para este propósito. PCA depende solo del conjunto de funciones y no de los datos de la etiqueta. Por lo tanto, PCA se puede considerar como una técnica de Machine Learning no supervisada.

    Realizar PCA con Scikit-Learn es un proceso de dos pasos:

    • Inicializar el PCA class pasando el número de componentes al constructor.
    • Llama a fit y entonces transform métodos pasando el conjunto de características a estos métodos. los transform El método devuelve el número especificado de componentes principales.

    Eche un vistazo al siguiente código:

    from sklearn.decomposition import PCA
    
    pca = PCA()
    X_train = pca.fit_transform(X_train)
    X_test = pca.transform(X_test)
    

    En el código anterior, creamos un PCA objeto nombrado pca. No especificamos el número de componentes en el constructor. Por lo tanto, las cuatro características del conjunto de características se devolverán tanto para los conjuntos de entrenamiento como de prueba.

    La clase PCA contiene explained_variance_ratio_ que devuelve la varianza causada por cada uno de los componentes principales. Ejecute la siguiente línea de código para encontrar el “índice de varianza explicado”.

    explained_variance = pca.explained_variance_ratio_
    

    los explained_variance La variable ahora es una matriz de tipo flotante que contiene relaciones de varianza para cada componente principal. Los valores para el explained_variance variable se ve así:

    0,722265
    0.239748
    0.0333812
    0,0046056

    Puede verse que el primer componente principal es responsable de la varianza del 72,22%. De manera similar, el segundo componente principal causa una variación del 23,9% en el conjunto de datos. En conjunto, podemos decir que (72,22 + 23,9) el 96,21% por ciento de la información de clasificación contenida en el conjunto de características es capturada por los dos primeros componentes principales.

    Primero intentemos usar 1 componente principal para entrenar nuestro algoritmo. Para hacerlo, ejecute el siguiente código:

    from sklearn.decomposition import PCA
    
    pca = PCA(n_components=1)
    X_train = pca.fit_transform(X_train)
    X_test = pca.transform(X_test)
    

    El resto del proceso es sencillo.

    Entrenando y haciendo predicciones

    En este caso, usaremos la clasificación de bosque aleatoria para hacer las predicciones.

    from sklearn.ensemble import RandomForestClassifier
    
    classifier = RandomForestClassifier(max_depth=2, random_state=0)
    classifier.fit(X_train, y_train)
    
    # Predicting the Test set results
    y_pred = classifier.predict(X_test)
    

    Evaluación del desempeño

    from sklearn.metrics import confusion_matrix
    from sklearn.metrics import accuracy_score
    
    cm = confusion_matrix(y_test, y_pred)
    print(cm)
    print('Accuracy' + accuracy_score(y_test, y_pred))
    

    La salida del script anterior se ve así:

    [[11  0  0]
     [ 0 12  1]
     [ 0  1  5]]
    0.933333333333
    

    Se puede ver en el resultado que con solo una característica, el algoritmo de bosque aleatorio puede predecir correctamente 28 de 30 instancias, lo que resulta en una precisión del 93,33%.

    Resultados con 2 y 3 componentes principales

    Ahora intentemos evaluar el rendimiento de clasificación del algoritmo de bosque aleatorio con 2 componentes principales. Actualice este fragmento de código:

    from sklearn.decomposition import PCA
    
    pca = PCA(n_components=2)
    X_train = pca.fit_transform(X_train)
    X_test = pca.transform(X_test)
    

    Aquí, el número de componentes para PCA se ha establecido en 2. Los resultados de la clasificación con 2 componentes son los siguientes:

    [[11  0  0]
     [ 0 10  3]
     [ 0  2  4]]
    0.833333333333
    

    Con dos componentes principales, la precisión de la clasificación disminuye al 83,33% en comparación con el 93,33% de 1 componente.

    Con tres componentes principales, el resultado se ve así:

    [[11  0  0]
     [ 0 12  1]
     [ 0  1  5]]
    0.933333333333
    

    Con tres componentes principales, la precisión de la clasificación aumenta nuevamente al 93,33%

    Resultados con el conjunto completo de funciones

    Intentemos encontrar los resultados con el conjunto completo de funciones. Para hacerlo, simplemente elimine la parte PCA del script que escribimos anteriormente. Los resultados con el conjunto completo de funciones, sin aplicar PCA, se ven así:

    [[11  0  0]
     [ 0 13  0]
     [ 0  2  4]]
    0.933333333333
    

    La precisión recibida con el conjunto completo de funciones para el algoritmo de bosque aleatorio también es del 93,33%.

    Discusión

    A partir de la experimentación anterior, logramos un nivel óptimo de precisión al tiempo que redujimos significativamente la cantidad de características en el conjunto de datos. Vimos que la precisión lograda con un solo componente principal es igual a la precisión lograda con el conjunto de características de voluntad, es decir, 93,33%. También es pertinente mencionar que la precisión de un clasificador no necesariamente mejora con un mayor número de componentes principales. De los resultados podemos ver que la precisión alcanzada con un componente principal (93,33%) fue mayor que la alcanzada con dos componentes principales (83,33%).

    La cantidad de componentes principales que se deben retener en un conjunto de características depende de varias condiciones, como la capacidad de almacenamiento, el tiempo de entrenamiento, el rendimiento, etc. En algunos conjuntos de datos, todas las características contribuyen por igual a la variación general, por lo tanto, todos los componentes principales son cruciales para la predicciones y ninguna puede ser ignorada. Una regla general es tomar el número de componentes principales que contribuyen a una varianza significativa e ignorar aquellos con rendimientos de varianza decrecientes. Una buena manera es graficar la varianza contra los componentes principales e ignorar los componentes principales con valores decrecientes como se muestra en el siguiente gráfico:

    Por ejemplo, en el gráfico anterior, podemos ver que después del tercer componente principal, el cambio en la varianza casi disminuye. Por lo tanto, se pueden seleccionar los primeros tres componentes.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *