Métodos en R o Python para realizar la selección de características en el aprendizaje no supervisado [cerrado]


11

¿Cuáles son los métodos / implementación disponibles en R / Python para descartar / seleccionar características no importantes / importantes en los datos? Mis datos no tienen etiquetas (sin supervisión).

Los datos tienen ~ 100 características con tipos mixtos. Algunos son numéricos mientras que otros son binarios (0/1).


¿Qué tipo de algoritmo de aprendizaje no supervisado estás usando? ¿Cómo son sus datos?
Max Candocia

@ user1362215, antes de aplicar cualquier algoritmo no supervisado, estoy tratando de encontrar una manera de realizar la eliminación de funciones.
alumno

¿Usted ha visto este scikit-learn cheatsheet antes? Puede ayudarlo a comenzar ...
Steve S

¿Por qué no utilizar un método no supervisado en el que los perfomas presentan la selección por sí mismos como un bosque aleatorio en modo no supervisado?
JEquihua

1
No estoy completamente seguro, quiero decir que el bosque aleatorio es completamente no paramétrico, así que no se preocupe por los supuestos. Lo que no estoy seguro es si servirá a su propósito. Lo que PUEDO decir es que hay una versión de Random Forest solo para "detección de anomalías" llamada bosques de aislamiento: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… hubo una implementación en R pero estoy no estoy seguro si está en funcionamiento a partir de ahora.
JEquihua

Respuestas:


7

Tiene un año pero todavía siento que es relevante, así que solo quería compartir mi implementación de Python del Análisis de características principales (PFA) como se propuso en el documento al que Charles se vinculó en su respuesta.

from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from collections import defaultdict
from sklearn.metrics.pairwise import euclidean_distances
from sklearn.preprocessing import StandardScaler

class PFA(object):
    def __init__(self, n_features, q=None):
        self.q = q
        self.n_features = n_features

    def fit(self, X):
        if not self.q:
            self.q = X.shape[1]

        sc = StandardScaler()
        X = sc.fit_transform(X)

        pca = PCA(n_components=self.q).fit(X)
        A_q = pca.components_.T

        kmeans = KMeans(n_clusters=self.n_features).fit(A_q)
        clusters = kmeans.predict(A_q)
        cluster_centers = kmeans.cluster_centers_

        dists = defaultdict(list)
        for i, c in enumerate(clusters):
            dist = euclidean_distances([A_q[i, :]], [cluster_centers[c, :]])[0][0]
            dists[c].append((i, dist))

        self.indices_ = [sorted(f, key=lambda x: x[1])[0][0] for f in dists.values()]
        self.features_ = X[:, self.indices_]

Puedes usarlo así:

import numpy as np
X = np.random.random((1000,1000))

pfa = PFA(n_features=10)
pfa.fit(X)

# To get the transformed matrix
X = pfa.features_

# To get the column indices of the kept features
column_indices = pfa.indices_

Esto sigue estrictamente el algoritmo descrito en el artículo. Creo que el método es prometedor, pero sinceramente, no creo que sea el enfoque más sólido para la selección de funciones sin supervisión. Publicaré una actualización si se me ocurre algo mejor.


En el método descrito en el documento al que se vincula, el Paso 1 es calcular la matriz de covarianza y el paso 2 es calcular PCA en la matriz de covarianza del Paso 1. Creo que su fitfunción omite el Paso 1 y realiza PCA en el conjunto de datos original .
user35581

@ user35581 buen punto. Sin embargo, lo que hacen es (1) producir la matriz de covarianza a partir de los datos originales y luego (2) calcular los vectores propios y los valores propios de la matriz de covarianza utilizando el método SVD. Esos dos pasos combinados son lo que usted llama PCA. Los componentes principales son los vectores propios de la matriz de covarianza de los datos originales.
Ulf Aslak

@Ulf Aslak, ¿puede explicar por qué cree que no es el enfoque más sólido para la selección de funciones sin supervisión?
hipoglucido

1
@hipoglucido honestamente, no puedo dar cuenta de mis pensamientos cuando escribí eso. Hace tres años. Al revisar el código nuevamente, me hacen creer que tiene algo que ver con el uso de KMeans (que no es determinista). Además, me gustaría ver cómo esto se compara con la agrupación de las características no transformadas por PCA.
Ulf Aslak




0

Hay muchas opciones disponibles en R. Un buen lugar para buscar es el caretpaquete que proporciona una interfaz agradable para muchos otros paquetes y opciones. Puedes echar un vistazo al sitio web aquí . Existen muchas opciones, pero ilustraré una.

Aquí hay un ejemplo del uso de un filtro simple usando los Rconjuntos de datos "mtcars" integrados (que se muestran a continuación).

                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

Ahora alguna configuración de código (carga de paquetes, etc.):

# setup a parallel environment
library(doParallel)
cl <- makeCluster(2) # number of cores to use
registerDoParallel(cl)
library(caret)

Y podemos ajustar un modelo simple para seleccionar variables:

fit1 <- sbf(mtcars[, -1], mtcars[, 1],
  sbfControl =
    sbfControl(functions = rfSBF, method = "repeatedcv", repeats = 10)
)

Al ver los resultados, obtenemos:

fit1
Selection By Filter

Outer resampling method: Cross-Validated (10 fold, repeated 10 times) 

Resampling performance:

  RMSE Rsquared RMSESD RsquaredSD
 2.266   0.9224 0.8666     0.1523

Using the training set, 7 variables were selected:
   cyl, disp, hp, wt, vs...

During resampling, the top 5 selected variables (out of a possible 9):
   am (100%), cyl (100%), disp (100%), gear (100%), vs (100%)

On average, 7 variables were selected (min = 5, max = 9)

Finalmente, podemos trazar las variables seleccionadas (en fit1$optVariables) contra el resultado mpg:

library(ggplot2)
library(gridExtra)
do.call(grid.arrange, 
lapply(fit1$optVariables, function(v) {
  ggplot(mtcars, aes_string(x = v, y = "mpg")) +
    geom_jitter()
}))

Resultando en este gráfico: gráfico de dispersión


1
Este no es un aprendizaje no supervisado como lo solicitó OP, ya que su modelo lo utiliza mpgcomo resultado. ¿Hay alguna manera de usar métodos como estos en modelos no supervisados?
Max Ghenis el

0

El nsprcomppaquete R proporciona métodos para un escaso análisis de componentes principales, que podría satisfacer sus necesidades.

Por ejemplo, si cree que sus características generalmente están correlacionadas linealmente y desea seleccionar las cinco principales, puede ejecutar PCA disperso con un máximo de cinco características y limitarlo al primer componente principal:

m <- nsprcomp(x, scale.=T, k=5, ncomp=1)
m$rotation[, 1]

Alternativamente, si desea capturar la naturaleza ortogonal de las funciones, puede seleccionar la función superior de cada una de las cinco PC principales, limitando cada PC a una función:

m <- nsprcomp(x, scale.=T, k=1, ncomp=5)
m$rotation

Un conjunto de estos también podría ser útil; es decir, las características que constantemente llegan a la cima en diferentes métodos pueden explicar una gran cantidad de variación en el espacio de características. Después de jugar nsprcompun poco, parece que los dos primeros métodos elevan ~ 1/2 de las mismas características a la cima. Dicho esto, optimizar este proceso puede ser un esfuerzo empírico.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.