Metodi in R o Python per eseguire la selezione di funzioni nell'apprendimento non supervisionato [chiuso]


11

Quali sono i metodi / implementazioni disponibili in R / Python per scartare / selezionare funzionalità non importanti / importanti nei dati? I miei dati non hanno etichette (senza supervisione).

I dati hanno ~ 100 funzionalità con tipi misti. Alcuni sono numerici mentre altri sono binari (0/1).


Che tipo di algoritmo di apprendimento senza supervisione stai usando? Come sono i tuoi dati?
Max Candocia,

@ user1362215, Prima di applicare qualsiasi algoritmo senza supervisione, sto cercando di trovare un modo per eseguire la rimozione delle funzionalità.
studente

Hai visto questo scikit-learn bigino prima? Potrebbe aiutarti a iniziare ...
Steve S,

Perché non utilizzare un metodo non supervisionato che perfome caratterizza la selezione da solo come la foresta casuale in modalità non supervisionata?
JEquihua,

1
Non sono del tutto sicuro, voglio dire che la foresta casuale è completamente non parametrica, quindi non preoccuparti delle ipotesi. Quello che non sono sicuro è se servirà al tuo scopo. Quello che posso dire è che esiste una versione di Random Forest solo per il "rilevamento di anomalie" chiamato foreste di isolamento: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… c'era un'implementazione in R ma io sono non sono sicuro che sia attivo e funzionante da ora.
JEquihua,

Risposte:


7

Ha un anno, ma ritengo ancora che sia pertinente, quindi volevo solo condividere la mia implementazione in pitone di Principal Feature Analysis (PFA), come proposto nel documento a cui Charles ha collegato la sua risposta.

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_]

Puoi usarlo in questo modo:

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_

Ciò segue rigorosamente l'algoritmo descritto dall'articolo. Penso che il metodo abbia promesso, ma onestamente non penso che sia l'approccio più solido alla selezione delle funzioni senza supervisione. Pubblicherò un aggiornamento se trovo qualcosa di meglio.


Nel metodo descritto nel documento a cui ci si collega, il passaggio 1 è di calcolare la matrice di covarianza e il passaggio 2 è di calcolare il PCA sulla matrice di covarianza dal passaggio 1. Credo che la tua fitfunzione salti il ​​passaggio 1 ed esegua il PCA sull'insieme di dati originale .
user35581

@ user35581 buon punto. Tuttavia, ciò che fanno è (1) produrre la matrice di covarianza dai dati originali e quindi (2) calcolare gli autovettori e gli autovalori della matrice di covarianza usando il metodo SVD. Questi due passaggi combinati sono ciò che tu chiami PCA. Le componenti principali sono gli autovettori della matrice di covarianza dei dati originali.
Ulf Aslak,

@Ulf Aslak puoi spiegare perché pensi che non sia l'approccio più solido alla selezione delle funzioni senza supervisione?
hipoglucido,

1
@hipoglucido onestamente, non posso spiegare i miei pensieri quando l'ho scritto. Sono passati tre anni. Rivedere di nuovo il codice, sono portato a credere che abbia qualcosa a che fare con l'uso di KMeans (che non è deterministico). Inoltre, vorrei vedere come si confronta con il semplice raggruppamento delle funzionalità non trasformate in PCA.
Ulf Aslak il




0

Ci sono molte opzioni disponibili in R. Un bel posto in cui cercare è il caretpacchetto che fornisce una buona interfaccia a molti altri pacchetti e opzioni. Puoi dare un'occhiata al sito qui . Ci sono molte opzioni là fuori, ma ne illustrerò una.

Ecco un esempio dell'uso di un semplice filtro utilizzando i Rset di dati "mtcars" incorporati (mostrati di seguito).

                   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

Ora alcune impostazioni del codice (caricamento dei pacchetti, ecc.):

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

E possiamo adattare un modello semplice per selezionare le variabili:

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

Visualizzando i risultati, otteniamo:

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 siamo in grado di tracciare le variabili selezionate (in fit1$optVariables) contro il risultato, mpg:

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

Risultato in questo grafico: grafici a dispersione


1
Questo non è un apprendimento non supervisionato come richiesto dall'OP, poiché il tuo modello usa mpgcome risultato. Esiste un modo per utilizzare metodi come questi nei modelli senza supervisione?
Max Ghenis,

0

Il nsprcomppacchetto R fornisce metodi per l'analisi dei componenti principali sparsi, che potrebbero soddisfare le vostre esigenze.

Ad esempio, se ritieni che le tue funzionalità siano generalmente correlate linearmente e desideri selezionare le prime cinque, potresti eseguire PCA sparse con un massimo di cinque funzionalità e limitare al primo componente principale:

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

In alternativa, se si desidera acquisire la natura ortogonale delle funzionalità, è possibile selezionare la funzionalità principale da ciascuno dei cinque PC principali, limitando ciascun PC a una funzionalità:

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

Un insieme di questi potrebbe anche essere utile; vale a dire, le caratteristiche che vengono costantemente al vertice attraverso diversi metodi probabilmente spiegheranno una grande varianza nello spazio delle caratteristiche. Avendo giocato con nsprcompun po ', sembra che i primi due metodi portino in alto ~ 1/2 delle stesse caratteristiche. Detto questo, ottimizzare questo processo può essere uno sforzo empirico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.