我正在研究Kaggle数据集:https://www.kaggle.com/c/santander-customer-satisfaction。我知道在PCA之前需要某种功能扩展。我从this post和this 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。
所以,我的问题是,在这种情况下哪种方法适合功能扩展?谢谢!
答案 0 :(得分:2)
计算PCA转换的数据应该标准化,这意味着:
这基本上是sklearns StandardScaler
,我更喜欢你的候选人。原因在Wiki和here上进行了解释。
答案 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相同的方差。