Metody w języku R lub Python do przeprowadzania wyboru funkcji w uczeniu bez nadzoru [zamknięte]


11

Jakie są dostępne metody / implementacja w R / Python, aby odrzucić / wybrać nieistotne / ważne funkcje w danych? Moje dane nie mają etykiet (bez nadzoru).

Dane mają ~ 100 funkcji z mieszanymi typami. Niektóre są numeryczne, a inne binarne (0/1).


Jakiego rodzaju algorytmu uczenia się bez nadzoru używasz? Jak wyglądają twoje dane?
Max Candocia

@ user1362215, Przed zastosowaniem dowolnego nienadzorowanego algorytmu próbuję znaleźć sposób na usunięcie funkcji.
uczeń

Widziałeś ten scikit-learn Cheatsheet wcześniej? Może ci pomóc zacząć ...
Steve S.

Dlaczego nie zastosować bezobsługowej metody, w której perfomes sam wybiera funkcje, jak losowy las w trybie bez nadzoru?
JEquihua

1
Nie jestem do końca pewien, to znaczy losowy las jest całkowicie nieparametryczny, więc nie przejmuj się założeniami. Nie jestem pewien, czy to spełni twoje zadanie. Mogę powiedzieć, że istnieje wersja Losowego Lasu przeznaczona tylko do „wykrywania anomalii” zwanych lasami izolacyjnymi: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/... w R była implementacja, ale jestem nie jestem pewien, czy działa od teraz.
JEquihua

Odpowiedzi:


7

Ma roczek, ale nadal uważam, że jest to istotne, więc chciałem po prostu udostępnić moją implementację w Pythonie funkcji analizy głównych cech (PFA), jak zaproponowano w artykule, do którego Charles odniósł się w swojej odpowiedzi.

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

Możesz użyć tego w następujący sposób:

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_

Jest to ściśle zgodne z opisanym algorytmem z artykułu. Myślę, że ta metoda jest obiecująca, ale szczerze mówiąc nie sądzę, że jest to najbardziej niezawodne podejście do wyboru funkcji bez nadzoru. Opublikuję aktualizację, jeśli wymyślę coś lepszego.


W metodzie opisanej w artykule, do którego prowadzi łącze, krok 1 polega na obliczeniu macierzy kowariancji, a krok 2 polega na obliczeniu PCA na macierzy kowariancji z kroku 1. Uważam, że twoja fitfunkcja pomija krok 1 i wykonuje PCA na oryginalnym zbiorze danych .
user35581,

@ user35581 dobry punkt. Ich zadaniem jest jednak (1) wytworzenie macierzy kowariancji z pierwotnych danych, a następnie (2) obliczenie wektorów własnych i wartości własnych macierzy kowariancji przy użyciu metody SVD. Te dwa kroki łącznie nazywamy PCA. Podstawowymi składnikami są wektory własne macierzy kowariancji oryginalnych danych.
Ulf Aslak

@Ulf Aslak, czy możesz wyjaśnić, dlaczego uważasz, że nie jest to najbardziej niezawodne podejście do wyboru funkcji bez nadzoru?
hipoglucido

1
@hipoglucido szczerze mówiąc, nie mogę wytłumaczyć moich myśli, kiedy to napisałem. To trzy lata temu. Ponownie przeglądając kod, jestem przekonany, że ma to coś wspólnego z użyciem KMeans (co nie jest deterministyczne). Chciałbym również zobaczyć, jak to wygląda w porównaniu do klastrowania funkcji nieprzekształconych przez PCA.
Ulf Aslak




0

Istnieje wiele opcji dostępnych w R. Miłym miejscem do oglądania jest caretpakiet, który zapewnia ładny interfejs do wielu innych pakietów i opcji. Możesz zajrzeć na stronę tutaj . Istnieje wiele opcji, ale zilustruję jedną z nich.

Oto przykład użycia prostego filtra z wykorzystaniem wbudowanych Rzestawów danych „mtcars” (pokazanych poniżej).

                   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

Teraz niektóre ustawienia kodu (ładowanie pakietów itp.):

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

I możemy dopasować prosty model do wybierania zmiennych:

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

Przeglądając wyniki otrzymujemy:

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)

Na koniec możemy wykreślić wybrane zmienne (in fit1$optVariables) względem wyniku mpg:

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

Wynikający z tego wykresu: wykresy rozrzutu


1
Nie jest to nauka bez nadzoru, o którą prosił PO, ponieważ model jest używany mpgjako wynik. Czy istnieje sposób na użycie takich metod w modelach bez nadzoru?
Max Ghenis,

0

nsprcompPakiet R dostarcza sposoby rzadki Analiza głównych składowych, które mogą spełnić Twoje potrzeby.

Na przykład, jeśli uważasz, że twoje funkcje są zasadniczo skorelowane liniowo i chcesz wybrać pierwszą piątkę, możesz uruchomić rzadkie PCA z maksymalnie pięcioma funkcjami i ograniczyć do pierwszego głównego składnika:

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

Alternatywnie, jeśli chcesz uchwycić ortogonalny charakter funkcji, możesz wybrać najwyższą funkcję z każdego z pięciu najlepszych komputerów, ograniczając każdy komputer do jednej funkcji:

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

Przydałby się ich zestaw; tzn. funkcje, które konsekwentnie osiągają najwyższy poziom w różnych metodach, prawdopodobnie wyjaśnią dużą wariancję w przestrzeni cech. Po zabawie nsprcomptrochę wydaje się, że dwie pierwsze metody podnoszą ~ 1/2 tych samych funkcji na szczyt. To powiedziawszy, optymalizacja tego procesu może być wysiłkiem empirycznym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.