2016-05-14 1 views
0

Ich arbeite an einem Kaggle-Datensatz: https://www.kaggle.com/c/santander-customer-satisfaction. Ich verstehe, dass eine Art Feature-Skalierung vor PCA benötigt wird. Ich lese aus this post und this post, dass die Normalisierung am besten ist, aber es war Standardisierung, die mir die höchste Leistung (AUC-ROC) gab.Welche Skalierungsmethode soll vor PCA verwendet werden?

Ich habe alle Skalierungsmethoden von sklearn ausprobiert, einschließlich: RobustScaler(), Normalizer(), MinMaxScaler(), MaxAbsScaler() und StandardScaler(). Dann habe ich mit den skalierten Daten PCA gemacht. Aber es stellt sich heraus, dass die optimale Anzahl an PCA's zwischen diesen Methoden sehr unterschiedlich ist.

Hier ist der Code, den ich verwenden:

# Standardize the data 
scaler = StandardScaler() 
X_train_scaled = scaler.fit_transform(X_train) 

# Find the optimal number of PCA 
pca = PCA(n_components=X_train_scaled.shape[1]) 
pca.fit(X_train_scaled) 
ratios = pca.explained_variance_ratio_ 

# Plot the explained variance ratios 
x = np.arange(X_train_scaled.shape[1]) 
plt.plot(x, np.cumsum(ratios), '-o') 
plt.xlabel("Number of PCA's") 
plt.ylabel("Cumulated Sum of Explained Variance") 
plt.title("Variance Explained by PCA's") 

# Find the optimal number of PCA's 
for i in range(np.cumsum(ratios).shape[0]): 
    if np.cumsum(ratios)[i] >= 0.99: 
    num_pca = i + 1 
    print "The optimal number of PCA's is: {}".format(num_pca) 
    break 
    else: 
    continue 

Dies sind die unterschiedliche Anzahl von PCA sind ich verschiedene Scaler mit bekam.

  • RobustScaler: 9
  • Normalizer: 26
  • MinMaxScaler: 45
  • MaxAbsScaler: 45
  • StandardScaler: 142

Also, meine Frage ist, welche Methode ist die richtige eine für Feature-Skalierung in dieser Situation? Vielen Dank!

Antwort

1

Daten, auf denen die PCA-Transformation berechnet wird, normalisiert werden sollen, in diesem Fall bedeutet:

  • Null
  • Varianz
  • bedeuten 0

Dies ist im Grunde Sklearns StandardScaler, die ich von Ihren Kandidaten bevorzugen würde. Die Gründe sind unter Wiki und auch here erläutert.

  • sklearns Normalizer fehlt Mittelwert von Null
  • Beide Min-Max-Scaler-Einheit-Varianz
  • Robuste Scaler fehlen auf einigen Daten (Ausreißer!) Funktionieren könnte, aber ich würde es vorziehen, StandardScaler.
+0

Ich habe es. Danke @sascha! –

1

Sie müssen die Features normalisieren oder ihre Varianzen sind nicht vergleichbar. Stellen Sie sich eine Funktion vor, bei der die Varianz ein Verhältnis zur Reichweite ist. Ein größerer Bereich erzeugt eine größere Varianz. Sie möchten nicht, dass sich der PCA auf Variablen mit größeren Bereichen konzentriert.

R Code darstellt Änderung aufgrund in var

> v=runif(100) 
> x=v/4 # change only the range 
> var(x) 
[1] 0.004894443 
> var(v) 
[1] 0.07831109 
> var(x/sum(x)) 
[1] 3.169311e-05 
> var(v/sum(v)) 
[1] 3.169311e-05 

Nach Normalisieren reichen, wir die gleiche Varianz mit x sehen und v.