在尝试使用Kaggle(link)上的信用卡欺诈数据集时,我发现如果我减少培训数据集的大小,我可以拥有更好的模型。只是为了解释数据集是由284807个记录的31个特征组成的。在这个数据集中,只有492个欺诈(因此只有0.17%)。
我尝试在完整数据集上执行PCA,以便只保留3个最重要的维度才能显示它。结果如下:
在这一个中,找不到一种模式来确定它是否是欺诈是不可能的。
如果我减少非欺诈的数据集只是为了增加比率(欺诈/非欺诈),这就是我对同一情节的看法
现在,我不知道在减少的数据集上安装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)
感谢您的帮助,
答案 0 :(得分:4)
绝对有道理。
您正在使用的技术通常称为随机欠采样,而在ML中,当您处理不平衡的数据问题(例如您所描述的问题)时,它通常很有用。您可以在Wikipedia page找到更多相关信息。
当然,还有很多其他的方法来处理类不平衡,但这个方法的优点在于它非常简单,有时甚至非常有效。