Methoden in R oder Python zur Funktionsauswahl beim unbeaufsichtigten Lernen [geschlossen]

11

Welche Methoden / Implementierungen stehen in R / Python zur Verfügung, um unwichtige / wichtige Funktionen in Daten zu verwerfen / auszuwählen? Meine Daten haben keine Etiketten (unbeaufsichtigt).

Die Daten haben ~ 100 Merkmale mit gemischten Typen. Einige sind numerisch, während andere binär sind (0/1).

Lerner
quelle
Welche Art von unbeaufsichtigtem Lernalgorithmus verwenden Sie? Wie sehen Ihre Daten aus?
Max Candocia
@ user1362215, Bevor ich einen unbeaufsichtigten Algorithmus anwende, versuche ich, einen Weg zu finden, um Features zu entfernen.
Lerner
Haben Sie dieses Scikit-Learn- Cheatsheet schon einmal gesehen? Es kann Ihnen helfen, loszulegen ...
Steve S
Warum nicht eine unbeaufsichtigte Methode verwenden, bei der Perfome die Auswahl selbst wie eine zufällige Gesamtstruktur im unbeaufsichtigten Modus aufweisen?
JEquihua
1
Ich bin nicht ganz sicher, ich meine, zufälliger Wald ist völlig nicht parametrisch, also mach dir keine Sorgen über Annahmen. Was ich nicht sicher bin, ist, ob es Ihren Zweck erfüllen wird. Was ich sagen kann ist, dass es eine Version von Random Forest nur zur "Erkennung von Anomalien" gibt, die Isolationswälder genannt wird: cs.nju.edu.cn/zhouzh/zhouzh.files/publication/… es gab eine Implementierung in R, aber ich bin es Ich bin mir nicht sicher, ob es ab sofort läuft.
JEquihua

Antworten:

6

Es ist ein Jahr alt, aber ich halte es immer noch für relevant. Deshalb wollte ich nur meine Python-Implementierung von Principal Feature Analysis (PFA) teilen, wie in dem Artikel vorgeschlagen, auf den Charles in seiner Antwort verwiesen hat.

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

Sie können es so verwenden:

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_

Dies folgt genau dem beschriebenen Artikel aus dem Artikel. Ich denke, die Methode ist vielversprechend, aber ehrlich gesagt denke ich nicht, dass dies der robusteste Ansatz für die unbeaufsichtigte Auswahl von Funktionen ist. Ich werde ein Update veröffentlichen, wenn ich etwas Besseres finde.

Ulf Aslak
quelle
Bei der in dem Artikel, auf den Sie verweisen, beschriebenen Methode wird in Schritt 1 die Kovarianzmatrix und in Schritt 2 die PCA in der Kovarianzmatrix aus Schritt 1 berechnet. Ich glaube, Ihre fitFunktion überspringt Schritt 1 und führt die PCA im Originaldatensatz durch .
user35581
@ user35581 guter Punkt. Sie erzeugen jedoch (1) die Kovarianzmatrix aus den Originaldaten und (2) berechnen dann Eigenvektoren und Eigenwerte der Kovarianzmatrix unter Verwendung der SVD-Methode. Diese beiden Schritte zusammen nennen Sie PCA. Die Hauptkomponenten sind die Eigenvektoren der Kovarianzmatrix der Originaldaten.
Ulf Aslak
@Ulf Aslak können Sie erläutern, warum dies Ihrer Meinung nach nicht der robusteste Ansatz für die unbeaufsichtigte Funktionsauswahl ist?
Hipoglucido
1
@hipoglucido ehrlich gesagt, ich kann meine Gedanken nicht erklären, als ich das schrieb. Es ist drei Jahre her. Wenn ich den Code noch einmal überprüfe, glaube ich, dass er etwas mit der Verwendung von KMeans zu tun hat (was nicht deterministisch ist). Außerdem würde ich gerne sehen, wie sich dies im Vergleich zum Clustering der nicht PCA-transformierten Funktionen verhält.
Ulf Aslak
1

Die Hauptmerkmalsanalyse scheint eine Lösung für die unbeaufsichtigte Merkmalsauswahl zu sein. Es ist in diesem Artikel beschrieben .

Max Ghenis
quelle
Link ist tot. Freigegebene Python-Implementierung der im Artikel stats.stackexchange.com/a/203978/76815 vorgeschlagenen Methode .
Ulf Aslak
Danke, ich habe den Link entfernt (er wurde als Off-Topic gelöscht).
Max Ghenis
0

Ich habe einen Link gefunden, der nützlich sein könnte. Dies sind Matlab-Implementierungen. Sie funktionieren möglicherweise für Sie. Http://www.cad.zju.edu.cn/home/dengcai/Data/MCFS.html Es handelt sich um eine Multicluster-Funktionsauswahl Methode, können Sie starke Grundlage darüber in den jüngsten Veröffentlichungen finden Lassen Sie mich wissen, ob es für Sie funktioniert

formacero10
quelle
0

Es gibt viele Optionen in R. Ein schöner Ort zum Anschauen ist das caretPaket, das eine schöne Schnittstelle zu vielen anderen Paketen und Optionen bietet. Sie können auf der Website einen Blick hier . Es gibt viele Möglichkeiten, aber ich werde eine veranschaulichen.

Hier ist ein Beispiel für die Verwendung eines einfachen Filters unter Verwendung der in R"mtcars" integrierten Datensätze (siehe unten).

                   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

Nun einige Code-Setups (Laden von Paketen usw.):

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

Und wir können ein einfaches Modell anpassen, um Variablen auszuwählen:

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

Wenn wir uns die Ergebnisse ansehen, erhalten wir:

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)

Schließlich können wir die ausgewählten Variablen (in fit1$optVariables) gegen das Ergebnis zeichnen mpg:

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

Ergebnis in dieser Grafik: Streudiagramme

Joshua
quelle
1
Dies ist kein unbeaufsichtigtes Lernen, wie es OP verlangt, da Ihr Modell mpgals Ergebnis verwendet wird. Gibt es eine Möglichkeit, solche Methoden in unbeaufsichtigten Modellen zu verwenden?
Max Ghenis
0

Das nsprcompR-Paket enthält Methoden für die Analyse spärlicher Hauptkomponenten, die Ihren Anforderungen entsprechen können.

Wenn Sie beispielsweise der Meinung sind, dass Ihre Features im Allgemeinen linear korreliert sind und die fünf besten auswählen möchten, können Sie eine PCA mit geringer Dichte mit maximal fünf Features ausführen und sich auf die erste Hauptkomponente beschränken:

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

Wenn Sie alternativ die orthogonale Natur von Features erfassen möchten, können Sie das Top-Feature aus jedem der fünf Top-PCs auswählen und jeden PC auf ein Feature beschränken:

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

Ein Ensemble davon könnte auch nützlich sein; Das heißt, Merkmale, die über verschiedene Methoden hinweg konsistent an die Spitze kommen, erklären wahrscheinlich eine große Varianz im Merkmalsraum. Nachdem wir nsprcompein bisschen herumgespielt haben, scheinen die ersten beiden Methoden ~ 1/2 der gleichen Funktionen nach oben zu bringen. Die Optimierung dieses Prozesses kann jedoch eine empirische Anstrengung sein.

Max Ghenis
quelle