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.
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! –