我正在处理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的方差相同。