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 鈥嬧媏n 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 *