减少数据集以获得更好的 PCA 分解是一种好习惯吗

Is it a good practice to reduce a dataset to have a better PCA decomposition

在 Kaggle (link) 上尝试处理信用卡欺诈数据集时,我发现如果我减少训练数据集的大小,我可以获得更好的模型。只是为了说明数据集由 31 个特征的 284807 条记录组成。在这个数据集中,只有 492 个欺诈(所以只有 0.17%)。

我已尝试对完整数据集进行 PCA 以仅保留 3 个最重要的维度以便能够显示它。结果如下:

在这件事中,不可能找到一种模式来确定它是否是欺诈。

如果我减少非欺诈的数据集只是为了增加比率(fraud/non_fraud),这就是我对相同情节的看法

现在,我不知道将 PCA 拟合到缩减的数据集上以进行更好的分解是否有意义。例如,如果我使用 100000 点的 PCA,我们可以说所有 PCA1 > 5 的条目都是欺诈。

如果你想尝试,这是代码:

dataset = pd.read_csv("creditcard.csv")
sample_size = 284807-492  # between 1 and 284807-492
a = dataset[dataset["Class"] == 1]  # always keep all frauds
b = dataset[dataset["Class"] == 0].sample(sample_size) # reduce non fraud qty

dataset = pd.concat([a, b]).sample(frac=1)  # concat with a shuffle

# Scaling of features for the PCA
y = dataset["Class"]
X = dataset.drop("Class", axis=1)
X_scale = StandardScaler().fit_transform(X)

# Doing PCA on the dataset
pca = PCA(n_components=3)
X_pca = pca.fit_transform(X_scale)

pca1, pca2, pca3, c = X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], y
plt.scatter(pca1, pca2, s=pca3, c=y)
plt.xlabel("PCA1")
plt.ylabel("PCA2")
plt.title("{}-points".format(sample_size))
# plt.savefig("{}-points".format(sample_size), dpi=600)

感谢您的帮助,

绝对有道理。

您使用的技术通常称为随机欠采样,在 ML 中,当您处理不平衡数据问题(例如您所描述的问题)时,它通常很有用。您可以在 Wikipedia page.

中看到更多相关信息

当然,还有许多其他方法可以处理 class 不平衡,但这个方法的美妙之处在于它非常简单,有时甚至非常有效。