减少数据集以获得更好的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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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