在PCA之前使用哪种功能缩放方法?

时间:2016-05-14 01:10:58

标签: machine-learning scikit-learn

我正在研究Kaggle数据集:https://www.kaggle.com/c/santander-customer-satisfaction。我知道在PCA之前需要某种功能扩展。我从this postthis post读到标准化是最好的,但标准化给了我最高的性能(AUC-ROC)。

我尝试了sklearn的所有功能扩展方法,包括:RobustScaler(),Normalizer(),MinMaxScaler(),MaxAbsScaler()和StandardScaler()。然后使用缩放数据,我做了PCA。但事实证明,获得的PCA的最佳数量在这些方法之间差异很大。

这是我使用的代码:

# 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

这些是使用不同缩放器的不同数量的PCA。

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

所以,我的问题是,在这种情况下哪种方法适合功能扩展?谢谢!

2 个答案:

答案 0 :(得分:2)

计算PCA转换的数据应该标准化,这意味着:

  • 零均值
  • 单位差异

这基本上是sklearns StandardScaler,我更喜欢你的候选人。原因在Wikihere上进行了解释。

  • sklearns Normalizer缺少零均值
  • Min-Max缩放器都缺少单位方差
  • 强大的缩放器可以处理一些数据(异常值!),但我更喜欢StandardScaler。

答案 1 :(得分:1)

您需要对功能进行规范化,否则它们的差异将无法比较。考虑一个特征,其中方差是与范围的比率。范围越大,方差越大。您不希望PCA专注于范围较大的变量。

R代码说明由于范围

而导致的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

标准化后,我们看到与x和v相同的方差。