减少数据集以获得更好的PCA分解是否是一种好的做法

我在Kaggle上处理信用卡欺诈数据集(链接)时发现,如果我减少用于训练的数据集大小,我可以得到更好的模型。简单解释一下,这个数据集包含284807条记录,每条记录有31个特征。在这个数据集中,只有492个欺诈案例(仅占0.17%)。

我尝试对整个数据集进行PCA分析,只保留三个最重要的维度,以便能够展示结果。结果如下:

完整数据集的PCA

在这种情况下,无法找到模式来判断是否为欺诈。

如果我只减少非欺诈数据以提高欺诈与非欺诈的比例,使用相同的图表,我得到的结果如下:

PCA_100000

PCA_10000

PCA_1000

现在,我不知道在减少的数据集上进行PCA分解以获得更好的结果是否有意义。例如,如果我使用100000个点的PCA,我们可以说所有PCA1大于5的条目都是欺诈。

如果你想尝试的话,以下是代码:

dataset = pd.read_csv("creditcard.csv")sample_size = 284807-492  # 在1和284807-492之间a = dataset[dataset["Class"] == 1]  # 始终保留所有欺诈b = dataset[dataset["Class"] == 0].sample(sample_size) # 减少非欺诈数量dataset = pd.concat([a, b]).sample(frac=1)  # 合并并打乱# 对特征进行缩放以进行PCAy = dataset["Class"]X = dataset.drop("Class", axis=1)X_scale = StandardScaler().fit_transform(X)# 对数据集进行PCA分析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], yplt.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)

感谢你的帮助,


回答:

这是有道理的,绝对是。

你使用的方法通常被称为随机欠采样,在机器学习中,当你处理不平衡数据问题(如你描述的)时,这种方法通常很有用。你可以在这个维基百科页面上了解更多信息。

当然,还有许多其他方法可以处理类别不平衡问题,但这种方法的优点是它非常简单,有时非常有效。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注