2016-09-26 5 views
0

Im Programm scanne ich alle 2,5 Sekunden eine Anzahl von Gehirnproben, die in einer Zeitreihe von 40 x 64 x 64 Bildern aufgenommen wurden. Die Anzahl der "Voxel" (3D-Pixel) in jedem Bild beträgt somit ~ 168.000 ish (40 × 64 × 64), von denen jedes ein "Merkmal" für ein Bildmuster ist.Wie verwende ich PCA korrekt, gefolgt von logistischer Regression?

Ich dachte an die Verwendung von Principle Component Analysis (PCA) wegen der redlich hohen n zur Verringerung der Dimensionalität. Mir ist bewusst, dass PCA die Anzahl der Features nicht reduziert. Korrigieren Sie mich, wenn ich falsch liege, aber PCA wird eine neue Reihe von Funktionen von den ursprünglichen erzeugen. Die neuen Funktionen müssen jedoch bestimmten Bedingungen entsprechen.

definined ich eine Methode die Anzahl der Komponenten zu erhalten:

def get_optimal_number_of_components(): 
    cov = np.dot(X,X.transpose())/float(X.shape[0]) 
    U,s,v = svd(cov) 

    S_nn = sum(s) 

    for num_components in range(0,s.shape[0]): 
     temp_s = s[0:num_components] 
     S_ii = sum(temp_s) 
     if (1 - S_ii/float(S_nn)) <= 0.01: 
      return num_components 

    return s.shape[0] 

Diese Funktion gibt die Anzahl der Komponenten zurück, so dass 99% der Abweichung von den ursprünglichen Daten zurückgehalten wird. Nun können wir diese Komponenten erstellen:

Ich bekomme die optimale Anzahl von Komponenten = 1001 beim Ausführen des Programms auf diesem Dataset. Diese Zahl stimmt mit der Handlung mich auf der Ausführung erhalten:

#Cumulative Variance explains 
var1 = np.cumsum(np.round(pca.explained_variance_ratio_, decimals=4)*100) 

plt.plot(var1) 
plt.title('Principle Component Analysis for Feature Selection') 
plt.ylabel('Percentage of variance') 
plt.xlabel('Number of voxels considered') 

plt.show() 

Danach PCA abgeschlossen ist Bühne, ich die neu geschaffenen ‚X_new‘ verwenden anstelle von X für die nächste Stufe: logistische Regression

#After PCA 
from sklearn.cross_validation import train_test_split 
X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.10, random_state=42) 

classifier = LogisticRegression() 
classifier.fit(X_train,y_train) 

wenn ich für die Richtigkeit prüfen, erhalte ich um 77,57%

Aber das ist weniger, als wenn ich analysiert nur die mittleren Voxel Proben (wie 9K Proben in der Mitte des Gehirns Bild). Ich habe mich gefragt, ob ich die PCA und die logistische Regression richtig pipelinete.

Ich habe sogar versucht, diese in einem anderen Verfahren unter Verwendung von sklearn.pipeline:

pipe = Pipeline(steps=[('pca', pca), ('logistic', classifier)]) 

pipe.set_params(pca__n_components = n_comp).fit(X_train,y_train) 

print 'score = ', pipe.score(X_test,y_test) 

Aber ich habe genau die gleiche Genauigkeit von 77,57%. Wird die PCA + Logistische Regression korrekt implementiert? Es muss etwas falsch sein, ich kann einfach nicht herausfinden, was es ist.

Antwort

1

Während ich nicht sofort einen Fehler finden kann, sollten Sie versuchen zu testen, wie sich der Fehler verhält, wenn Sie die number of components erhöhen. Vielleicht fehlen Informationen über die geringe Varianz, um der logistischen Regression die benötigte Kante zu geben?

Die 99% in PCA sind mehr eine Richtlinie als Tatsache.

Andere Dinge, die Sie versuchen könnten: Anstelle von PCA entfernen Sie einfach alle Funktionen mit null (oder sehr niedrig) Varianz. DTI-Daten haben oft Merkmale, die sich niemals ändern, und sind daher für die Klassifizierung völlig unnötig.

Versuchen Sie, Merkmale zu finden, die stark mit Ihrem Ergebnis korrelieren, und versuchen Sie nur, diese zu klassifizieren.

Immer vorsichtig sein nicht überfüllen!

Korrigieren Sie mich, wenn ich falsch liege, aber PCA wird eine neue Reihe von Features von den ursprünglichen produzieren.

Ich werde versuchen, es so untechnischen zu beschreiben wie möglich

Ja. PCA ist im Grunde eine Phantasie axis transformation. Ja, Sie erhalten eine neue Reihe von Funktionen, aber diese sind lineare Kombinationen der vorherigen Funktionen in einer geordneten Weise, so dass das erste Merkmal so viel wie möglich der Daten beschreibt.

Die Idee ist, dass, wenn Sie eine Hyperebene haben, PCA tatsächlich die Hyperebene auf die ersten Achsen projiziert und die letzten fast leer lassen.

PCA ist linear Dimensionalitätsreduktion, wenn also die wahre Datenverteilung nicht linear ist, gibt es schlechtere Ergebnisse.

Auch ein Freund von mir arbeitete mit Brain-Daten ähnlich wie Ihre (viele Features, sehr kleine Beispiele) und PCA fast nie geholfen. Es kann sein, dass die wesentlichen Informationen nicht gefunden werden, weil zu viel "Rauschen" vorhanden ist.

EDIT: Typo

+0

Ich denke, Sie treffen den Nagel auf den Kopf. Ich fügte einen zusätzlichen Schritt ein, bevor ich PCA ausführte. Es war, die besten Eigenschaften auszuwählen. Ich habe 'sklearn.feature_selection' dazu benutzt. Es stellt sich heraus, dass nach der Auswahl von 20.000 Voxeln als Merkmale die Genauigkeit abnimmt. Mit k = 20.000 erhalte ich jetzt eine Genauigkeit von 92%! Der beste Teil ist, das Programm ist verdammt schnell wegen PCA. Danke vielmals! –

Verwandte Themen