我在Kaggle上处理信用卡欺诈数据集(链接)时发现,如果我减少用于训练的数据集大小,我可以得到更好的模型。简单解释一下,这个数据集包含284807条记录,每条记录有31个特征。在这个数据集中,只有492个欺诈案例(仅占0.17%)。
我尝试对整个数据集进行PCA分析,只保留三个最重要的维度,以便能够展示结果。结果如下:
在这种情况下,无法找到模式来判断是否为欺诈。
如果我只减少非欺诈数据以提高欺诈与非欺诈的比例,使用相同的图表,我得到的结果如下:
现在,我不知道在减少的数据集上进行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)
感谢你的帮助,
回答:
这是有道理的,绝对是。
你使用的方法通常被称为随机欠采样,在机器学习中,当你处理不平衡数据问题(如你描述的)时,这种方法通常很有用。你可以在这个维基百科页面上了解更多信息。
当然,还有许多其他方法可以处理类别不平衡问题,但这种方法的优点是它非常简单,有时非常有效。