在PCA之前使用哪种特征缩放方法



我正在处理Kaggle数据集:https://www.kaggle.com/c/santander-customer-satisfaction.我知道在PCA之前需要某种特征缩放。我从这篇文章和这篇文章中读到,标准化是最好的,但正是标准化给了我最高的性能(AUC-ROC)。

我尝试了sklearn中的所有功能缩放方法,包括:RobustScaler()、Normalizer()、MinMaxScaler(()、MaxAbsScaler()和StandardScaler(。然后使用缩放后的数据,我做了主成分分析。但事实证明,在这些方法之间,获得的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
  • 规格化器:26
  • 最小最大缩放器:45
  • 最大AbsScaler:45
  • 标准缩放器:142

所以,我的问题是,在这种情况下,哪种方法是正确的特征缩放方法?谢谢

计算PCA变换的数据应该进行归一化,在这种情况下意味着:

  • 零均值
  • 单位方差

这基本上是sklearns StandardScaler,我更喜欢你的候选人。原因在维基和这里都有解释。

  • sklearns Normalizer缺少零均值
  • 两个最小-最大缩放器都缺少单位方差
  • 稳健的缩放器可以处理一些数据(异常值!),但我更喜欢StandardScaler

您需要规范化特征,否则它们的方差将不可比较。想象一个特征,其中方差是与范围的比率。范围越大,方差越大。您不希望主成分分析关注范围较大的变量。

R代码,说明由于量程引起的无功变化

> 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的方差相同。

相关内容

  • 没有找到相关文章